ForXuān 发表于 2011-11-3 20:08:00

破坏PE与拆分功能突破启发式

今天讨论的是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和小红伞的高级启发式查杀。


由于想申请核心会员用的,所以附上杂志上证明原创的图片,让大牛们见笑了

Tesla.Angela 发表于 2011-11-3 22:34:02

因为很多AV耗资源且没用,所以我的电脑里根本不安装任何AV。

wszjljx 发表于 2011-11-3 23:30:22

好吧 我一向来自己用虚拟化工具 沙盘/虚拟机 来测试软件 杀毒神马的最不可靠了......

LittlePig 发表于 2011-11-5 02:01:09

留爪……这个可以防叁⑥灵么?

马大哈 发表于 2011-11-6 21:03:36

我一直一直都不明白的是.......为什么非要在资源里保存PE格式文件呢?

自己随便做个加密或编码算法,处理一下再放进去不就行了嘛!这样打包与释放过程根本就不会有问题了.

ok100fen 发表于 2011-11-8 00:26:23

mark一下

备用

wode200910 发表于 2011-11-10 15:07:03

同马大一样的想法``直接用个简单编码放进资源段然后解码释放``

ywledoc 发表于 2011-11-11 13:36:12

留名,水晶越来越多人了~~~

watchsky 发表于 2011-12-21 15:19:30

遇到过一样的问题,即使采用了些简单的加密,也没躲过小红伞。最后也是把文件分开执行的,但是后来的方法和你的有少些区别

watchsky 发表于 2011-12-21 15:21:25

对了,忘记说了,在一个多月前,你若是把解压的资源放到一些合理的路径里,然后copy来copy去,小红伞也是不杀的,不过现在没用了!

2012ohyeah 发表于 2012-2-7 11:32:12

马大哈 发表于 2011-11-6 21:03 static/image/common/back.gif
我一直一直都不明白的是.......为什么非要在资源里保存PE格式文件呢?

自己随便做个加密或编码算法,处理一 ...

释放的时候不还要解密吗,解密之后在内存中就会存在一个PE 释放的时候可能会被查到

马大哈 发表于 2012-2-7 13:06:06

2012ohyeah 发表于 2012-2-7 11:32 static/image/common/back.gif
释放的时候不还要解密吗,解密之后在内存中就会存在一个PE 释放的时候可能会被查到 ...

但至少不会被静态查出来嘛,嘿嘿

解压后的运行,也可以使用分段解压的方式,记得有个壳就是这样做的,要用到哪段内容就临时解压出来执行,搞定后再清除,保证内存里一定没有完整的映象.

xxy19804 发表于 2012-5-24 08:24:18

过nod32和小红伞,只要有源码,还是比较容易的,虽然过了无数遍,不过偶没文章。现在比较头疼主动防御

崽崽123 发表于 2012-6-2 03:50:18

求大牛指教编写dll与调用dll 或者是免杀的

lsj_pro 发表于 2012-8-30 09:56:18

矛和盾永运是 相互依存的

大胖 发表于 2014-1-3 15:03:34

本帖最后由 大胖 于 2014-1-3 15:06 编辑

厲害!

页: [1]
查看完整版本: 破坏PE与拆分功能突破启发式