关于如何碰撞两个功能不一样,但 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
(希望不要拿示例程序改改版权,就拿出去招摇撞骗哟~ 亲~)
本文“如何碰撞两个功能不一样,但 MD5 值一样的程序的方法 + 源码公布”,来自:Nuclear'Atk 网络安全研究中心,本文地址:http://lcx.cc/?i=2681,转载请注明作者及出处!