[原创][nago‘S Crackme]之算法分析!
发表于:
2007-1-5 17:30
5503
[原创][nago‘S Crackme]之算法分析!
对不起大家,一兴奋,就发错地方了,给管理员添麻烦了。。。 终于想起自己的 看雪ID 号的密码了
总算没丢,兴奋…………
兴奋之余发个简单的算法分析,希望对跟我一样的菜鸟有帮助!
附件下载,新手可练习下~~~希望对新手有帮助!!
http://www.live-share.com/files/131283/nagoya.rar.html
(看雪提供的临时上传空间)
要求:
1、去 Nag 窗口;
2、注册。
【破解过程】
1、查壳: MASM32 / TASM32 [Overlay] 编写, 无壳 。 2、W32D 分析一下,用对话框参考,来到这里:
==============================================================================
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040113D(C)
|
:0040115F 6A00 push 00000000 // 初始化
:00401161 685E134000 push 0040135E // 处理函数指针
:00401166 FF7508 push [ebp+08]
* Possible StringData Ref from Data Obj ->"NagScreen"
|
:00401169 68B3204000 push 004020B3
:0040116E FF3574204000 push dword ptr [00402074]
* Reference To: USER32.DialogBoxParamA, Ord:0000h
|
:00401174 E84C030000 Call 004014C5 //出现窗口
=================================================================================
这里我们要找的就是 DialogBoxParam ,它是显示窗口的函数。和 EndDialog 配对使用,分别是打开和关闭对话框。
接着再往下找到与它配对的 EndDialog 函数:
===================================================================================
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0040128D(C), :004012B2(C), :004012F3(U)
|
:004012FF 50 push eax
:00401300 FF7508 push [ebp+08]
* Reference To: USER32.EndDialog, Ord:0000h
|
:00401303 E8C9010000 Call 004014D1 // 关闭对话框
:00401308 B801000000 mov eax, 00000001 // 跳到这里就可以直接运行
:0040130D EB89 jmp 00401298
:0040130F C8000000 enter 0000, 00
:00401313 53 push ebx
:00401314 56 push esi
:00401315 57 push edi
:00401316 817D0C11010000 cmp dword ptr [ebp+0C], 00000111
:0040131D 741A je 00401339
:0040131F 90 nop
====================================================================================
通过上面的分析,我们就知道了:程序从 0040115F 开始显示 Nag 窗口,在 00401303 关闭它。
那么,我们直接在 0040115F 就跳到 00401303 的下一行代码执行,是不是就可以跳过 Nag 窗口呢?
于是 OD 载入,直接到 0040115F 处修改命令:
******************************************
0040115F push 0 改为 jmp 00401308
******************************************
保存,运行下,成功! 3、追码
下断点:bp GetDlgItemTextA (偶这个断点下的有点傻,不过菜鸟没办法,希望高手指点新招)
输入用户名:fing54321 注册码:888888 后 OD 断下!
F8 单步往下跟,一盏茶的工夫,来到这里:
***********************************************************************************
00401233 83F8 00 cmp eax,0
00401236 ^ 74 BE je short nagoyaOK.004011F6
00401238 68 05214000 push nagoyaOK.00402105 ; ASCII "fing54321"
0040123D 68 25214000 push nagoyaOK.00402125
00401242 E8 C9010000 call nagoyaOK.00401410 ; 关键call
00401247 83C4 08 add esp,8
0040124A A1 25214000 mov eax,dword ptr ds:[402125]
0040124F 3D 39300000 cmp eax,3039
00401254 74 0B je short nagoyaOK.00401261 // 关键跳,暴破点!
00401256 90 nop
00401257 90 nop
00401258 90 nop
00401259 90 nop
0040125A E8 08020000 call nagoyaOK.00401467 ; 跳错误框
0040125F ^ EB 95 jmp short nagoyaOK.004011F6 ;
00401261 E8 E5010000 call nagoyaOK.0040144B ; 注册成功
00401266 ^ EB 8E jmp short nagoyaOK.004011F6
***********************************************************************************
这里我们跟进关键 call
00401410 55 push ebp
00401411 8BEC mov ebp,esp
00401413 56 push esi
00401414 8B75 0C mov esi,dword ptr ss:[ebp+C]
00401417 56 push esi
00401418 E8 CBFFFFFF call nagoyaOK.004013E8
0040141D 83C4 04 add esp,4
00401420 56 push esi
00401421 E8 0B010000 call <jmp.&KERNEL32.lstrlen>
00401426 85C0 test eax,eax
00401428 74 19 je short nagoyaOK.00401443
0040142A 90 nop
0040142B 90 nop
0040142C 90 nop
0040142D 90 nop
0040142E 8BC8 mov ecx,eax
00401430 33C0 xor eax,eax
00401432 33DB xor ebx,ebx
00401434 D1E0 shl eax,1 //逻辑左移1位,相当于乘以 2
00401436 8BD8 mov ebx,eax
00401438 D1E0 shl eax,1
0040143A D1E0 shl eax,1
0040143C 021E add bl,byte ptr ds:[esi] //第一个数字
0040143E 03C3 add eax,ebx
00401440 46 inc esi
00401441 ^ E2 F1 loopd short nagoyaOK.00401434
00401443 8B75 08 mov esi,dword ptr ss:[ebp+8]
00401446 8906 mov dword ptr ds:[esi],eax
00401448 5E pop esi
00401449 5D pop ebp
0040144A C3 retn
-----------------------------------------------------------------------------------
算法分析:(eax 保存计算结果,ebx辅助计算)
1、取用户名中的数字符依次取出来给 esi ,位数送给 ecx 做循环次数。
2、eax * 2 的值记为 a ;
a 送给 ebx ;
a * 2 * 2 记为 b ;
b 与 esi 中的第(是循环的第几次就与第几位的)数字字符相加,值记为 c ;
b + c 的结果与 3039 比,相等的话就注册成功!
3、分析完算法,我觉得很搞笑,这个算法就是把我们输入的用户名中的数字依次提取出来,然后将提取的数字由十进制转换成十六进制,所以它的注册码就是把 3039 当作 16 进制的值,转换成 10 进制。
竟然是 12345 。我狂汗~~~
4、这个crackme的注册方式很特别,不去掉 Nag 窗口,就无法注册,即使注册码对也提示错误。还有就是它与注册码无关,为空都行,只与输入的用户名有关,而且只取前面的 10 位字符中的数字还转换。
--------------------------------------------------------------------------------------
好了,分析完了,有不对的地方,请高手指正。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)