代码混淆是恶意软体的一个基石。代码越难分析,攻击者就能在雷达下更长时间潜行,隐藏其创作的全部能力。
代码混淆技术非常古老,形式多样,从源代码修改、操作码操作、打包层、虚拟机等各种方式应有尽有。
混淆技术在本地代码、脚本语言、.NET IL
和 Java 字节码
中都很常见。
作为防御者,重要的是能辨识这些伎俩,并拥有能处理这些情况的工具。理解媒介的能力至关重要,以确定什么是垃圾、什么是代码,什么可能仅仅是数据显示的工具错误。
在攻击者一方,要开发代码混淆,必须具备某些先决条件。攻击者需要工具和文档,来帮助他们编写和调试复杂的代码流程。
对于二进制实现,如 本地代码
或 IL
,这涉及到目标文件格式的规范、操作码指令集的文档、反汇编工具、组合器和能够调试的调试器。
其中一种尚未普遍混淆的代码格式是 Visual Basic 6 P-Code
字节流。这是一种专有的操作码集,使用复杂的文件格式,并且可用的工具有限。
在探索这个指令集的过程中,出现了几个问题:
VB6 P-Code
可以在字节流层面上混淆吗?- 这一情况是否在野外的样本中发生过?
- 这看起来会是什么样的?
- 我们是否拥有能够应对的工具?
背景
在继续之前,我们将简要介绍 VB6 P-Code
格式以及可用的工具。
VB6 P-Code
是一种专有的变长二进制指令集,由 VB6
虚拟机(msvbvm60.dll
)解释。
从文档上看,微软从未公开过 VB6
文件格式或操作码指令集的详细信息。操作码处理程序的名称是由某些逆向工程者从泄漏的调试符号中收集而来,且仅有少数运行时可用。
曾经有一个专注于 VB6
文件格式和 P-Code 指令集的逆向工程社区,即 vb-
decompiler.theautomaters.com,该论坛的镜像至今仍然可用[1]。
在工具方面,主要的反汇编工具包括 p32Disasm
、VB-Decompiler
、Semi-Vbdecompiler
和 WKTVBDE
P-Code 调试器。
在这些工具中,只有 Semi-Vbdecompiler 能显示完整的参数字节流,其他工具仅显示操作码字节。虽然还有几个私有的 P-Code 调试器,但
WKTVBDE
是唯一一个具有 P-Code 层级调试能力的公共工具。
至于操作码的含义,目前仍然缺乏详细的文档。除了通过名称直观了解,实际上你需要从源码编译自己的程序,进行反汇编,分析操作码处理程序,并调试本地运行时和
P-Code,才能深入理解其运作。
显而易见,理解 P-Code 的反汇编需要大量的信息,对于大多数逆向工程师来说,这仍然是一门相当神秘的技艺。
VB6 有混淆工具吗?
在为这系列博客进行研究时,我们以 25,000
个 P-Code 二进制样本开始,并使用各种指标进行了分析。
VB6
恶意软体用来混淆其意图的常见手法包括:
- 在源代码层面插入垃圾代码
- 包含大量的开源代码以增加二进制体积
- 随机化内部对象和方法名称
- 通常在预编译阶段进行
- 一些工具则在编译后进行
- 各种编码字串和数据隐藏
- 使用不同的技巧启动本地代码块,例如
CallWindowProc
截至目前,我们尚未在野外文档中记录到 P-Code 层级的操作。
由于这一矢量的复杂性,P-Code 混淆可能至今没有被察觉,这使其成为值得研究的有趣领域。我们将继续寻找样本。
VB P-Code 是否可以混淆,且这看起来会是什么样的?
在研究过程中,这是一个自然会出现的问题。我们也希望确保我们有足够的工具可以处理它。
考虑以下 VB6
源码:
默认的 P-Code 编译如下:
一个混淆过的样本可能看起来像这样:
从上面可以看到,多个在本地代码中常见的操作码混淆手法。
我们验证了这段代码运行良好,且不会对运行时造成任何问题。这个变异的文件已在 Virustotal
上提供,供供应商测试其工具的能力[2]。
以下是一些混淆手法的具体示例:
跳过垃圾:
跳入参数字节:
在运行时执行的为:
不执行的序列:
可能在反汇编工具中触发致命错误的无效序列:
检测
P-Code 混淆的最明显标记包括:
- 跳入其他指令的中间
- 不匹配的 for/next 操作码计数
- 无效/未定义的操作码
- 由编译器生成的非自然操作码序列
- 随机数据导致的参数解析错误
某些垃圾序列(例如 Not Not
)可能会因为程序的编码方式而正常出现。
这一层次的检测将需要一个能够准确、无误的反汇编引擎,且该引擎需对 VB6
文件格式的全部结构有所了解。
结论
对于恶意软体分析师来说,代码混淆是一个不容忽视的事实。文件格式如果越常见且文档越充分,则混淆工具出现的机会就越大。
这或许就是为什么像 .NET
和 Java
这样的复杂格式早期就出现了许多公开的混淆工具。
这项研究证明,VB6 P-Code
混淆也是完全可能的,并为我们确保在受到时间限制的事件响应之前,我们的工具能够处理此情况提供了机会。
这里探讨的技术也让我们能够寻找已经使用这种技术并潜伏多年进行攻击的高级威胁。
我们鼓励研究人员检查这个变异的样本 [2
],确保他们的框架能够无误地处理它。
参考资料
[1] vb-decompiler.theautomaters.com 镜像
http://sandsprite.com/vb-reversing/vb-decompiler/
[2] 变异 P-Code 样本 SHA256 和 VirusTotal 连结
标签:、、、、、、
分享:XFacebook