检测和提取操作码序列

Detecting and extracting opcode sequences

我可以解释一下操作码序列是什么以及如何在 PE32 文件中找到它们吗?

我正在尝试从 PE32 文件中提取它们。

what opcode sequences are

一条CPU指令是由1到多个字节组成的,每个字节都有不同的含义。

操作码(操作码)是定义指令本身行为的指令的一部分(例如,该指令是 'ADD',或 'XOR',NOP, ETC。)。

对于 x86 / x64 CPUs(IA-32;英特尔语言中的 IA-32e)一条指令至少由一个操作码(1 到 3 个字节)组成,但可以带有多个其他字节(各种前缀,ModR/M、SIB、Disp. 和 Imm.)取决于其编码:

Opcode 通常是 "instruction" 的同义词(因为操作码定义了指令的行为);因此,当你有多个指令时,你就会有一个操作码序列(这有点用词不当,因为它实际上是一个指令序列,除非序列中的所有指令都只由操作码组成)。

how to find them in PE32 files?

由于指令可能有多个字节长,您不能只从 .text 部分中的随机位置开始(对于 PE 文件,该部分包含程序的可执行代码)。 PE 文件中有一个特定位置 - 称为 "entry point" - 它定义了程序的开始。

PE 文件的入口点由 IMAGE_OPTIONAL_HEADER structure (parts of the PE header structures). Note that this member is an RVAAddressOfEntryPoint 成员给出,而不是 "full" VA。

从那里你知道你在指令的开始。您可以从这里开始反汇编/计数指令,遵循指令的编码规则(这些规则在 Intel 和 AMD 手册中有很长的解释)。

大多数指令是"fall-through",这意味着一旦执行了一条指令,下一条要执行的就是下一条(这似乎很明显,但是!)。诀窍是当有一个非 fall-through 指令时,你必须知道这个指令做了什么才能继续你的反汇编(例如它可能跳到某个地方,转到特定的处理程序等)

使用radare 2库,它可以非常快速地提取操作码序列。