将crackme拖入od,F9发现有反调试,启动StrongOD过掉放调试。
在GetWindowTextW 处下断点,发现启动新线程,如下:
00402763 . 6A 00 push 0
00402765 . 57 push edi
00402766 . 68 00214000 push 00402100
0040276B > 6A 00 push 0 ; |StackSize = 0
0040276D . 6A 00 push 0 ; |pSecurity = NULL
0040276F . FF15 74804100 call dword ptr [<&KERNEL32.CreateThre>; \CreateThread
00402775 > 8B4D FC mov ecx, dword ptr [ebp-4] ; Case 68 of switch 00402296
00402778 . 33C0 xor eax, eax
线程入口处下断
004020E0 /. 55 push ebp
004020E1 |. 8BEC mov ebp, esp
004020E3 |. 8B4D 08 mov ecx, dword ptr [ebp+8]
004020E6 |. 33D2 xor edx, edx
004020E8 |. E8 C3FBFFFF call 00401CB0
004020ED |. 6A 14 push 14
004020EF |. FF75 08 push dword ptr [ebp+8]
004020F2 |. E8 ED0B0000 call 00402CE4
004020F7 |. 83C4 08 add esp, 8
004020FA |. 33C0 xor eax, eax
004020FC |. 5D pop ebp
004020FD \. C2 0400 retn 4
注册码长度必须为7个字符
00401DD7 . /7F 65 jg short 00401E3E
00401DD9 . |8D85 34FFFFFF lea eax, dword ptr [ebp-CC]
00401DDF . |50 push eax
00401DE0 . |53 push ebx
00401DE1 . |E8 8A0A0000 call <strcpy>
00401DE6 . |83FE 07 cmp esi, 7
00401DE9 . |73 0B jnb short 00401DF6
第3到第6个字符必须为15pb
004019F1 C745 F0 31003>mov dword ptr [ebp-10], 350031
004019F8 C745 F4 50004>mov dword ptr [ebp-C], 00420050
004019FF 8D77 04 lea esi, dword ptr [edi+4]
00401A02 66:8945 F8 mov word ptr [ebp-8], ax
00401A06 33C9 xor ecx, ecx
00401A08 0F1F ??? ; 未知命令
00401A0A 8400 test byte ptr [eax], al
00401A0C 0000 add byte ptr [eax], al
00401A0E 0000 add byte ptr [eax], al
00401A10 > 66:8B444D F0 mov ax, word ptr [ebp+ecx*2-10]
00401A15 . 66:3B06 cmp ax, word ptr [esi]
00401A18 . 75 1F jnz short 00401A39
00401A1A . 41 inc ecx
00401A1B . 83C6 02 add esi, 2
00401A1E . 83F9 04 cmp ecx, 4
00401A21 .^ 72 ED jb short 00401A10
00401A23 . 8BD7 mov edx, edi
比较前两个字符是否为12
00401810 > /66:8B01 mov ax, word ptr [ecx]
00401813 . |66:3B040E cmp ax, word ptr [esi+ecx]
00401817 . |75 42 jnz short 0040185B
00401819 . |83C2 06 add edx, 6
0040181C . |83C1 02 add ecx, 2
0040181F . |83FA 39 cmp edx, 39
00401822 .^\7E EC jle short 00401810
这里第一个字符+xx必须为63,xx为63-(yy),yy为第二个字符,这个yy可能跟次数有关,每次从第二位开始每次移动一个字符。且满足'1'+yy=0x63,所以 前两个字符为12就可以了。
00401824 . 0FB74F 12 movzx ecx, word ptr [edi+12]
00401828 . 0FB703 movzx eax, word ptr [ebx]
0040182B . 03C8 add ecx, eax
0040182D . 83F9 63 cmp ecx, 63
00401830 . 75 29 jnz short 0040185B
计算最后一个字符,需要‘7’+ 次数 = 最后一位,当次数为1时,最后一位为'8'
00401832 . 8B45 B4 mov eax, dword ptr [ebp-4C]
00401835 . 0FB74F 0C movzx ecx, word ptr [edi+C]
00401839 . 0308 add ecx, dword ptr [eax]
0040183B . 8B45 B0 mov eax, dword ptr [ebp-50]
0040183E . 0FB700 movzx eax, word ptr [eax]
00401841 . 3BC1 cmp eax, ecx
00401843 . 75 16 jnz short 0040185B
00401845 . 5F pop edi
00401846 . 5E pop esi
00401847 . B8 01000000 mov eax, 1
经过以上分析得出注册码为 1215pb8 ,由于次数参与运算,所以如果第一次没输入正确的注册码,那么以后无论输入什么都不会正确。
[峰会]看雪.第八届安全开发者峰会10月23日上海龙之梦大酒店举办!