剖析杀毒软件自我保护机制与木马对策
剖析杀毒软件自我保护机制与木马对策
作者:lvvl 来源:赛迪网安全社区
本文将说明现有防毒软件自我保护机制与木马们的防御对策。适合新手至高手阅读,如果现在你正担心你的木马被查杀,不妨看看此文,你定会有收获的。
前些天,看论坛上有很多人说用进程结束的方法消灭杀毒软件来保护自己的马儿。不知大家发现没有,AVP和KV以及瑞星的一些进程都是无法结束的。这样杀毒软件还在运行着,撞上你的马还是会杀掉的。现在来说说这些进程为什么杀不掉。
因为杀毒软件是运行于Ring0级的,程序资源级别分为0、1、2、3, 0级最高,3级最低。只有0级资源的才能访问0级资源的程序。Ring0级运行于内存最高端,享有最高有权限。一般的木马都是2级资源级别的(像灰鸽子、黑洞、阿拉QQ大盗等等),有些是1级(像Bio-Net、Beast等等 这种不多)。当然无法结束位于0级资源的杀毒软件进程。
但是黑洞2001-2004的版本,却可以用他的进程过滤搞定很多杀毒软件。这是为什么?因为,他是不用进程结束的,而是窗口标题检测,发现类似“杀毒、木马克星、安全”之类的字眼就向该窗口发送无条件退出命令(WWQ_Quit)。这样就可以免除Ring资源级别的障碍了。阿拉QQ大盗则是干扰其扫描引擎来达到阻止杀毒软件的目的。
关于实现0级对0级资源程序的操作
目前,尚无对杀毒软件进程有效的解决方案。本人才思不及,只能给出解决的编程思路。
要对Ring0级资源操作,必须是汇编级语言。大家可以用Vxd技术来实现,这样编写起来比较方便,而且用汇编语言编写很可能会被杀毒软件认为是病毒,因为其病毒特征过于明显。把整个程序写成驱动程序的形式,加入到系统内存顶端,就可以对杀毒软件进程为所欲为。
首先程序启动,在内存最高端开辟一块内存,把自身复制上去并运行。然后写启动,写服务。接着在内存中搜寻杀毒软件内存标识符,找到以后,把杀毒软件内存标识符所在区域用无用垃圾数据覆盖,导致其出错退出。这些过程不能借助 INT13 写盘中断来完成,否则会被判定位病毒的。必须绕过杀毒软件设下的写盘捕获陷阱,这就需要极其高超的编程技术了。像这种编程能力,除了丧心病狂的病毒编写者还有操作系统编写者,其他人是无力触及的。等你有了这种能力,那么离你的超级病毒出炉也就不远了。
木马的防杀对策
加壳
这个不用说,好处多得没完。打个比方:把一个人的手接到脚上,把脚接到手上,这样公安就认不得你啦。
修改特征码
这个也是在加壳失败以后对付杀毒软件的好方法。需要注意的是,一个病毒被定义的特征码往往不止一条!所以要修改很多对才可以免查杀,这个还得靠运气。有时修改的特征码不一定对,如果特征码很多,那么修改工作将异常痛苦。
花指令
原来被KV杀的,用花指令技术处理过后还是被杀?因为KV的断点跟踪会不断追踪下去,除非你的程序无限大,否则总有一天,KV会报毒。
Rootkit
超级内核后门。好处很多,具体大家自己体会了。
引用一句经典名言:虽然瑞星的内存杀毒可以杀灰鸽子,可是重启后灰鸽子还是噗拉噗拉的飞着。
注意:瑞星的内存杀毒其实是进程+DLL监控,只是提取了部分木马的内存特征码。
对付KIS 2006,修改免杀相当复杂,不是简单改动源码和反汇编可以做到的。需要从源码处下功夫。
通过修改特征逃避杀毒软件的检查
今天难得被我在学校机房蹭到了机器,装了诺顿和麦咖啡。反正还没针对这两个杀毒软件做过免杀,所以干脆就改一下好了。
定位过程就免了,给出特征码位置:
诺顿的:起始偏移 000B9A4D 偏移大小 00000007
麦咖啡:只要修改000B28B8处就可完成免杀
先生成一个服务端,接下来用C32ASM打开(用16进制),按Ctrl+G跳到000B9A4D,我们看到了一大段的字符串,这些应该是程序控件名及属性的定义,修改大小写后并不会影响程序的正常执行。选中包含000B9A4D_000B9A54在内的一段,点右键,选择“修改数据”,选择“大小写反转”,最后保存文件,再用诺顿8.0企业版查杀,通过,测试上线成功。
PS:从网上的资料来看,诺顿的特征码基本上是定位在字符串上,一般修改大小写就可完成免杀。
接下来在刚才修改免杀的基础上,我们再来修改麦咖啡的特征码。
用OC计算文件偏移000B28B8处的内存地址为004B9CB8,用OD加载鸽子服务端,按Ctrl+G跳转到004B9CB8处,看看该处的内容
004B9CB8 4E dec esi
这里是减法运算,我们来看看它附近的汇编代码。
004B9CB0 4E dec esi
004B9CB1 0049 00 add byte ptr ds:[ecx],cl
004B9CB4 43 inc ebx
004B9CB5 004F 00 add byte ptr ds:[edi],cl
004B9CB8 4E dec esi
004B9CB9 0000 add byte ptr ds:[eax],al
各个寄存器相互并不影响,也不存在堆栈和出栈操作,我们要做的是改变004B9CB8处的汇编代码,这样也就改变了特征码,最简单的方法就是将004B9CB8处的代码写到程序后面的0区域,然后用JMP指令来完成跳转。不过这里不需要这么做,如果将004B9CB5和004B9CB8处的代码交换一下,改成如下的形式
004B9CB5 4E dec esi
004B9CB8 004F 00 add byte ptr ds:[edi],cl
很明显原来004B9CB8处的代码换成了004B9CB5处的,而004B9CB5处的则换成了004B9CB8处的代码,交换顺序后,保存文件。用麦咖啡查杀已经通过,测试上线成功。
最后就是用Resource Hacker等资源编辑工具删除hacker资源,将修改后的服务端文件命名为CServer.dat覆盖到鸽子的Cache目录下。











没有评论:
发表评论