很早之前王小云教授提出了一种方法,可以在已知原文的情况下构造出另一个跟原文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("这是正常程序。")); }
转载请注明来自看雪论坛@PEdiy.com