好友
阅读权限 20
听众
最后登录 1970-1-1
肥头东
发表于 2016-11-11 17:10
最近几天才开始入门破解 ,昨天在研究md5算法,今天吾爱开放注册,于是注册了个账号,顺便分享一下昨天的一点心得(新人第一篇文章,如有错误请大神指教,勿喷 )
首先,目标是一个叫做"皇帝取名"的软件,在吾爱的论坛中已经有了这个软件的破解分析了 http://www.52pojie.cn/thread-158898-1-1.html ,自己昨天开始看md5的算法,也是缘于这篇文章,这篇文章的思路很清晰,但是就是一点不明白,作者是怎么知道这个软件用了md5算法的?反正我这菜鸟看不出来,根据文章来看,是在call 皇室取名.004A2F94 这里进行了md5加密的,于是我下了这个软件,通过断点也来到了这个位置,f7步入进行分析,但是看不懂这个call里面是怎么运算的,于是我就放弃了分析call的想法,直接上网去查md5的算法原理,得知md5算法的大致思路如下:
md5算法有四个固定的起始常量,它们被称为链接常量:
A=0x67452301
B=0xEFCDAB89
C=0x98BADCFE
D=0x10325476
在OD数据段中为:
01 23 45 67 89 AB CD EF FE DC BA 98 76 54 32 10
假设我们输入的明文为bla,这个bla的位数为8x
则md5的第一步,就是填充这个bla的长度,使得位数模512=448,比如bla="肥头东",字节数为6,那么位数为8x6=64位,则要填充的长度为448-64=384(位),这里有个特殊情况,就是如果一开始bla的长度模512就是448的话,不是不填充,而是填充512位,也就是说,填充的长度为1-512,不为0。
接下来,第二步,就是再填充一个64位,这样的话组成的bla的长度正好是512的倍数(因为后面主循环的处理是按512位为一个分组的),这个64位存放的值是我们起始的明文的长度(就是上面"肥头东"的长度,8x6=64)
这上面两步用易语言实现的代码就是:(渣代码轻喷hhh)
然后,声明四个变量a,b,c,d,令:
a = A
b = B
c = C
d = D
接着,就 是按512位作为一个分组,进行主循环,主循环有四轮,每一轮有16次,大致如下(限于篇幅,只列出部分,完整的请大家去搜md5算法,到处都是):
第一轮:
FF(a,b,c,d,mj0,7,ti1)
FF(d,a,b,c,mj1,12,ti2)
FF(c,d,a,b,mj2,17,ti3)
FF(b,c,d,a,mj3,22,ti4)
... 共16次
第二轮:
GG(a,b,c,d,mj1,5,ti17)
GG(d,a,b,c,mj6,9,ti18)
GG(c,d,a,b,mj11,14,ti19)
GG(b,c,d,a,mj0,20,ti20)
... 共16次
第三轮:
HH(a,b,c,d,mj5,4,ti33)
HH(d,a,b,c,mj8,11,ti34)
HH(c,d,a,b,mj11,16,ti35)
HH(b,c,d,a,mj14,23,ti36)
... 共16次
第四轮:
II(a,b,c,d,mj0,6,ti49)
II(d,a,b,c,mj7,10,ti50)
II(c,d,a,b,mj14,15,ti51)
II(b,c,d,a,mj5,21,ti52)
... 共16次
FF(a,b,c,d,mj,s,ti): a = b + (a + F(b,c,d) + mj + ti) <<<s
GG(a,b,c,d,mj,s,ti): a = b + (a + G(b,c,d) + mj + ti) <<<s
HH(a,b,c,d,mj,s,ti): a = b + (a + H(b,c,d) + mj + ti) <<<s
II(a,b,c,d,mj,s,ti): a = b + (a + I(b,c,d) + mj + ti) <<<s
其中:
F(b,c,d) = (b & c) | ((~b) & d)
G(b,c,d) = (b & d) | (c & (~d))
H(b,c,d) = b^c^d
I(b,c,d) = c^(b | (~d))
经过这四轮后,a+=A,b+=B,c+=C,d+=D,然后判断还有没有下一512位分组,如果有,继续进行主循环,最后将a,b,c,d加起来就是了(比如a=0x6ADB27E2,b=0x343D0A99,c=0x21F95127,d=0xAFC29BB6,那么最终的结果就是 E227DB6A + 990A3D34 + 2751F921 + B69BC2AF=E227DB6A990A3D342751F921B69BC2AF
把md5算法理清了,问题是,在破解过程(这里指的是用OD),怎么知道是否用了md5算法呢?回过头看上面的算法,得知如果使用这个md5算法,则肯定要给四个链接变量赋值,那么我们可以用特征码来找,于是我通过**ASMtoE** 这款工具进行运算,得出下面的特征码:
C7 00 01234567 mov [eax],0x67452301
C7 40 89ABCDEF mov [eax+0x4],0xEFCDAB89
C7 40 FEDCBA98 mov [eax+0x8],0x98BADCFE
C7 40 76543210 mov [eax+0xC],0x10325476
或者
C7 02 01234567 mov [edx],0x67452301
C7 42 89ABCDEF mov [edx+0x4],0xEFCDAB89
C7 42 FEDCBA98 mov [edx+0x8],0x98BADCFE
C7 42 76543210 mov [edx+0xC],0x10325476
然后在上面那个软件ctrl+b查找试试:
哈哈,果然,这样的话就可以判断是不是用了md5算法了。
总结:
在练习算法分析破解时,如果经过了某个call之后,产生了一个你不知道的新数,那么尝试进去这个call里面去分析,如果call一层又一层,我们可以尝试用特征码的方式判断加密方式,比如如果我们用上面的特征码一查,如果查到了,那么就知道用了md5算法,对接下来的破解很有帮助。这里顺便还用易语言做了个md5算法的软件。
地址: https://pan.baidu.com/s/1o81zb4Y (用的易语言)
如果过程有错误,请各位纠正 。
免费评分
查看全部评分