CrackMe练习——Afkayas.1
Posted roachs
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CrackMe练习——Afkayas.1相关的知识,希望对你有一定的参考价值。
前言
第2个练习CrackMe。
准备
系统:Windows 7 SP1 x64 ultimate
工具:PEiD、OllyDbg
分析
拖入PEiD查壳,无壳,而且是VB写的。
运行程序。
用户名输入、序列号输入。
随意输入,看错误提示。
错误字符串You Get Wrong
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 ;
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 ;
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 ;
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>] ;
tcAnsiValueBstr
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了。
参考
以上是关于CrackMe练习——Afkayas.1的主要内容,如果未能解决你的问题,请参考以下文章