首页
社区
课程
招聘
[原创][nago‘S Crackme]之算法分析!
发表于: 2007-1-5 17:30 5502

[原创][nago‘S Crackme]之算法分析!

2007-1-5 17:30
5502

对不起大家,一兴奋,就发错地方了,给管理员添麻烦了。。。

终于想起自己的 看雪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 位字符中的数字还转换。

--------------------------------------------------------------------------------------

好了,分析完了,有不对的地方,请高手指正。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (3)
雪    币: 224
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
支持兄弟~~~~跑这来了哦
2007-1-6 17:56
0
雪    币: 309
活跃值: (15)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
3

兴奋过了头,不愧是小糊涂神~
2007-1-7 22:11
0
雪    币: 538
活跃值: (460)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
4
好像只是把输入的假注册码转为16进制与3039比较.
2007-1-8 10:48
0
游客
登录 | 注册 方可回帖
返回
//