关于如何碰撞两个功能不一样,但 MD5 值一样的程序的方法。

如果您还没有阅读过之前的内容,请先查阅以下链接:

使用 MD5 碰撞算法伪装木马,躲过杀毒软件查杀,加入360白名单

指定MD5值碰撞,指定MD5碰撞免杀,修改木马MD5值和系统文件一致

当时我在帖子里写的是:


用到的工具如下:

1、MD5 碰撞发生器 v1.5 (MD5 Collision Generator v1.5)

2、一点点编程技巧


方法写的没错,工具也没错,关键在于这个“2、一点点编程技巧”,技巧是很重要的一步。

在前边的内容中我曾讲过:


方案一,假设有程序 A:

可以通过 A 生成 B、C 两个 MD5 一样,但实际数据不一样的程序(文件尾部多了碰撞出来的随机数据,不影响程序功能),这两个程序功能也是一样的。

A、B、C 三个程序 md5 值的关系是这样的:

md5(A) <> md5(B)

md5(A) <> md5(C)

md5(B) = md5(C)

此方法即我文章中所讲的内容,也给了具体方法、工具及演示程序,具体去看文章,这里不废话了……


重点就在于这个“文件尾部多出来的随机数据”,碰撞出来的两个文件尾部的数据是不一样的,而且碰撞出来的每个文件都是有规律可循的……

例如,在只改动少量源码的情况下,改动前和改动后碰撞出来文件尾部的随机数据是有部分一致的(测试时用的编程语言为 VB,其他编程语言不知是否具有同样的特性,尚未测试其他编程语言。不过,我本人觉得这个与编程语言无关,所以其他语言应该也具备此特性)。

例如改动前:

if 1 = 1 then
    msgbox "yes"
else
    msgbox "no"
end if

改动后:

if 1 = 2 then
    msgbox "yes"
else
    msgbox "no"
end if

在这个例子中,只是改动了一点点源码,把 1 改成 2 了。

然后在编译后进行 MD5 碰撞,会生成两个 MD5 一样,但功能也一样的程序。

如何使它们功能不一样呢?或者“看起来”功能不一样呢?

这里就要用一点小技巧了,前边说过尾部附加有数据,并且有规律可循。

所以我们可以让程序在运行后读取自身文件数据,然后根据文件数据执行一些不同的功能。

这个说起来有点绕口,如果一时不能理解的话,可以再仔细思考一下。

公布之前那个示例程序的源码,大家看过源码后应该就明白了。

Public Function ByteLoad(ByVal N As String) As Byte()                           '读取文件二进制数据
    Dim Dat() As Byte, FileSize As Long                                         '二进制数组,文件长度
    FileSize = FileLen(N)                                                       '获取文件长度
    ReDim Dat(FileSize - 1) As Byte                                             '定义二进制数组长度
    Open N For Binary As #65                                                    '打开读取
        Get #65, , Dat
    Close
    ByteLoad = Dat                                                              '赋值
End Function

Private Sub Form_Load()
    Dim Test() As Byte
    Test() = ByteLoad(App.Path & "\" & App.EXEName & ".exe")                    '读取自身文件数据
    If Test(20499) < 100 Then                                                   '判断尾部附加数据中的某个值
        MsgBox "我是木马", vbInformation, "提示:"
    Else
        MsgBox "我是正常程序", vbInformation, "提示:"
    End If
End Sub

呵呵,源码就这么简单,就这么几行……

核心语句就这一句:

If Test(20499) < 100 Then

关于之前我在文章末尾提到的 MD5 碰撞免杀方法,在看过此文后,聪明的读者们应该早已想到了……

暂时没想到的同学,不要紧,慢慢、仔细想想,你会想到的……

╮(╯_╰)╭

文章最后,打包当时的测试程序源码,与编译并碰撞后的示例程序。

下载地址:MD5 碰撞测试程序.rar

(希望不要拿示例程序改改版权,就拿出去招摇撞骗哟~ 亲~)

留言评论(旧系统):

晴天小铸 @ 2012-07-15 16:51:58

- - 程序那么大冲撞到多少年

本站回复:

依靠这种方法,是非常快的,几秒钟就够了。

Ghost @ 2012-07-17 21:49:26

易语言已经实现 谢过核总。

本站回复:

奇葩的语言…… -_-|||

小菜鸟 @ 2012-10-08 14:16:04

so?其实两个程序本身内容是一样的?不过不是判断外部条件不同,而是判断本身多余的那段“用来使md5一致的废话的内容”不同而已?

本站回复:

虽然有点绕口,但差不多是这个意思,程序判断自己屁股后边跟的数据……

太极 @ 2013-01-08 00:18:40

核总 我在国外的论坛见过真正的碰撞出来的程序,MD5值一样,我用winhex比较过,内容完全不一样,求解。

本站回复:

本站早已公布这种碰撞的方法了啊,源码都公布了。目测你没看内容……

太极 @ 2013-01-08 01:13:58

老外论坛上的两个exe,hex内容基本是不一样的,绝非仅仅是屁股的数据不同。“使用 MD5 碰撞算法伪装木马,躲过杀毒软件查杀,加入360白名单 ”这篇文章出来不久,我就用winhex分析出他的原理了。。。

本站回复:

这还用分析么,文中早写明了……

太极 @ 2013-01-08 01:22:14

等我找到那两个exe,求核总分析。

本站回复:

╮(╯_╰)╭

hackbs @ 2013-01-17 13:53:55

这个..VB的基础还不是很好,站长能提供下VC的源码么?邮箱1073739377@qq.com

本站回复:

我靠,这还要共享么?几行代码的事,你自己写写……

佚名 @ 2013-03-11 18:54:58

“太极”的疑惑可能跟我一样。 博主所用的方法——在代码逻辑中,根据程序自身的不同的长度,做出不同的输出。 “MD5_碰撞测试程序_示例程序.rar:http://115.com/file/clonsfie”,使用了博主所说的方法。 因为在十六进制编辑器中MD5 Test_A.exe和MD5 Test_B.exe在偏移量5013之后,只有一处不同。 “HelloWorld-colliding.exe”和“GoodbyeWorld-colliding.exe”,不确定是否使用了博主所说的方法。 因为在十六进制编辑器中两个程序在00E0、100D-100F、7030-7042和A000之后,有四处不同。 如果有这两个程序的源代码就好了,这样就能确定是否使用了博主的方法。

本站回复:

碰撞不止这一种方法。

佚名 @ 2013-03-11 18:58:05

另外,博主能否提供使用易语言编写的程序(及其源码)?

本站回复:

不用易语言,无法提供。

佚名 @ 2013-12-14 10:43:13

下标越界怎么个问题啊

本站回复:

检查你的数组大小

佚名 @ 2013-12-14 10:44:46

下标越界怎么个问题啊

本站回复:

检查你的数组大小

佚名 @ 2013-12-14 13:51:09

没有获取成功 一直是17 求解

本站回复:

额,继续找……

佚名 @ 2014-02-27 18:08:32

站长,可以联系下Q617236071详细谈谈么,还有点不懂

本站回复:

仔细看文章就懂了。

小生 @ 2014-04-25 19:56:53

博主这样的方法让我大开眼界。不过这样的方法用在免杀360上面有点画蛇添足了呢。既然你加了判断语句那么直接判断文件名不为 a.exe的时候为正常程序。不为a.exe为木马程序。然后直接上传给杀软(不止360)验证不一样么?也许我错了,希望和博主多交流我QQ840308944

本站回复:

哈哈哈,这方法将近两年前了,现在对杀毒软件应该无效了(多hash认证),使用名字判断的方法虽然简单,但貌似不太实用。

佚名 @ 2014-04-25 21:32:07

还记得最初,为什么要学电脑么,真的是想做一个无敌的黑客么?还是只是为了找个借口趁机玩玩游戏?打打小霸王?走到了今天这一步,我反问自己,也许,就是自己想边玩边养活自己,不劳而获而已。和那些所谓的“职业玩家”,想靠打游戏过活的人有什么区别。如果再有一次机会,也许我不会选择学电脑。

本站回复:

小霸王!其乐无穷啊!

佚名 @ 2015-05-08 15:06:51

核总,话不要说满了,像你源码里这种把戏应该不是真正的前缀构造法,给你看一个真实的案例吧,虽然我也想知道 http://pan.baidu.com/s/1ntrBY9z 因为是朋友捕获的病毒样本,所以请小心验证,解压密码:md5

本站回复:

我程序并没有进行碰撞,而是利用国外一个程序“MD5 碰撞发生器 v1.5 (MD5 Collision Generator v1.5)”在文件尾部附加了碰撞数据,回头你看看你这个东西,虽然不知道你说的是什么……

佚名 @ 2015-05-08 15:21:22

是的,看了你的源码,知道你两个程序的“功能不同”其实只是假象,是让使用者以为是功能不同,其实代码里已经做了判断而产生了不同的对话框输出,完全还是同一个程序而已。 但我上传的示例真的是某些人真正碰撞出来的结果,理论真的转换成了实践,让人吃惊。

本站回复:

嗯,回头我看看,感谢提供样本!^_^

佚名 @ 2015-05-08 15:34:14

相信已经有人下载验证了,所以请不要再说“通过前缀构造,实现完全不同的两个文件返回相同MD5”这种事情只有量子计算机这样的设备才能实现。 只是很感兴趣实现方法,不为做坏事,纯属爱好,欢迎哪位真正的大侠指点迷津吧,呵呵。

本站回复:

没有验证的情况下,谁都不要轻易下结论。

佚名 @ 2015-05-08 15:39:28

嗯,顺便贴出部分哈希值留给感兴趣的朋友一同验证 测试1.exe_ MD5: 8C590CF74FE65BACFAAAFB8A6EB207AA SHA1: 7A701E5CC45B4F921C0B70499F4CF2D57AE11CA6 CRC32: 62782607 测试2.exe_ MD5: 8C590CF74FE65BACFAAAFB8A6EB207AA SHA1: 582282F2C9D55471122C0C0B3CDC6F564F93B361 CRC32: B9BB0F04

本站回复:

+1

MD5碰撞大神 @ 2016-04-15 08:40:40

大家好 我是md5碰撞的原作者,让各位安全大神研究了很久!真是不好意思啊 !目前360那边已经研究透彻了,所以我这边也不需要隐藏什么了! 感谢王小云博士,感谢本网站多年对该技术的关心!不要问我是谁 ,我就在本站的群里面!

本站回复:

我赵日天第一个表示不服!