第2个练习CrackMe。
系统:Windows 7 SP1 x64 ultimate
工具:PEiD、OllyDbg
拖入PEiD查壳,无壳,而且是VB写的。
运行程序。
用户名输入、序列号输入。
随意输入,看错误提示。
错误字符串You Get Wrong \n Try Again
。
载入OD,搜索字符串便可以看到错误提示。
双击定位,在该地址上面还可以看到You Get It
,看意思是正确的意思。
00402588 . 8945 B4 mov dword ptr ss:[ebp-0x4C],eax ; kernel32.BaseThreadInitThunk 0040258B . 74 58 je short Afkayas_.004025E5 0040258D . 68 801B4000 push Afkayas_.00401B80 ; You Get It 00402592 . 68 9C1B4000 push Afkayas_.00401B9C ; \r\n 00402597 . FFD7 call edi 00402599 . 8BD0 mov edx,eax ; kernel32.BaseThreadInitThunk 0040259B . 8D4D E8 lea ecx,dword ptr ss:[ebp-0x18] 0040259E . FFD3 call ebx 004025A0 . 50 push eax ; kernel32.BaseThreadInitThunk 004025A1 . 68 A81B4000 push Afkayas_.00401BA8 ; KeyGen It Now 004025A6 . FFD7 call edi 004025A8 . 8D4D 94 lea ecx,dword ptr ss:[ebp-0x6C] 004025AB . 8945 CC mov dword ptr ss:[ebp-0x34],eax ; kernel32.BaseThreadInitThunk 004025AE . 8D55 A4 lea edx,dword ptr ss:[ebp-0x5C] 004025B1 . 51 push ecx 004025B2 . 8D45 B4 lea eax,dword ptr ss:[ebp-0x4C] 004025B5 . 52 push edx ; Afkayas_.<ModuleEntryPoint> 004025B6 . 50 push eax ; kernel32.BaseThreadInitThunk 004025B7 . 8D4D C4 lea ecx,dword ptr ss:[ebp-0x3C] 004025BA . 6A 00 push 0x0 004025BC . 51 push ecx 004025BD . C745 C4 08000>mov dword ptr ss:[ebp-0x3C],0x8 004025C4 . FF15 10414000 call dword ptr ds:[<&MSVBVM50.#rtcMsgBox>; msvbvm50.rtcMsgBox 004025CA . 8D4D E8 lea ecx,dword ptr ss:[ebp-0x18] 004025CD . FF15 80414000 call dword ptr ds:[<&MSVBVM50.__vbaFreeS>; msvbvm50.__vbaFreeStr 004025D3 . 8D55 94 lea edx,dword ptr ss:[ebp-0x6C] 004025D6 . 8D45 A4 lea eax,dword ptr ss:[ebp-0x5C] 004025D9 . 52 push edx ; Afkayas_.<ModuleEntryPoint> 004025DA . 8D4D B4 lea ecx,dword ptr ss:[ebp-0x4C] 004025DD . 50 push eax ; kernel32.BaseThreadInitThunk 004025DE . 8D55 C4 lea edx,dword ptr ss:[ebp-0x3C] 004025E1 . 51 push ecx 004025E2 . 52 push edx ; Afkayas_.<ModuleEntryPoint> 004025E3 . EB 56 jmp short Afkayas_.0040263B 004025E5 > 68 C81B4000 push Afkayas_.00401BC8 ; You Get Wrong 004025EA . 68 9C1B4000 push Afkayas_.00401B9C ; \r\n 004025EF . FFD7 call edi
那么je就是我们要找的跳转指令了。
然后就要找影响标志的指令了。
向上翻,可以看到test指令,就是它没错了。
00402569 . 83C4 0C add esp,0xC 0040256C . B9 04000280 mov ecx,0x80020004 00402571 . B8 0A000000 mov eax,0xA 00402576 . 894D 9C mov dword ptr ss:[ebp-0x64],ecx 00402579 . 66:85F6 test si,si 0040257C . 8945 94 mov dword ptr ss:[ebp-0x6C],eax ; kernel32.BaseThreadInitThunk 0040257F . 894D AC mov dword ptr ss:[ebp-0x54],ecx 00402582 . 8945 A4 mov dword ptr ss:[ebp-0x5C],eax ; kernel32.BaseThreadInitThunk 00402585 . 894D BC mov dword ptr ss:[ebp-0x44],ecx 00402588 . 8945 B4 mov dword ptr ss:[ebp-0x4C],eax ; kernel32.BaseThreadInitThunk 0040258B . 74 58 je short Afkayas_.004025E5 0040258D . 68 801B4000 push Afkayas_.00401B80 ; You Get It 00402592 . 68 9C1B4000 push Afkayas_.00401B9C ; \r\n 00402597 . FFD7 call edi
既然操作数是esi,那就需要看哪里修改了esi的值。
继续向上找,竟然发现了vbaStrCmp
函数,跳转指令最近的比较指令,那就没跑了。
00402508 . 56 push esi 00402509 . 50 push eax 0040250A . FF15 04414000 call dword ptr ds:[<&MSVBVM50.__vbaHresu>; msvbvm50.__vbaHresultCheckObj 00402510 > 8B45 E8 mov eax,dword ptr ss:[ebp-0x18] 00402513 . 8B4D E4 mov ecx,dword ptr ss:[ebp-0x1C] 00402516 . 8B3D 00414000 mov edi,dword ptr ds:[<&MSVBVM50.__vbaSt>; msvbvm50.__vbaStrCat 0040251C . 50 push eax 0040251D . 68 701B4000 push Afkayas_.00401B70 ; AKA- 00402522 . 51 push ecx ; /String = "划P" 00402523 . FFD7 call edi ; \__vbaStrCat 00402525 . 8B1D 70414000 mov ebx,dword ptr ds:[<&MSVBVM50.__vbaSt>; msvbvm50.__vbaStrMove 0040252B . 8BD0 mov edx,eax 0040252D . 8D4D E0 lea ecx,dword ptr ss:[ebp-0x20] 00402530 . FFD3 call ebx ; msvbvm50.__vbaStrMove; <&MSVBVM50.__vbaStrMove> 00402532 . 50 push eax 00402533 . FF15 28414000 call dword ptr ds:[<&MSVBVM50.__vbaStrCm>; msvbvm50.__vbaStrCmp 00402539 . 8BF0 mov esi,eax
在0x00402533处下断,运行到此处,看下其参数。
0018F360 00509D84 UNICODE "AKA-390240" 0018F364 00509CBC UNICODE "123456"
该函数有两个参数,从栈中可以看出分别是AKA-390240
和我们输入的123456
,那么AKA-390240应该就是我们要找的序列号了。
输入测试。
可以看出,AKA-后面的注册码是根据用户名计算的。分析输入数据流,可以找到该算法。
00402412 . 50 push eax ; /String = 00000804 ??? 00402413 . 8B1A mov ebx,dword ptr ds:[edx] ; | 00402415 . FF15 E4404000 call dword ptr ds:[<&MSVBVM50.__vbaLenBstr>] ; \__vbaLenBstr 0040241B . 8BF8 mov edi,eax 0040241D . 8B4D E8 mov ecx,dword ptr ss:[ebp-0x18] 00402420 . 69FF FB7C0100 imul edi,edi,0x17CFB ;len(name) * 0x17CFB 00402426 . 51 push ecx ; /String = 00000002 ??? 00402427 . 0F80 91020000 jo Afkayas_.004026BE ; | 0040242D . FF15 F8404000 call dword ptr ds:[<&MSVBVM50.#rtcAnsiValueBstr_516>] ; \rtcAnsiValueBstr 00402433 . 0FBFD0 movsx edx,ax 00402436 . 03FA add edi,edx ;len(name) * 0x17CFB + ascii(name[0]) 00402438 . 0F80 80020000 jo Afkayas_.004026BE 0040243E . 57 push edi 0040243F . FF15 E0404000 call dword ptr ds:[<&MSVBVM50.__vbaStrI4>] ; msvbvm50.__vbaStrI4 00402445 . 8BD0 mov edx,eax
算法很简单,首先计算用户名的长度,与0x17CFB相乘,然后与用户名首字母的ascii值相加,将结果转为十进制并转为字符串类型。
比如:
用户名:test,长度为4。所以就是4 * 0x17CFB + 0x74
,结果为0x5F460,转为十进制为390240,那么注册码就是AKA-390240了。
原文:https://www.cnblogs.com/Roachs/p/9365258.html