- UID
- 40684
注册时间2007-12-7
阅读权限10
最后登录1970-1-1
周游历练
该用户从未签到
|
【破文标题】对一简单crackme的追码和简单算法分析
【破文作者】gtboy
【作者邮箱】[email protected]
【作者主页】没有,我很菜还有点懒
【破解工具】peid,ICY OD
【破解平台】盗版的winxp sp2
【软件名称】crackme
【软件大小】8.00 KB
【原版下载】看雪crackme2007合辑
【保护方式】无壳,序列号方式
【软件简介】不要说我炒冷饭啊,这个crackme2007合集里面的crackme最多,我的电脑没有联网啊,上网还得在同学的机子上。但决定是自己分析的。
【破解声明】纯粹是为了练手,第一次独立追码成功,继续写文以纪念之。
------------------------------------------------------------------------
【破解过程】peid查壳,没有加,那就OD吧,直接运行,输入gtboy和假的注册码1234567890,点test后弹出出错对话框"Try again",那就查下这个字符串吧,很快就找到了,向上看看那个地方调用了,很快就找到了计算注册码的地方,把关键的地方贴出来吧。
00401139 $ 6A 32 PUSH 32 ; /Count = 32 (50.)
0040113B . 68 F3204000 PUSH Crackme1.004020F3 ; |把用户名压入堆栈
00401140 . 68 C8000000 PUSH 0C8 ; |ControlID = C8 (200.)
00401145 . FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd
00401148 . E8 DE000000 CALL <JMP.&USER32.GetDlgItemTextA> ; \计算用户名的长度
0040114D . 83F8 00 CMP EAX,0 ; 与0做比较,验证是否输入
00401150 . 0F84 99000000 JE Crackme1.004011EF
00401156 . 83F8 04 CMP EAX,4 ; 是否大于4位
00401159 . 0F82 90000000 JB Crackme1.004011EF
0040115F . 33C9 XOR ECX,ECX
00401161 . 33DB XOR EBX,EBX
00401163 . 33F6 XOR ESI,ESI
00401165 . 8945 FC MOV DWORD PTR SS:[EBP-4],EAX ; eax中为用户名的长度
00401168 > 0FBE81 F32040>MOVSX EAX,BYTE PTR DS:[ECX+4020F3] ; 依次取用户名的每个字母到eax
0040116F . 83F8 20 CMP EAX,20 ; 所取字母的ascii值是否为20,即忽略空格
00401172 . 74 07 JE SHORT Crackme1.0040117B ; 若是则不加以改变,取下一个字母
00401174 . 6BC0 04 IMUL EAX,EAX,4 ; ascii值乘以4
00401177 . 03D8 ADD EBX,EAX ; 把eax的值和ebx相加,ebx为前面字母的计算值的累加
00401179 . 8BF3 MOV ESI,EBX ; 把累加的结果放入esi
0040117B > 41 INC ECX ; 累加,把字母取完
0040117C . 3B4D FC CMP ECX,DWORD PTR SS:[EBP-4]
0040117F .^ 75 E7 JNZ SHORT Crackme1.00401168
00401181 . 83FE 00 CMP ESI,0 ; esi中为顺序计算的结果
00401184 . 74 69 JE SHORT Crackme1.004011EF
00401186 . BB 89476500 MOV EBX,654789 ; 把654789放入ebx,作为ebx的初值
0040118B > 0FBE81 F22040>MOVSX EAX,BYTE PTR DS:[ECX+4020F2] ; 逆序取用户名的字母放入eax,从算法上看就没有用嘛
00401192 . 4B DEC EBX ; ebx的值减1
00401193 . 6BC3 02 IMUL EAX,EBX,2 ; ebx的值乘以2后放入eax
00401196 . 03D8 ADD EBX,EAX ; 把eax和ebx的值相加后放入ebx
00401198 . 4B DEC EBX ; ebx的值再减一
00401199 . 49 DEC ECX ; 看是否已经取完
0040119A .^ 75 EF JNZ SHORT Crackme1.0040118B
0040119C . 56 PUSH ESI ; /顺着取计算的结果
0040119D . 53 PUSH EBX ; |逆序取计算的结果
0040119E . 68 C7204000 PUSH Crackme1.004020C7 ; |连接成BS-%lX-%lu的形式,lx为逆序的值,lu不清楚
004011A3 . 68 BB214000 PUSH Crackme1.004021BB ; |把连接好的真码入栈
004011A8 . E8 6C000000 CALL <JMP.&USER32.wsprintfA> ; \wsprintfA
004011AD . 58 POP EAX ; Crackme1.004021BB
004011AE . 58 POP EAX
004011AF . 58 POP EAX
004011B0 . 58 POP EAX
004011B1 . E8 01000000 CALL Crackme1.004011B7 ; 短call,想单步跟的话要用F7,脱壳的时候也有这种现象
004011B6 . C3 RETN
004011B7 $ 33C9 XOR ECX,ECX
004011B9 . 6A 32 PUSH 32 ; /Count = 32 (50.)
004011BB . 68 57214000 PUSH Crackme1.00402157 ; |假码入栈
004011C0 . 68 C9000000 PUSH 0C9 ; |ControlID = C9 (201.)
004011C5 . FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd
004011C8 . E8 5E000000 CALL <JMP.&USER32.GetDlgItemTextA> ; \GetDlgItemTextA
004011CD . 83F8 00 CMP EAX,0 ; 假码的长度
004011D0 . 74 1D JE SHORT Crackme1.004011EF
004011D2 . 33C9 XOR ECX,ECX
004011D4 > 0FBE81 572140>MOVSX EAX,BYTE PTR DS:[ECX+402157] ; 把假码和真码每次取一位进行比较,有一个错即跳到失败
004011DB . 0FBE99 BB2140>MOVSX EBX,BYTE PTR DS:[ECX+4021BB]
004011E2 . 3BC3 CMP EAX,EBX
004011E4 . 75 09 JNZ SHORT Crackme1.004011EF
004011E6 . 83F8 00 CMP EAX,0
004011E9 . 74 19 JE SHORT Crackme1.00401204
004011EB . 41 INC ECX
004011EC .^ EB E6 JMP SHORT Crackme1.004011D4
004011EE . C3 RETN
004011EF > 6A 10 PUSH 10 ; /Style = MB_OK|MB_ICONHAND|MB_APPLMODAL
004011F1 . 68 E4204000 PUSH Crackme1.004020E4 ; |Title = "Nope"
004011F6 . 68 E9204000 PUSH Crackme1.004020E9 ; |Text = "Try again"
004011FB . FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hOwner
004011FE . E8 34000000 CALL <JMP.&USER32.MessageBoxA> ; \MessageBoxA
00401203 . C3 RETN
00401204 > 6A 40 PUSH 40 ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
00401206 . 68 D2204000 PUSH Crackme1.004020D2 ; |Title = "Solved"
0040120B . 68 D9204000 PUSH Crackme1.004020D9 ; |Text = "Well done."
00401210 . FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hOwner
00401213 . E8 1F000000 CALL <JMP.&USER32.MessageBoxA> ; \MessageBoxA
00401218 . C3 RETN
通过动态跟踪得到了自己的注册码BS-6022E527-2196,注册机我不会写,就对算法简单的分析了下子,就“0040119E . 68 C7204000 PUSH Crackme1.004020C7 ; |连接成BS-%lX-%lu的形式,lx为逆序的值,lu不清楚”这个地方很迷惑,lu应该是顺序计算的值吧,但我的值应该是894,而不是2196,去看crackme2007上的分析的时候和我想的是一样的,但是我的值却不一样了,很困惑,考完试了再跟下吧,今天看来是没有希望了。昨晚熬夜看球,可惜自己喜欢的队输了,刚起床把逆序的部分分析了下子,和大家一起来分享下子,呵呵,这个crackme很适合咱们菜鸟练手的。
------------------------------------------------------------------------
【破解总结】追出注册码的感觉比爆破好了那么点,可惜中间的一点迷惑始终让自己很郁闷。还有就是004011B1 . E8 01000000 CALL Crackme1.004011B7 这个短call,有时脱壳的时候会看到,单步跟踪要用F7的。我的文笔不是很好,希望大家不要仍西红柿啊。
------------------------------------------------------------------------
【版权声明】支持pyg,锻炼自己。想转就转吧,没有技术含量的,(*^__^*) 嘻嘻…… |
评分
-
查看全部评分
|