2.1 反汇编方法

反汇编是将恶意软件的二进制代码转换为有效的x86汇编语言的过程。恶意软件作者通常使用C或C++等高级语言编写恶意软件程序,然后使用编译器将源代码进行编译生成x86二进制代码。汇编语言是这种二进制代码的可读表示形式。因此,将恶意软件程序反汇编成汇编语言是了解其核心行为的必要手段。

不幸的是,反汇编并非易事,因为恶意软件作者经常使用一些技巧来阻挠逆向工程。事实上,面对故意的混淆,完美的反汇编是计算机科学中一个尚未解决的问题。目前,仅存在近似的、容易出错的方法可以用来反汇编这些程序。

例如,考虑自修改代码的情况,即在执行时修改自身的二进制代码。正确反汇编这段代码的唯一方法是理解代码修改自身的程序逻辑,但这可能非常复杂。

由于目前要达到完美的反汇编是不可能的,我们必须使用不完善的方法来完成这项任务。我们使用的方法是线性反汇编,这涉及在可移植可执行(PE)文件中识别那些与其x86程序代码相对应的连续字节序列,然后解码这些字节。这种方法的主要局限性是它忽略了CPU在程序执行过程中如何解码指令的细微差别。此外,它也无法解析恶意软件作者有时使用的使程序更难分析的各种混淆。

逆向工程的其他方法,如IDA Pro等专业级反汇编器使用的更复杂的反汇编方法,我们在这里就不讨论了。这些更高级的方法实际上是模拟或推理程序执行,以发现程序可能通过一系列条件分支达到哪些汇编指令。

尽管这种类型的反汇编比线性反汇编更精确,但它比线性反汇编方法占用的CPU资源要多得多,这使得它不太适合数据科学的目的,因为数据科学的重点是对数千甚至数百万的程序进行反汇编。

但是,在开始使用线性反汇编进行分析之前,你需要回顾一下汇编语言的基本组件。