主要的部分都找全了,但还是弄不好呢。
这里openprocess一直失败,下面还建立了远程线程,但是我这里都失败了,是不是还有什么反调试的东西?
004012A4 |. 8B8D CCFEFFFF mov ecx, dword ptr [ebp-134]
004012AA |. 51 push ecx ; /ProcessId
004012AB |. 6A 00 push 0 ; |Inheritable = FALSE
004012AD |. 68 FF0F1F00 push 1F0FFF ; |Access = PROCESS_ALL_ACCESS
004012B2 |. FF15 18204000 call dword ptr [<&KERNEL32.OpenProces>;
然后,下面先对输入数据进行初步检查,之后应该又把数据传给远程线程了吧?这里看出了两种错误跳转 1.长度限制;2.只能是数字串。然后如果输入数字段在这里在F9运行时不会出现错误提示的,但是不加调试器运行输入数字会出现错误提示。所以猜测在远程线程里应该也有发回来的消息,并且openprocess不成功是有反调试吧!
00401956 . E8 09030000 call <jmp.&MFC42.#CWnd::UpdateData_63>; 获取数据
0040195B . 8B7E 60 mov edi, dword ptr [esi+60] ; 字符串
0040195E . 8B57 F8 mov edx, dword ptr [edi-8] ; 长度
00401961 . 83FA 03 cmp edx, 3
00401964 . 0F8C B2000000 jl 00401A1C ; 小于3个跳转
0040196A . 83FA 31 cmp edx, 31
0040196D . 0F8F A9000000 jg 00401A1C ; 大于31个跳转
00401973 . 33C9 xor ecx, ecx
00401975 . 85D2 test edx, edx ; 为0跳转
00401977 . 7E 14 jle short 0040198D
00401979 > 8A040F mov al, byte ptr [edi+ecx] ; do
0040197C . 3C 30 cmp al, 30
0040197E . 0F8C 82000000 jl 00401A06 ; 小于‘0’跳转
00401984 . 3C 39 cmp al, 39
00401986 . 7F 7E jg short 00401A06 ; 大于‘9’跳转
00401988 . 41 inc ecx
00401989 . 3BCA cmp ecx, edx
0040198B .^ 7C EC jl short 00401979 ; while 只能是数字
0040198D > 53 push ebx
0040198E . 55 push ebp
0040198F . E8 94020000 call <jmp.&MFC42.#AfxGetModuleState_1>; 获得模块版本?
00401994 . 8B50 04 mov edx, dword ptr [eax+4]
00401997 . 83C9 FF or ecx, FFFFFFFF
0040199A . 33C0 xor eax, eax
0040199C . F2:AE repne scas byte ptr es:[edi]
0040199E . F7D1 not ecx ; 取字符串长+1
004019A0 . 2BF9 sub edi, ecx
004019A2 . 8BC1 mov eax, ecx
004019A4 . 8BF7 mov esi, edi
004019A6 . 8BBA D8000000 mov edi, dword ptr [edx+D8] ; 取上次字符串
004019AC . C1E9 02 shr ecx, 2
004019AF . F3:A5 rep movs dword ptr es:[edi], dword p>; 这次字符+\0写入
…………………………………………
004019D5 . 8B8E C8000000 mov ecx, dword ptr [esi+C8] ; ecx参数
004019DB . 8B97 CC000000 mov edx, dword ptr [edi+CC] ; edx函数
004019E1 . 8B68 04 mov ebp, dword ptr [eax+4]
004019E4 . 8B83 DC000000 mov eax, dword ptr [ebx+DC] ; eax进程
根据openprocess那里找到了写入远程线程的buffer,第一句的push指令在OD里面只有刚跳转过去时能看到,如果查看上面的代码,这句就变成了别的代码,这是花指令么? 这里的代码还没看完,静态分析还有不太明白的,这个远程线程开始启动之后寄存器的状态是什么样的? 他用到了ebx,esi,edi作为变量在下面通过他们的寻址找到了一些函数。这里不太明白呢。
003B38B0 55 push ebp
003B38B1 8BEC mov ebp, esp
003B38B3 83EC 18 sub esp, 18 分配DWORD*6
003B38B6 53 push ebx
003B38B7 56 push esi
003B38B8 57 push edi push*3
003B38B9 C745 FC 0000000>mov dword ptr [ebp-4], 0
003B38C0 C745 F8 0000000>mov dword ptr [ebp-8], 0
003B38C7 C745 F4 0000000>mov dword ptr [ebp-C], 0
003B38CE C745 F0 0000000>mov dword ptr [ebp-10], 0
003B38D5 C745 E8 0000000>mov dword ptr [ebp-18], 0
003B38DC 8B45 08 mov eax, dword ptr [ebp+8]
003B38DF 8945 EC mov dword ptr [ebp-14], eax
003B38E2 8B4D EC mov ecx, dword ptr [ebp-14]
003B38E5 C741 04 0000000>mov dword ptr [ecx+4], 0
003B38EC 8B55 EC mov edx, dword ptr [ebp-14]
003B38EF 8B02 mov eax, dword ptr [edx]
003B38F1 50 push eax
003B38F2 6A 00 push 0
003B38F4 6A 04 push 4
003B38F6 8B4D EC mov ecx, dword ptr [ebp-14]
003B38F9 FF51 0C call dword ptr [ecx+C]
………………………………
003B3A3F 8B55 EC mov edx, dword ptr [ebp-14]
003B3A42 8B42 08 mov eax, dword ptr [edx+8]
003B3A45 50 push eax
003B3A46 8B4D EC mov ecx, dword ptr [ebp-14]
003B3A49 FF51 18 call dword ptr [ecx+18]
003B3A4C 33C0 xor eax, eax
003B3A4E 5F pop edi
003B3A4F 5E pop esi
003B3A50 5B pop ebx
003B3A51 8BE5 mov esp, ebp
003B3A53 5D pop ebp
003B3A54 C2 0400 retn 4
最后这里是失败与成功的两个对话框,把失败那里的push改成跳转到成功就…… 这算是暴力破解吧
00401790 . 6A 00 push 0 ; 成功
00401792 . 6A 00 push 0
00401794 . 68 4C304000 push 0040304C
00401799 . E8 A8040000 call <jmp.&MFC42.#CWnd::MessageBoxA_4>
…………………………
004017B0 6A 00 push 0 ; 失败
004017B2 . 6A 00 push 0
004017B4 . 68 64304000 push 00403064
004017B9 . E8 88040000 call <jmp.&MFC42.#CWnd::MessageBoxA_4>
最后总结:通过这些天的努力,又晋升正式会员后第一次分析crackme,感觉这个还是很有难度,还有很多不懂得东西,要努力学习啊!