Ericky 发表于 2013-6-16 22:28

一个简单crackme的算法分析2013.06.16

本帖最后由 PoJie_小雨 于 2013-6-17 11:07 编辑

【文章标题】:一个简单crackme的算法分析
【文章作者】: xiaoyu
【作者邮箱】: hy_xiaoyu@126.com
【下载地址】: http://pan.baidu.com/share/link?shareid=968304825&uk=892352529
【保护方式】: UPX 0.89.6 - 1.02 / 1.05 - 2.90 -> Markus & Laszlo
【使用工具】: PEiD,OllyDbg
【作者声明】: 主要记录自己的学习过程!欢迎交流学习
--------------------------------------------------------------------------------
【详细过程】
1.脱壳
首先查壳:我们用PEID v0.95版



是很老的UPX 0.89.6 - 1.02 / 1.05 - 2.90 -> Markus & Laszlo
我们用ESP 定律即可脱壳
用OD自带的dump即可
OEP如下:

脱壳后不用修复可以运行
查下壳,发现是汇编写的,废话不多说。
我们接着破解
2.破解
将unpacked的程序用OD载入,运行起来
接着下API断点CreatDlg、WM_command、GetDlgItemTextA
找到注册码的地址的地址段
下面我们进行分析:

看到右边的ASCII码和2个CMP
1个CMP EAX,1
1个CMP EAX,32   2进制为50
可以确定用户名长度为1到50
继续单步走............................发现:
00402174    E8 AB050000   call <jmp.&USER32.GetDlgItemTextA>               ; 获取Serial
继续单步走、、、、
0040219A    E8 C3010000   call unpacked.00402362                           ; 序列号位数验证
这里我们进去分析一下



分析 看我的注视
要注意的是:都是16进制的 计算要转换
输入40为序列号。。。。继续走。。。来到:

注意关键CALL 下面那一条对比语句
说明这个CALL 里EAX运算值及为重要,不为1则验证失败
进去关键CALL后,我们继续分析:

接着继续向下来到:图中算法CALL其实就是tea算法

00402435    E8 62010000   call unpacked.0040259C                           ; TEA 算法
0040243A    6A 08         push 8
0040243C    FF35 947B4000   push dword ptr ds:
00402442    FF75 0C         push dword ptr ss:
00402445    E8 87000000   call unpacked.004024D1                           ; 继续跟进这个CALL压了几个数据
0040244A    68 00400000   push 4000
0040244F    68 E8030000   push 3E8
00402454    FF35 947B4000   push dword ptr ds:
0040245A    E8 97030000   call <jmp.&kernel32.VirtualFree>
0040245F    6A 40         push 40
00402461    68 00100000   push 1000
00402466    68 E8030000   push 3E8
0040246B    6A 00         push 0
0040246D    E8 7E030000   call <jmp.&kernel32.VirtualAlloc>
00402472    A3 987B4000   mov dword ptr ds:,eax
00402477    68 D87A4000   push unpacked.00407AD8                           ; ASCII "11111"
0040247C    E8 7B030000   call <jmp.&kernel32.lstrlen>
00402481    FF35 987B4000   push dword ptr ds:
00402487    50            push eax
00402488    68 D87A4000   push unpacked.00407AD8                           ; ASCII "11111"
0040248D    E8 C2010000   call unpacked.00402654                           ; base64算法
00402492    6A 00         push 0
00402494    50            push eax
00402495    FF35 987B4000   push dword ptr ds:
0040249B    E8 90000000   call unpacked.00402530                           ; 再用crc32算法
004024A0    8B55 0C         mov edx,dword ptr ss:
004024A3    2902            sub dword ptr ds:,eax                     ; 与TEA算法结果 比较


其实就是Serial的tea算法算出来的值“+”00402190计算出来的一个值
与Name的BASE64算法的结果再用CRC32算法算出来的结果相比较
一致则注册成功
反之失败!
最后,再用peid的插件K-analysis检测下如图:

最后累死了 。。。
希望与君共勉。
最后也感谢下H老大...没来报道没删我号- -谢了!






小雨细无声 发表于 2013-6-16 22:38

感谢教程,很详细,给大神加分,今天花了百多个冤枉爱币。

LoongKing 发表于 2013-6-16 22:38

膜拜楼主,小菜现在还不会分析算法......

Ericky 发表于 2013-6-16 22:45

小雨细无声 发表于 2013-6-16 22:38 static/image/common/back.gif
感谢教程,很详细,给大神加分,今天花了百多个冤枉爱币。

谢谢。。。。。怎么冤枉了。。。

Ericky 发表于 2013-6-16 22:46

E_eYYF 发表于 2013-6-16 22:38 static/image/common/back.gif
膜拜楼主,小菜现在还不会分析算法......

加油吧先学汇编。

小雨细无声 发表于 2013-6-16 23:09

PoJie_小雨 发表于 2013-6-16 22:45 static/image/common/back.gif
谢谢。。。。。怎么冤枉了。。。

莫提起
提起泪流满江河{:1_923:}

Ericky 发表于 2013-6-16 23:09

小雨细无声 发表于 2013-6-16 23:09 static/image/common/back.gif
莫提起
提起泪流满江河

。。。加油。

Shark恒 发表于 2013-6-16 23:18

Ericky 发表于 2013-6-16 23:19

Shark恒 发表于 2013-6-16 23:18 static/image/common/back.gif
论坛禁止留下QQ,已帮你修改。特此提醒。期待更多作品!

好的。谢谢。

老万 发表于 2013-6-17 06:46

学习了,谢谢分享
页: [1] 2
查看完整版本: 一个简单crackme的算法分析2013.06.16