迷雾重重
模糊过程的致命弱点也很容易掌握:在执行之前,被模糊的程序(不管是一段脚本或是一个可执行的程序)必须被解码。不管恶意软件分析师是否通过人工或自动化的方式来对一个模糊化的可执行程序进行分析,对恶意工具来说,其观念就是让程序能够对自身解码,然后在执行之前,抓取被解码程序的一个副本。这可以通过一个调试器(如IDAPro或Ollydbg),或通过一个专用工具如LordPE来实现。
从本质上说,分析师是利用恶意代码自身来为其进行解码的工作——分析师只是在最后一步做点儿工作,并获得结果。模糊技术的表现可能极为复杂,如果让恶意软件对自身解码,就可以将分析师从分析解码程序算法的负担中解放出来。
在某些情况下,当一种模糊工具被广泛使用时,就可以开发出新技术,并将其融合到现有的工具中,从而自动地识别和去除代码的模糊性。
如果解码方案相当简单,那么,还需要模糊性恶意软件吗?问题的答案在于反恶意软件产品如何工作。
如前所述,当今的多数反恶意软件工具主要仍基于签名。一段恶意代码的签名必须能够检查足够异常(不正常)的代码,不会因为将一个合法的程序确认为恶意软件而造成“似是而非”的情况。同时,签名还必须保持足够的通用性,不会因为代码的一点小小的改变就使其无效。
例如,如果一家安全厂商为上文所提到的被编码脚本编制了一个签名,那么,厂商应当针对这段代码的哪一部分启动触发?虽然对代码的 “eval(base64_decode())”进行触发很有诱惑性,但这样一个签名会造成似是而非的可能性。要知道,这些是内置的PHP函数,而且这种函数用法未必是唯一的。
这代表着攻击者的一个巨大胜利。如果他们想改变其脚本来避免被签名检测到,只需改变原始脚本中的变量名,从而形成一个完全不同的base64字符串。这种改变可能就像将变量”clicker”替换成“entre”一样简单,从而形成一个完全不同的编码串。
这种改变绝对不会影响到脚本的功能,却有可能避开为原始脚本所设计的签名。
对于可执行的代码部分,只需简单地改变用于原始可执行代码的包装器(或者,根据所使用的包装器,对代码进行多次包装,或者用多种不同的包装器进行包装等),就足以延长一段以前被安全软件所识别的可执行恶意代码的寿命。
不能败之,则取其器
很多情况下,反恶意软件厂商和恶意软件制作者之间的战斗是一个不断升级的过程。一方发现了某种技术,另一方反过来会再次改变招数。
在反病毒研究人员开始研究技术和工具来应对模糊代码时,恶意软件的公司早已快马加鞭,应用多层编码技术、混合编码机制等。不过,对这些制造模糊代码的人来说,安全分析师完全可以在性能遭受损失之前调整或改变代码。
恶意软件需要独辟蹊径来提高自己,使自己占领战略制高点,它需要不断地提升其技术水平。为了能够熟练地逃避逆向工程,恶意代码的编写者需要知道用来对付自己的各种工具。攻击者逃避逆向工程的最好的一种方法是使恶意代码执行一些类似于突破或破坏反恶意工具的操作。后文中,我们将看一下恶意软件作者如何使安全分析工具变成“睁眼瞎”。