Ericky 发表于 2013-6-20 23:37

【算法系列】MD5算法分析 2013.6.20

本帖最后由 PoJie_小雨 于 2013-6-20 23:56 编辑

【文章标题】:【算法系列】MD5算法分析 2013.6.20
【文章作者】: xiaoyu
【作者邮箱】: hy_xiaoyu@126.com
【保护方式】: none
【使用工具】: PEiD,OllyDbg
【编程语言】:Borland Delphi 6.0 - 7.0
【作者声明】: 主要记录自己的学习过程!欢迎交流学习
【编程语言】:Microsoft Visual C++ 6.0
【下载地址】: http://pan.baidu.com/share/link?shareid=1620370201&uk=892352529
--------------------------------------------------------------------------------
1.首先 查壳发现无壳
接着我们用OD载入:

--------------------------------------------------------------------------------
由于是分析算法在函数GetDlgItemTextA下断点
PS:谢谢shark提醒 补充下:
这是一个常用的API函数GetDlgItemText原型末尾没有A
它的作用是获取对话框文本属于User32.DLL
而OD在反汇编中将这个函数反汇编成
GetDlgItemTextA或者
GetDlgItemTextW
GetDlgItemTextA 是ASCII版本
而GetDlgItemTextW 是Unicode的版本

运行起来,输入帐号xiaoyu注册码:1234567890

点击“注册认证”
程序被断下来,我们F8单步走,马上来到
如图所示:
--------------------------------------------------------------------------------

继续单步走:
发现了兴奋点:

单步走:
004028F2   .6A 00         push 0
004028F4   .8D8C24 100100>lea ecx,dword ptr ss:
004028FB   .50            push eax
004028FC   .51            push ecx
PUSH这几句是保护现场
004028F4   .8D8C24 100100>lea ecx,dword ptr ss:
这句是将name 存于ECX
走到004028FD的CALL
我们进去看一下
0040261B|.53            push ebx
0040261C|.55            push ebp
0040261D|.56            push esi
0040261E|.57            push edi                                 ;保护现场
0040261F|.8D8C24 DC0000>lea ecx,dword ptr ss:
00402626|.E8 15F2FFFF   call MD5Crack.00401840                   ;MD5算法CALL
我们进去这个算法CALL
00401840/$8BC1          mov eax,ecx
00401842|.33C9          xor ecx,ecx
00401844|.8848 04       mov byte ptr ds:,cl
00401847|.C700 F0B04000 mov dword ptr ds:,MD5Crack.0040B0F0


0040184D|.C740 08 01234>mov dword ptr ds:,67452301
00401854|.C740 0C 89ABC>mov dword ptr ds:,EFCDAB89
0040185B|.C740 10 FEDCB>mov dword ptr ds:,98BADCFE
00401862|.C740 14 76543>mov dword ptr ds:,10325476
根据4个常数,很可能就是MD5的初始化,
继续单步走

有些CALL 大家可以自行分析
最后单步走来到这里:

进入这个CALL,比较:
将之前存的散列MD5值 与用户的serial相比较


感觉好乱。。。。。。。。。。
【总结算法】:MD5算法将用到4个常数
因此有个地方必须有这四个常数的初始化
本例子中 在之前的MD5初始化的call里出现了

大家可以尝试写个注册机!




Shark恒 发表于 2013-6-20 23:45

Ericky 发表于 2013-6-20 23:55

Shark恒 发表于 2013-6-20 23:45 static/image/common/back.gif
我抢个沙发先?

建议小雨写出GetDlgItemTextA下断的过程与原因。


这是一个常用的API函数GetDlgItemText原型末尾没有A
它的作用是获取对话框文本属于User32.DLL
而OD在反汇编中将这个函数反汇编成
GetDlgItemTextA或者
GetDlgItemTextW
GetDlgItemTextA 是ASCII版本
而GetDlgItemTextW 是Unicode的版本

1354669803 发表于 2013-6-21 00:02

为什么不是下getWindowtext断点呢

Ericky 发表于 2013-6-21 00:03

1354669803 发表于 2013-6-21 00:02 static/image/common/back.gif
为什么不是下getWindowtext断点呢

GetWindowText 是用来一个窗体的标题的,与你的name 以及serial 无直接联系

zhigaows 发表于 2013-6-21 00:05

学习了…………………………

淡然出尘 发表于 2013-6-21 00:06

膜拜大牛..{:1_931:}

Ericky 发表于 2013-6-21 00:09

zhigaows 发表于 2013-6-21 00:05 static/image/common/back.gif
学习了…………………………

~~~~~~~加油

Ericky 发表于 2013-6-21 00:14

淡然出尘 发表于 2013-6-21 00:06 static/image/common/back.gif
膜拜大牛..

。。。。。。。。别谦虚好吗?

LShang 发表于 2013-6-21 07:38

前来膜拜一下,MD5什么的,听起来就好牛逼。
页: [1] 2
查看完整版本: 【算法系列】MD5算法分析 2013.6.20