我可以得到关于什么是操作码序列以及如何在PE32文件中找到它们的解释吗?
我正在尝试从PE32文件中提取它们。
什么是操作码序列
CPU指令由1到多个字节组成,这些字节中的每个都有不同的含义。
操作码(操作码)是指令的一部分,用于定义指令本身的行为(例如,该指令是'ADD'或'XOR',NOP等)。
对于x86 / x64 CPU(IA-32; Intel linguo中的IA-32e),一条指令至少由一个操作码(1到3个字节)组成,但可以带有多个其他字节(各种前缀,ModR / M, SIB,Disp。和Imm。),具体取决于其编码:
操作码通常是“指令”的同义词(因为操作码定义了指令的行为);因此,当您有多条指令时,您将获得一个操作码序列(这是一个误称,因为它实际上是一个指令序列,除非序列中的所有指令仅由操作码组成)。
如何在PE32文件中找到它们?
由于指令的长度可能是多个字节,所以您不能仅从.text节中的随机位置开始(对于PE文件,该位置包含程序的可执行代码)。 PE文件中有一个特定的位置,称为“入口”,它定义了程序的开始。
PE文件的入口点由AddressOfEntryPoint
结构的IMAGE_OPTIONAL_HEADER
成员(PE标头结构的一部分)给出。请注意,此成员是IMAGE_OPTIONAL_HEADER
,而不是“完整” VA。
从那里您知道您正处于教学开始。从这一点开始,您可以按照说明的编码规则开始分解/计数指令(这些规则在Intel和AMD手册中进行了详细说明)。
大多数指令是“失败的”,这意味着一旦执行了一条指令,下一条将执行下一条(这似乎很明显,但是!)。诀窍是当有一条不掉线的指令时,您必须知道该指令的作用以继续拆卸(例如,它可能会跳到某个地方,转到特定的处理程序,等等)