CrackMe练习――Afkayas.1

匿名 (未验证) 提交于 2019-12-03 00:43:02

第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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!