虽然已经有了上文所描述的逃避安全分析和研究人员的各种“最佳方法”,但恶意软件的作者们还在利用各种技术来阻止利用逆向工程对其代码进行分析的安全分析师。
高级规避:阻止逆向工程
首先,我们(即用户或受害者)需要通过逆向工程来分析检查恶意软件的作者期望获得什么。然后,我们就可以确定如果实施了特定的一种技术方案是否会将恶意软件作者苦苦寻求的利益拱手送出去,更为重要的是,从安全的观点来看,我们也会开始寻求对付他们的方法。
阻止逆向工程的技术方法有两个主要的目的:一是隐藏恶意企图,二是扰乱或阻止逆向工程工具。
代码模糊技术和编码技术一样,已经出道很多年了,且在恶意软件之外的领域都有着很强的生命力。许多商业应用程序使用这些技术来保护其合法的商业秘密。许多恶意代码的作者和逆向工程师也已经瞄准了这种技术,用以保护其恶意程序。
在实施时,代码模糊技术与编码技术有很大不同,但其本质上基于一个观念:对软件指令进行编码,使其保持“安静”,使其看起来不可理解,然后在执行恶意指令之前利用一段真正可执行的“残余”指令直接对原始的指令解码。被模糊化的代码在恶意软件对其解码并执行之前可能看起来就是毫无意义的数据。例如,请看下面这段令人费解的PHP代码:
在这里,恶意软件的作者使用了一个base_64decode()调用来对看似毫无意义的字符串进行解码,使其变成攻击代码。恶意软件所使用的工具和技术,在执行类似动作时,都是对更加复杂的模糊脚本或可执行代码进行操作。
代码包装器与这类脚本模糊的可执行代码是同种东西。代码包装器通过将一个可执行程序进行编码,然后在被编码数据的开头位置插入一段简短的“解码”程序,此后就启动被解码的程序,如上面的例子所展示的那样。
注意,这是一段极端简短的代码。特别是这段简短的加载器通常会处理如加载动态链接库等操作。
对于这种可执行的模糊代码,我们需要注意其多态性。多态性背后的观念很容易理解:将复杂的程序分解,并可以通过多种方式组装起来。例如,有一种工具,可以通过一段可执行代码来查找并发现指令,然后用随机选择的乱七八糟的东西来替换这些指令,使得恶意程序很难与检测恶意代码的反恶意程序中的签名匹配。事实上,多态性可以工作在更为复杂的水平上,但其理念都是用功能性对等的东西来替换代码块。
上述例子中的指令是使用eval()函数来解码并执行的,因而会产生下面这段可被识别的代码:
这段代码揭示了一段PHP脚本,它能够将易遭受RFI漏洞攻击的机器信息(入站URI、操作系统类型、是否启用了PHP的安全模式等)发送给恶意程序的作者。
其实,代码包装工具还是有很多的,每一种都是上述包装观念的变种, Mporphine就是其中很著名的一个。