[原创]关于MD5碰撞
很早之前王小云教授提出了一种方法,可以在已知原文的情况下构造出另一个跟原文MD5值相同的串。并且该计算过程所消耗的时间是有限的、可计算的。
但是,要利用此方法达成某种啥啥的目的是困难无比的。原因就是你无法确定新构造出来的串符合你的预期。这么说比较绕口,说得俗一点:你可以将某个文件的MD5值弄的跟kernel32.dll的完全一样。但是你却无法让这个文件包含你所希望的某种功能。这个文件刚好是完整可运行的PE文件的概率都非常低,不过我也见过这种样本。。。
但是要通过碰撞实现程序A跟程序B的MD5值完全相同,但运行结果是完全不同,却是非常容易的,这个我也在网上看到过例子,但不知道有没有人公布这个方法,今天就在这里说一种简单的方法。。。关于这玩意到底有没有实际意义,就看各位的思路淫不**了。
国外公布过一个碰撞程序fastcoll_v1.0.0.5,可以在一个文件的基础上生成两个MD5相同的文件,查看下这个两个MD5相同的文件,会发现只是在文件末尾添加了一些不同二进制数据,那么。。。根据其中某个不同的字节,来使我们的程序跳转的不同的流程执行,就可以实现程序A跟程序B的MD5值完全相同,但运行结果却是完全不同,估计各位看到这里都笑了,代码其实还是写死的。
给一段代码:
char szModule[MAX_PATH] = {0};
GetModuleFileNameA(NULL,szModule,MAX_PATH);
FILE *fp = fopen(szModule,"rb");
if(fp == NULL)
{
return FALSE;
}
fseek(fp, -109, SEEK_END);
BYTE bRead;
size_t len = fread(&bRead, sizeof(bRead), 1, fp);
fclose(fp);
if ((bRead+0x80)>0xff)
{
SetWindowText(_T("木马程序"));
SetDlgItemText(IDC_STATIC,_T("这是木马!!!"));
}
else
{
SetWindowText(_T("正常程序"));
SetDlgItemText(IDC_STATIC,_T("这是正常程序。"));
}

可以看出是根据自己碰撞后文件的倒数第109字节+0x80是否大于0xff来执行不同的流程的,关于为什么这样比较大家可以参考下fastcoll_v1.0.0.5的源码和其生成的程序,其实还是有好几个字节可以拿来区分的。
fastcoll_v1.0.0.5_source and release.rar
测试程序.rar
