对抗启发式杀毒的思路 ---希望小狮子能借鉴!
对抗启发式杀毒的思路
本文来自黑白网络,希望能让瑞星的启发更强,链接地址:http://www.heibai.net/article/info/info.php?infoid=48657
本文不是让大家通过这些方法来突破启发杀毒.只是为大家对抗启发杀毒提供了又一个思路.我希望大家在免杀中不要可以的模仿.如果是模仿我也就没有写那么多关于思路的东西了....希望大家能看到文章的灵魂 说真的启发式杀毒这东西挺招人讨厌的,不好免杀.... 理论上,启发式扫描可以发现任何一种新的病毒。但这仅仅是指理论上,因为代码仿真不可能达到对真实CUP的100%模拟,所以该技术并不能毫无遗漏的检测出每一个病毒。所以说,寻找启发式引擎的缺陷然后利用它们就成了做免杀的目标和责任。我下面所要谈的就是如何利用不同的手段欺骗并把这些启发式引擎玩弄于手掌之间。 大家掌声鼓励..... .Thunderbyte Antivirus在早期,这被认为是最好的扫描器了,但现在,它已经被认是很一般的了,至少在"启发式检测"(其实仅是特定的字符串描)方面如此。但在其它方面它附带了很多实用的扫描器(checksummer, cleaner, memory residentutilities这个尤其是utilities这个我觉得最好了...)。顺便说一下,每个人都会有自己喜欢的不同版本,7.xx版本就不错。因为这个版本可以让制定自己的扫描方式,这一点很重要,假设你自己不小心感染了自己的机器。(某人:你以为谁都和你一样苯吗.....) .AVP:在我认为全部的启发式扫描器当中,AVP确实是比较难忽悠的一个。我是用的版本是version 3.0 有喜欢的可以下一个 .NOD和AVP一样优秀,我钟爱的一个。 ==================================== 传说中的思路 我的所有说的欺骗手段,都是基于同样的思路的:那就是病毒是加密的,我们要在扫描器能解密出病毒体前停止仿真代码的执行,或者在扫描过程中隐藏我们的加密密钥。如果你仍然没有使用加密的方式,密钥隐藏手段也是可以使用的,在“加密”的调用方式中(例如,int21h 中断的值),简单的说这样打开一个文件的操作,虽然我没有测试过这种方式。(某人:你很邪恶...没测试过就来忽悠X子) mov ax, 3D02h ;0x3D02 是密钥 add ax, key int 21h 通过指令预取反跟踪技术: 早期的处理器,像386或者486都使用了指令队列预期技术来提高代码执行效率。这一技术的本质就是,当CPU将要执行一条指令时,它已经将该指令预先读到了CPU的cache中了。所以在此之前的修改对CPU来说已经没有影响了。让我们一起来看一个这样的例子: mov word ptr cs:[offset piq], 20CDh piq: nop nop 如果你稍微懂点汇编就应该会想到这个程序将结束运行,因为两个字节的nop 指令会被覆盖为 int20h(风暴提示:int 20h是返回DOS的指令)。但在386或486的机器上去并非如此,因为nop指令已经在cpu的cache中了。但在Pentium/PentiumII 体系的机器中运行时,指令则会被覆盖,程序执行后退出。 如果你想利用这一特性来对抗启发式检测技术的话,你就必须知道在386或者486年代这是一种应用广泛的对抗启发式检测的手段。但是随着AVs的改进,他们已经加入了对指令预期技术的支持。这是不是件很不可思议的事情呢,他们仿真的东西竟是不存于现在的处理器当中的。让我们会过头来看看刚才的例子,这是我们用来对付他们的,在 pentium或者更高级别的处理上面,像我所说的那样,程序会终止,因为这些处理器没有使用PIQ技术。但大部分的AVs会继续让代码执行那两个nops,因为他们要仿真PIQ。所有这块我们得这样做: mov word ptr [offset prefetch], 06C7h prefetch: int 20h dw offset decrypt_key dw key int 20h 指令将被覆盖,替换它的将是下面的指令 mov word ptr [decrypt_key], key 基于对PIQ的考虑,AVs将终止程序的执行。但实际上我们的程序将继续运行,在我们的加密处理函数中设置密钥。我们仅存在一个问题,那就是我们的代码要运行在Pentiums或更高级别的处理器上面。为了使之兼容486系列或更低一些处理器,我们还得清除掉PIQ之间的两条指令。 没有什么比这更简单的了吧,当然,你也要知道清除所有jump类指令(jmp, call, loop,int...)之间的PIQ(风暴天气预告:这一点是必需的,如果你想这样做的话)。但是我们不能简单的处理JMP Short$+2之间的指令,对于清除PIQ来说它应该是正常被执行的,因为代码仿真器是会察觉到这一点的。很遗憾.... 但是我们可以使用这样一个很特殊的功能—CPU的陷阱标志(某人:你是不是WOW玩多了..)。如果这个标志被置位,那么其后的任何指令执行都将触发int 1 的中断调用,X子们请记住这样会清除PIQ。这通常都是在的调试状态下,1号中断向量只是简单的IRET,所以这里我们可以使用没有任何问题。无论如何,执行后再次清除陷阱标志都是个很好的主意。下面展示的代码可以运行在任何处理器上(assumes DS = CS)。(众人:我们要WAR3....) pushf ;flags on the stack pop ax ;flags from stack into AX or ax, 100000000b ;set trap flag push ax ;put the modified flags in AX back... popf ;into the flag register via the stack mov word ptr [offset prefetch], 06C7h ;modify the following instruction prefetch: ;here gets int1 called => clears PIQ int 20h ;This is never executed dw offset decrypt_key &n bsp; ;where we want to write our key to dw key ;the actual decryption key pushf ;clear the trap flag again with pop ax ;the same method as above. xor ax, 100000000b ;will also fool some debuggers push ax popf mov word ptr [offset prefetch], 20CDh ;restore the int20h (next generations) 这种方式可以骗过 AVP, Dr. Web, f-prot v3.04 (even with the/PARANOID flag),但不能通过f-prot v2.27, Nod, Ikarus and Dr. Solomon's.f-prot v2.27 andIkarus的检测。另一方面我们也可以欺骗”正常的“使用PIQ手段(是泼你凉水的时候了,这个在现在的CPU上是不能用的)。 你还可以使用不同类型的循环,或者像Opic's Odessa-B virus那样的手法,非常长的一个解密循环。这里就不多提了.....(众人:再懒,咔嚓了你......) 这篇文章里所说的这些技术目前为止经我的测试都可以正常运行。当然AVs也可能改进它们的一些不足,在未来使这些方式失效。所以说请大家继续参与并完善这个文章 然后说说 EOP 方式: 仿真器肯定不会很有耐心地执行完程序的每一条指令,只要你的病毒所在宿主程序入口点足够的靠后,那你就胜利了一半,仿真器会因失去耐心而丢下你不管的。此时我想到了ExitProcess,聪明的你肯定明白了接下来将要干什么了,当然,当你知道这样做的时候,AV已经开始行动了,但关键是我们已经找到了一种对抗的思路,不是吗? 当然,还有一些抗技巧比如利用MMX指令或利用API传递控制等,但因这些技巧本身不会对启发式检测构成绝对威胁我也就不易一一举例了(好吧,我承认我是个懒人....)。 结尾分割线 启发式杀毒虽然目前说是对抗病毒的利器,但我一直感觉越是复杂越是高级的检测技术反而越脆弱,脆弱的原因就是太过于复杂,所谓智者千虑必有一失就是这么说的吧。在没有加密、没有多态病毒出现前,特征匹配技术对待病毒可以说是一剑封喉。也许越是简单的技术越是无懈可击。一次偶然间发现NOD可以仅用高级侦测模式,检测出被感染的文件,并精确的给出病毒名。才深深的发现或许启发式检测加适量的特征才应该是对抗病毒的最好武器吧。
|
|
|
用户系统信息:Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-CN; rv:1.9.1) Gecko/20090624 Firefox/3.5 (.NET CLR 3.5.30729)