查看: 5983|回复: 8
收起左侧

[转帖] 小探NOD32查杀机制之输入输出表篇免杀——驳网上流传错误方法(ZT)

[复制链接]
miss100
发表于 2007-4-2 13:21:02 | 显示全部楼层 |阅读模式
感谢幽游做的辛苦测试 本来早就很想写一篇这类的文章了 但是自己是个懒人 加上工作又重 自己辛辛苦苦写出来的文章又不一定会有人看 所以自从写了一篇有关壳的测试以后就一直没动 里面有关免杀的内容其实是必要的 因为这样才能体现出NOD32杀毒体制和别的杀软的不同 下面的内容自己看吧 看不懂我不负责 反正我是看懂了
小探NOD32查杀机制之输入输出表篇免杀 ——驳网上流传错误方法
文/图 幽游 [SUS]
本文首发于《黑客防线》07年第4期,如需转载请注明版权归《黑客防线》所有,转自幽游' Home(
[/url]
[url=http://www.0x08.com/]http://www.0x08.com

)
做免杀难,做过NOD32的免杀更难,做过NOD32的免杀DLL文件是难上加难!
虽然有些夸张,但也能说明一些问题,随便Google一下“免杀”,N多条目中涉及NOD32的很少,而少的这些中绝大部分又是提问如何过NOD的,而真正谈如何免杀的也就3类,第一是移动输入表中函数名;第二是加多层壳;第三是先加壳再脱壳,这些方法也正是我今天要驳斥的对象!
本文中为方便起见,文件偏移用小写字母表示,内存地址和RVA用大写字母表示,文中未特别说明的均为十六进制表示法即0x01a7直接用01a7表示,下划线后的数字代表定位的特征码字节数,比如ae8e_2即为文件偏移ae8e后的2个字节为特征码。
输出表篇
先谈特征码在输出表中如何修改,和网上流传的第一种方法修改输入表的有些类似,但网上没涉及输出表的,而两者在PE文件中的结构又有一些区别,不能直接按照修改输入表的方法用LordPE添加表修改thunk值,所以还是详细说下过程,算是首发吧!
以灰鸽子键盘记录插件为例,首先提一下定位NOD32的特征码,有时候会比较麻烦,比如灰鸽子键盘记录插件,它在文件偏移100处也就是PE头处定义为特征码,如果用填0定位的话,100处一般是PE头,填了0就不是有效的PE文件,当然也就不会报毒了,你会误以为只有这一处特征码,而修改100处,也就是整体移动PE头后(具体方法参考看雪论坛www.pediy.com帖子:不被OD分析原因之一和修补方法
[url= target=_blank www.0x08.com=]http://www.0x08.com[/url]
参考相关文章),但还是会报毒,这个问题也曾经困扰了我很久,明明定位了只有一处特征码为什么已经修改了还是报毒?其实很简单,因为它还有别的特征码,现在一般是填0定位特征码的,一旦PE头被填0,就不报毒了,让你误判为只有一处特征码,其他特征码一般在输入表输出表和节表里。以灰鸽子键盘记录插件来讲(插件在附件里),定位特征码的过程不在本文讨论范围之内不详细说了,首先定位出特征码在文件偏移100处,整体移位后再次定位,可以得到特征码在 ae8e_2即3DE08E,跟进到ae8e可以看到" title="http://bbs.pediy.com/showthread.php?threadid=17592或者到我的小站
http://www.0x08.com
参考相关文章),但还是会报毒,这个问题也曾经困扰了我很久,明明定位了只有一处特征码为什么已经修改了还是报毒?其实很简单,因为它还有别的特征码,现在一般是填0定位特征码的,一旦PE头被填0,就不报毒了,让你误判为只有一处特征码,其他特征码一般在输入表输出表和节表里。以灰鸽子键盘记录插件来讲(插件在附件里),定位特征码的过程不在本文讨论范围之内不详细说了,首先定位出特征码在文件偏移100处,整体移位后再次定位,可以得到特征码在 ae8e_2即3DE08E,跟进到ae8e可以看到" target="_blank">
http://bbs.pediy.com/showthread.php?threadid=17592
或者到我的小站
http://www.0x08.com
参考相关文章),但还是会报毒,这个问题也曾经困扰了我很久,明明定位了只有一处特征码为什么已经修改了还是报毒?其实很简单,因为它还有别的特征码,现在一般是填0定位特征码的,一旦PE头被填0,就不报毒了,让你误判为只有一处特征码,其他特征码一般在输入表输出表和节表里。以灰鸽子键盘记录插件来讲(插件在附件里),定位特征码的过程不在本文讨论范围之内不详细说了,首先定位出特征码在文件偏移100处,整体移位后再次定位,可以得到特征码在 ae8e_2即3DE08E,跟进到ae8e可以看到
图1

这里就是输出表了
以下是由LordPE知道的
图2

首先认识一下输出表
输出表偏移ae00 RVA:E000 大小:A6
ae00-ae13: DLL名称和DLL个数,前面12字节全为0,有特殊作用但对我们没什么意义,ae0c处4字节为E05A是DLL名称,即ae5a,跟到ae5a得知DLL名称为plugin.dll,ae10处4字节为0001说明只有一个DLL;
ae14 -ae27:得知函数数量,函数名数量,函数地址,函数名地址和函数名序列号地址。ae14开始的4字节的值为0005,表示函数的数量为5个,ae18 开始的4字节也是0005表示的是函数名数量也为5个;ae1c开始的4字节为E028即ae28为函数地址,从而得知函数地址是从ae28开始的; ae20开始的4字节为E03C即ae3c为函数名地址,跟到ae3c,它的值为E065即为ae65,而ae65就是GetPluginInfo为第一个函数名称,第二第三个类似;ae24开始的4字节为E050为函数名序列号地址,也就是各函数的排列顺序,跟进到ae50可以看到是0004 0001 0000 0003 0002分别对应下面各函数的排列顺序;
ae28-ae3b:对应各函数RVA,上面已经说到了,A814 A614 A7D4 A730 A5F8 分别为拍名0000 0001 0002 0003 0004的函数对应的函数地址;
ae3c-ae4f:各函数名称地址,上面也提到了,看第一个,E065即ae65为GetPluginInfo;
ae50-ae59:各函数名序号地址,也可以理解成排名;
ae5a-aea4:DLL名称和函数名称;
有一个需要注意的地方,假定各函数地址也就是ae28-ae3b是一定的,它对应的是函数名称序号,也就是排名,即A814是排名第一的函数地址,A614为排名第二的函数地址……
理解以后就可以开始了,可以有几种方法:
最容易理解的方法:ae28-ae3b不变,排名顺序也不变,将GetPluginInfo移到后面空白aeb0处,原函数用0填充,同时修改ae44处的E083为E0B0
图3

经测试,躲过NOD32查杀而且功能没有受影响。
其实我们还可以有别的方法可以修改输出表而不影响功能,比如,函数名不变,同时修改函数名地址和排名,原来对应关系是
A814 0000 GetPluginRun
A614 0001 GetPluginResult
A7D4 0002 PluginStop
A730 0003 PluginFunc
A5F8 0004 GetPluginInfo
将ae40处的E073和E083交换,同时ae52处的0001和0000交换
图4

同时修改函数地址和排名后对应关系还是没变,所以功能还是正常的,虽然这样修改这个文件与过NOD32没有关系,但谁能保证下次特征码会定位在哪里呢?如果是定义在ae28-ae3b或者ae50-ae59就可以这样修改了,只是一种修改思路。
可能你会问,只要知道把GetPluginInfo移到后面再改下相应位置不就行了,干嘛罗嗦一大堆呢?其实理解原理才是重要的,如果NOD32把特征码定位到了别的地方或者定位的手法有了提高了怎么办?不相信?NOD32对输入表特征码的定位就已经有了提高!听我慢慢道来……
[本文首发于《黑客防线》07年第4期,如需转载请注明版权归《黑客防线》所有,转自幽游' Home(
[/url]
[url=http://www.0x08.com/]http://www.0x08.com

)]
输入表篇
以我们协会楚茗大哥的一个下载者中的一个dll文件为例(放附件里了),个头比较小,容易说明问题。还是先理解一下输入表,关于输入表网上讨论的比较多,也相对容易一点,先看PE头处
图5

PE头位于d0处,一般PE头+80便是指向输入表的RVA,d0+80=150,看150处,是11D0转换成文件偏移也就是3d0,所以3d0也就是输入表开始的地方,由LordPE知大小为3C
图6

和输出表有些相似之处:
3d0 -3f7是40个字节,每20个字节对应了一个DLL,以第一个DLL为例,从3d0-3e3,均以四个字节为间距分成五份,0000120C是 OriginalFirstThunk,是FirstThunk的备份通常用不到,下面两段00000000/00000000分别是 TimeDateStamp32位的时间标志和ForwarderChain输入函数列表的32位索引,号称有特殊作用,我遇到的都没用处,最后的两个是有用的,00001232是DLL名,00001000是First thunk指向DLL的第一个函数的地址;
3f8-40b全为0,也属于输入表的范围。
再往下就是函数地址和DLL名函数名了,不属于输入表的范畴,和输出表类似,不再赘述。
有一个地方需要注意,第一个DLL的第一个函数名地址为1284即文件偏移484比真正的函数名GetCurrentProcess地址提前了2个字节,这两个字节是用来作为函数名称提示符的。
定位出的特征码是45a处的urlmon.dll,按照网上流传的方法,也就是和修改输出表类似,将urlmon.dll名移动到后面空白处,我们试验一下,将3f0处的1256改成12B0,也就是4b0,同时将urlmon.dll移到4b0处,将原来的填充掉,当然用LordPE可以方便一点修改,但不利于理解。
图7

这样修改后经过测试是没有问题的正常工作,但还是被NOD32杀!可以证明网上流传的第一种方法是完全错误的,根本过不了NOD32,重新定位特征码变成了4b4,是修改后的urlmon.dll的位置,难道NOD32长眼睛了?
仔细想想,可以理解为NOD32肯定不是直接比对特征码的,因为经过测试将3f0处的1256用0填充后不杀了,我们修改的不是定位出的特征码同样不杀说明了什么问题?难道它是读取3f0处的值跟进到相应函数名处再比对的?为证明这一观点,在函数名后移的基础上,将输入表60个字节整体移动,从3d0移动到 3c0,同时整体移动PE头,具体移动方法上面提过了,同时不能忘记修改PE头处定义的输入表位置和大小,将c0处定义输入表位置大小的值分别改成移动后的值11C0和004C
图8

图9

保存后很不幸,还是被杀,还是低估了NOD32,它的查杀机制竟然是直接获取输入表某DLL下某函数进行比对!和常见的特征码有了很大的区别,在这种机制下手工修改输入表免杀已经不太可能了,当然网上有流传的加两层壳免杀的方法,个人认为不好,第一、加两层壳很容易造成文件损坏不能正常运行,DLL文件尤其如此;第二、加壳后已经免杀的又会被别的杀毒软件查杀,因为他们也定义了加壳后的特征码;第三、加两层壳后有很大的几率NOD32还是能查出来。所以我觉得还是用文件保护软件加密IAT比较好,比如ASPotect,是正规的程序保护软件,加密后NOD32就不杀了,只要先做好别的杀毒软件的免杀,加密后别的杀毒也不会理睬!至于网上流传的第三种方法,加壳再脱壳,不能说方法错误,也是一种办法,其意义也是打乱IAT,和加密IAT相比优点就是文件不会变大,EXE文件我测试过有些是行的通的,但脱壳修复后不能运行的也很多,至于DLL文件就不用提了,加壳脱壳后还能正常使用的几率很小!
现在NOD32的这种查杀机制也算很不错,可以说是一种创新,可以理解为对同一类型病毒变种有了预见性,比如几个月前的NOD32可以杀新生成的灰鸽子,但最大的软肋就是IAT的加密,或许还应该再有些改进才好!

文中的DLL例子下载

注:因为一些DLL是病毒,会被杀毒软件查杀,所以加密了,密码是hacker。
本文首发于《黑客防线》07年第4期,如需转载请注明版权归《黑客防线》所有,转自幽游' Home(
[/url]
[url=http://www.0x08.com/]http://www.0x08.com

)

评分

参与人数 1经验 +5 收起 理由
东海林将司 + 5 精品文章

查看全部评分

The EQs
发表于 2007-4-2 13:26:04 | 显示全部楼层
现在最简单的nod32免杀方法就是直接加两层北斗。。。。。。
The EQs
发表于 2007-4-2 13:26:35 | 显示全部楼层
nod32特征码识别能力也非常强悍。。。现在才发觉。。。。,目前正在进一步测试ing
wangzoom
发表于 2007-4-2 13:35:35 | 显示全部楼层
太复杂了,看不大明白,通俗易懂些就好了
mofunzone
发表于 2007-4-2 14:13:31 | 显示全部楼层
这个作者过于执着在特征码免杀了,我一直说nod的引擎是有漏洞的,就是这个文章作者最后所说的iat加密,实际上我很早前就说过,加壳不是为了免杀,而是为了变形,这变形就包括了对输入输出表的位移,现在没有人会单纯到修改特征码来免杀了,特别是鸽子这种东西,各个厂家对于鸽子的特征码定位有的居然都高达20个之多,想通过修改特征码来免杀可以说是痴人说梦了
所以我们所要做的就是对文件分区表的内容移动之后,再用一个壳,来破坏输出表的内容,实际上真正熟悉特征码免杀的人(就是说清除的明白特征码位移道理)不用文中提到的asprotect一样可以对nod进行免杀,就目前来看,修改后的输入输出表+一层nspack就可以很好的对nod进行免杀
而且文中提到的是dll免杀,这个比pe更有难度,因为dll文件有众多函数接口,而且dll文件不具备pe文件的可以随意加密解密的特点,免杀确实具有更高难度,打个比方,如exe和dll都是糖块的话,exe可以加上糖纸,但是dll不可以,因为exe可以叫cpu来给他拨开糖纸,而dll不可以,后果就是dll加密之后无法正常运行
能搞dll免杀的注定是高手,而这位作者更是脱离的“壳”的范围,直接开始代码免杀了,目前我还做不到这点,需要“壳”的帮助。。
向这位作者致敬
p.s 推荐一个和asprotect一样很好用的对nod菜鸟免杀的必用装备,svkp壳

[ 本帖最后由 mofunzone 于 2007-4-1 22:16 编辑 ]
buycard
发表于 2007-4-2 15:25:23 | 显示全部楼层
SVKP又不是新东西,都是些老掉牙的东西
傻猪猪米走鸡
发表于 2007-4-2 15:50:32 | 显示全部楼层
太过PRO了……不过希望nod能自我完善……
xffsfy
发表于 2007-4-2 17:46:22 | 显示全部楼层
哪那么多完美的东西啊~~~~资源占用我已经很满足了
东海林将司
发表于 2007-4-2 23:49:16 | 显示全部楼层
=待3.0的新表现
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

手机版|杀毒软件|软件论坛| 卡饭论坛

Copyright © KaFan  KaFan.cn All Rights Reserved.

Powered by Discuz! X3.4( 沪ICP备2020031077号-2 ) GMT+8, 2024-3-29 04:00 , Processed in 0.123624 second(s), 18 queries .

卡饭网所发布的一切软件、样本、工具、文章等仅限用于学习和研究,不得将上述内容用于商业或者其他非法用途,否则产生的一切后果自负,本站信息来自网络,版权争议问题与本站无关,您必须在下载后的24小时之内从您的电脑中彻底删除上述信息,如有问题请通过邮件与我们联系。

快速回复 客服 返回顶部 返回列表