反汇编引擎工作原理

在x86平台上使用的汇编指令对应的二进制机器码为Intel指令集-Opcode。

Inter指令手册中描述的指令由六部分组成,如图所示。

 结构图说明如下:

Instruction Prefixes:指令前缀

指令前缀是可选的,作为指令的补助说明信息存在,主要用于以下4种情况。

  • 重复指令:如REP、REPE、REPZ
  • 跨段指令:如MOV DWORD PTR FS:[XXXX],0
  • 将操作数从32位转为16位:如MOV AX,WORD PTR DS:[EAX]
  • 将地址从16位转为32位:如MOV EAX,DWORD PTR DS:[BX+SI]

Opcode:指令操作码

Opcode为机器码中的操作符部分,用来说明指令语句执行什么样的操作,如某条汇编语句是MOV、JMP还是CALL,Opcode为汇编指令语句的主要组成部分,是必不可少的。

汇编指令助记符与Opcode是一一对应关系。每一条汇编指令助记符都会对应一条Opcode码,但是由于操作数类型不同,所占长度不同,因此对于非单字节指令来说,解析一条汇编指令单凭Opcode是不够的,还需要Mode R/M、SIB、Displacement的帮助。

Mode R/M:操作数类型

Mode R/M是辅助Opcode解释汇编指令助记符后的操作数类型。R表示寄存器,M表示内存单元。Mode R/M占一个字节的固定长度。第6、7位可以描述4状态,分别用来描述第0、1、2位是寄存器还是内存单元,以及3中寻址方式。第3、4、5位用来辅助Opcode。

 SIB:辅助Mode R/M,计算地址偏移

SIB的寻址方式为基地址+变址,如MOV EAX,DWORD PTR DS:[EBX+ECX*2],其中的ECX,乘数2都是由SIB指定的。SIB占一个字节大小,第0,1,2位用来指定作为基地址的寄存器;第3,4,5位用来指定作为变址的寄存器;第6,7位用于指定乘数。

 Displacement:辅助Mode R/M,计算地址偏移

Displacement用于辅助SIB,如MOV EAX,DWORD PTR DS:[EBX+ECX*2+3]这条指令中,+3就是由Displacement指定的。

Immediate:立即数

用于解释指令语句中操作数作为一个常量值的情况。

原文地址:https://www.cnblogs.com/Virus-Faker/p/14813332.html