先把这个XP下所谓的万能断点的十六进制表示贴出来:F3 A5 8B C8 83 E1 03 F3 A4 E8
今天我们来用这个所谓的万能断点来追踪一款VB程序的注册码,注意这个CM有两道难关,今天我们先来攻克1.0这道难题!
老规矩,PEID检测,结果是”Microsoft Visual Basic 5.0 / 6.0“,OD载入证明确实未加壳!载入完毕之后直接F9,让程序跑起来。在CM的窗口下拉菜单中选择”CrackMe 1.0“,之后输入注册码并且记住,下面会用到,注意输完之后不要点击”Try"!然后回到OD界面,右键查看——模块USER32,继续右键查找——二进制字符串,OD回弹出一个窗口,在HEX +00那一栏的文本框中输入上面我贴出的的代码,之后按确定,来到OD的CPU窗口,代码如下:
77D3353B /72 02 jb short 77D3353F
77D3353D |8BD8 mov ebx, eax
77D3353F \F646 62 40 test byte ptr [esi+62], 40
77D33543 8B7D 10 mov edi, dword ptr [ebp+10]
77D33546 0F84 5B310000 je 77D366A7
77D3354C 880C3B mov byte ptr [ebx+edi], cl
77D3354F 56 push esi
77D33550 E8 A8FBFFFF call 77D330FD
77D33555 0FB74E 6A movzx ecx, word ptr [esi+6A]
77D33559 0FAFCB imul ecx, ebx
77D3355C FF75 08 push dword ptr [ebp+8]
77D3355F 8BF0 mov esi, eax
77D33561 8BC1 mov eax, ecx
77D33563 C1E9 02 shr ecx, 2
77D33566 F3:A5 rep movs dword ptr es:[edi], dword p>
77D33568 8BC8 mov ecx, eax
77D3356A 83E1 03 and ecx, 3
77D3356D F3:A4 rep movs byte ptr es:[edi], byte ptr>
77D3356F E8 E3FBFFFF call 77D33157
77D33574 5F pop edi
77D33575 5E pop esi
77D33576 8BC3 mov eax, ebx
77D33578 5B pop ebx
77D33579 5D pop ebp
77D3357A C2 1000 retn 10
77D3357D 05 77FEFFFF add eax, -189
77D33582 83F8 08 cmp eax, 8
77D33585 0F87 6FB10000 ja 77D3E6FA
这时候光标是停留在 77D33566 F3:A5 rep movs dword ptr es:[edi], dword p> 这一行,所以呢,F2下断,下来回到CM窗口,按下“Try",程序成功断下,回到OD窗口,注意看寄存器窗口,会看到你输入的注册码出现在一个寄存器里,下来在出现你输入注册码的寄存器的下一个寄存器里,比如你输入的注册码出现在ESI ,那么你就应该在EDI那个寄存器上面,右键数据窗口跟随,现在看OD窗口的左下方,也就是数据窗口,选中第一个字节,右键断点——内存访问,做完之后现在把注意力放到反汇编窗口,一边一步一步按F8,同时密切关注堆栈窗口的变化,N下F8之后,堆栈窗口中会出现你输入的注册码与”7691824“这个字符串,其实这个7691824就是注册码,赶紧试试,果然不错,程序提示注册成功了,说明我们已经追踪出这个CM的注册码了,就到这里吧!
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)