新手--md5算法分析以及判断软件是否采用md5加密算法
最近几天才开始入门破解,昨天在研究md5算法,今天吾爱开放注册,于是注册了个账号,顺便分享一下昨天的一点心得(新人第一篇文章,如有错误请大神指教,勿喷:handshake)首先,目标是一个叫做"皇帝取名"的软件,在吾爱的论坛中已经有了这个软件的破解分析了 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 ,0x67452301
C7 40 89ABCDEF mov ,0xEFCDAB89
C7 40 FEDCBA98 mov ,0x98BADCFE
C7 40 76543210 mov ,0x10325476
或者
C7 02 01234567 mov ,0x67452301
C7 42 89ABCDEF mov ,0xEFCDAB89
C7 42 FEDCBA98 mov ,0x98BADCFE
C7 42 76543210 mov ,0x10325476
然后在上面那个软件ctrl+b查找试试:
哈哈,果然,这样的话就可以判断是不是用了md5算法了。
总结:
在练习算法分析破解时,如果经过了某个call之后,产生了一个你不知道的新数,那么尝试进去这个call里面去分析,如果call一层又一层,我们可以尝试用特征码的方式判断加密方式,比如如果我们用上面的特征码一查,如果查到了,那么就知道用了md5算法,对接下来的破解很有帮助。这里顺便还用易语言做了个md5算法的软件。
地址: https://pan.baidu.com/s/1o81zb4Y(用的易语言)
如果过程有错误,请各位纠正:handshake:handshake。
有类似成熟的算法扫描工具可以借鉴:
http://down.52pojie.cn/Tools/Crptography/
Hash & Crypto Detector v1.4.rar 和 Keygener Assistant v2.1.0.rar 楼主你好,感觉只有那四个作为特征值还是不够的,如果作者做了一些调整,估计还是搞不定。能再写一篇关于md5算法反汇编后的前后比对文章吗? 虽然看不懂 但是觉得好厉害{:301_1003:}{:301_1003:}{:301_1003:}{:301_1003:}{:301_1003:} 谢谢了,但是有没有aes加密的特征码? 新手路过,给赞一个,支持一下:loveliness: 同天注册 看样子楼主不是像我一样的小白 基础文章都是在哪读的? 谢谢分享,{:17_1056:} 不知道 有没有其他的教学呢 研究下,谢谢楼主 z236293824 发表于 2016-11-12 04:29
谢谢了,但是有没有aes加密的特征码?
现在还没研究aes,,如果有的话会写一篇的~ BabyCry 发表于 2016-11-12 13:23
同天注册 看样子楼主不是像我一样的小白 基础文章都是在哪读的?
看雪的kssd文库有很多不错的内容~ 智商有限目前没有能力。。。。