CrackMe提供者:random
原帖:
http://bbs.pediy.com/showthread.php?t=8985
工具:od
平台:winxpsp3
这个程序有的麻烦。程序使用了一个不知名的框架,给函数定位增加了难度。本程序我没有分析透彻,所以只能简要说明一下,希望对初学者有帮助。
点击注册按钮,程序给出提示,按照要求随意输入注册码。再点击注册按钮。注册按钮响应函数入口如下:
00405CA0 . 6A FF push -1
00405CA2 . 68 90CC4100 push 0041CC90 ; SE 处理程序安装
00405CA7 . 64:A1 0000000>mov eax, dword ptr fs:[0]
00405CAD . 50 push eax
00405CAE . 64:8925 00000>mov dword ptr fs:[0], esp
00405CB5 . 83EC 48 sub esp, 48
00405CB8 . 55 push ebp
00405CB9 . 56 push esi
00405CBA . 33C0 xor eax, eax
00405CBC . 57 push edi
00405CBD . 8BF9 mov edi, ecx
00405CBF . 894424 14 mov dword ptr [esp+14], eax
00405CC3 . 894424 18 mov dword ptr [esp+18], eax
00405CC7 . 33C9 xor ecx, ecx
00405CC9 . 884424 1C mov byte ptr [esp+1C], al
00405CCD . 894C24 20 mov dword ptr [esp+20], ecx
00405CD1 . 894424 38 mov dword ptr [esp+38], eax
00405CD5 . 894C24 24 mov dword ptr [esp+24], ecx
00405CD9 . 33D2 xor edx, edx
00405CDB . 894424 3C mov dword ptr [esp+3C], eax
00405CDF . 8B35 D0E34100 mov esi, dword ptr [<&USER32.SendMessageA>] ; USER32.SendMessageA
00405CE5 . 884C24 28 mov byte ptr [esp+28], cl
00405CE9 . 895424 2C mov dword ptr [esp+2C], edx
00405CED . 884424 40 mov byte ptr [esp+40], al
00405CF1 . 8B47 3C mov eax, dword ptr [edi+3C]
00405CF4 . 8D4C24 14 lea ecx, dword ptr [esp+14]
00405CF8 . 895424 30 mov dword ptr [esp+30], edx
00405CFC . BD 08000000 mov ebp, 8
00405D01 . 51 push ecx ; /lParam
00405D02 . 885424 38 mov byte ptr [esp+38], dl ; |
00405D06 . 66:896C24 18 mov word ptr [esp+18], bp ; |
00405D0B . 52 push edx ; |wParam => 0
00405D0C . 8B50 1C mov edx, dword ptr [eax+1C] ; |
00405D0F . 68 C4000000 push 0C4 ; |Message = EM_GETLINE
00405D14 . 52 push edx ; |hWnd
00405D15 . FFD6 call esi ; \SendMessageA
该函数使用SendMessage获取用户输入,然后对输入的字符进行检查,符合要求后保存用户输入到文件serial.txt,当时不验证而是重起验证。
既然输入保存到了文件里,我们就可以对CreateFile函数下断来定位验证函数。结果发现
00405358 |. 53 push ebx
00405359 |. 53 push ebx
0040535A |. 68 885B4200 push 00425B88 ; ASCII "serial.txt"
0040535F |. 8D4C24 1C lea ecx, dword ptr [esp+1C]
00405363 |. C64424 34 01 mov byte ptr [esp+34], 1
00405368 |. E8 7C2C0100 call 00417FE9 ; 打开文件读
0040536D |. 85C0 test eax, eax
0040536F |. 74 19 je short 0040538A
00405371 |. 6A 20 push 20
00405373 |. 68 44A24200 push 0042A244
00405378 |. 8D4C24 18 lea ecx, dword ptr [esp+18]
0040537C |. E8 852D0100 call 00418106 ; 读文件数据
00405381 |. 8D4C24 10 lea ecx, dword ptr [esp+10]
00405385 |. E8 7A2E0100 call 00418204 ; 关闭文件
程序打开文件读取输入之后并没有比较动作,继续回推,发现一处貌似程序验证处,
004068B7 . BF 44A24200 mov edi, 0042A244 ; ASCII "DJW12345DJW23456DJW34567DJW45678"
004068BC . 83C9 FF or ecx, FFFFFFFF
004068BF . 33C0 xor eax, eax
004068C1 . 33D2 xor edx, edx
004068C3 . F2:AE repne scas byte ptr es:[edi]
004068C5 . F7D1 not ecx
004068C7 . 49 dec ecx
004068C8 . 83F9 20 cmp ecx, 20
在这里我们发现输入的注册码,然而这个函数非常繁琐,看得头大。最终费尽九牛二虎之力找到验证函数,
00404FFA > \8B4424 10 mov eax, dword ptr [esp+10]
00404FFE . 85C0 test eax, eax
00405000 . 0F85 CB000000 jnz 004050D1 ;此处爆破
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)