|
今天讨论的是NOD32和小红伞的启发式,前几天帮一位朋友做免杀时遇到了这样一个问题,木马所有功能都写成了DLL文件,EXE文件只负责把DLL释放出来并用系统自带的rundll32.exe加载即可。于是把DLL文件做了小红伞和NOD32的免杀,但当作资源加载进EXE文件后发现又被杀了。EXE文件里是那些正常的查找资源、释放资源的API函数,都还没有写运行rundll32.exe的代码,而且DLL文件本身就是免杀的。两个文件合并后就马上被杀,于是感觉应该DLL里还有隐藏的特征码,而且很明显是启发式在查杀。我个人推测这些隐藏的特征码只有在PE文件被放到另一个PE文件的资源里,才会组合出新的特征码来,然后启发式就会开始查杀。但这些特征码是很查找的,如果单纯定位合并后的EXE文件,会直接定位到资源区段里的DLL文件头部。于是想到了破坏PE的方法,启发式肯定会查看一个PE文件的资源里是否包含的是另一个PE文件,如果包含的不是一个PE文件,那么相对就是安全的。所以把DLL文件用C32ASM载入,移到“PE”两个字符的位置直接填充成00,然后把修改好的DLL重新当作资源放到EXE中,EXE的代码中加入以下恢复的代码:- SetFilePointer(fp, 256, NULL,NULL); //
- WriteFile(fp, "PE", lstrlen("PE"), &a, NULL);
复制代码 这两句放在刚刚把DLL释放出来的语句之后执行,我的DLL文件中PE两个字符距离开始位置是256,不同的文件大家自己调整。
重新生成EXE文件后小红伞不杀了,但NOD32依然查杀。显然NOD32的虚拟机跟踪了这种行为,而小红伞的启发式无法跟踪。如果不写上那两句恢复代码NOD32是不杀的,因此可以判断前面推测还是正确的,现在是要解决NOD32虚拟机的问题。试着把函数改成动态调用也没用,还是查杀。经过思考后决定把EXE的功能拆分开,让NOD32的虚拟机无法跟踪到这种行为。我们把现在的EXE文件叫EXE-A,然后再写一个EXE文件,这里叫它EXE-B,EXE-B的代码很简单,就是去指定目录里去找到指定DLL文件,并把PE两个字符给DLL补上,然后把EXE-B和DLL文件都到放EXE-A的资源里去。EXE-A依次释放DLL和EXE-B,然后运行EXE-B,这里EXE-B会把DLL的PE两个字符补上,但运行DLL的代码不要写在EXE-B里,而是写在EXE-A里,运行前面加上Sleep(1000)延时1秒基本就可以了。
通过这样编排后,NOD32的虚拟机就跟踪不出来整个的行为了,因为EXE-A只是释放了一个非PE文件和一个EXE文件到系统的临时目录并试图运行。运行的这个EXE文件虽然是PE文件,但它是一个很正规的文件,不是木马,因此不会存在隐藏特征码,NOD32不会报毒;而想运行的这个非PE文件,这显然是运行不了的,NOD32也不会报毒。但EXE-B做的工作就可以使这个非PE文件成功的被rundll32.exe加载起来。经过测试用这种方法成功免杀NOD32和小红伞的高级启发式查杀。
由于想申请核心会员用的,所以附上杂志上证明原创的图片,让大牛们见笑了
|
|