反汇编引擎的工作原理

版权声明:本文为YuanChuang文章,未经博主允许转载。 https://blog.csdn.net/zzy1448331580/article/details/83275757

OllyDBG和IDA都有一个很重要的功能:反汇编

在X86平台下使用的汇编指令对应的二进制机器码为Intel 指令集一Opcode,Intel指令手册中描述的指令由6部分组成:

Irsinucton Prefixes 指令前缀

Opcode 指令操作码

Mode R/M 操作数类型

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

Immedate 立即数 

Instuction Prefixes:指令前缀

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

重复指令:如REP、REPE\REPZ

扫描二维码关注公众号,回复: 5803775 查看本文章

跨段指令:如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码,但由于操作数类型不同,所占长度也不相同,因此对于非单字节指令来说,解析一条汇编指令单凭Opcode是不够的,还需要Mode R/M、SIB、 Displacement 的帮助,才能够完整地解析出汇编信息。

Mode RIM:操作数类型

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

SIB:輔助Mode R/M,計算地址偏移

SIB的尋址方式为基址+变址,如MOV EAX,DWORD PTR DS:EBX+ECX*2],其中的ECX、乘数乘数2都是由SIB来指定的。SIB占 I个字节大小,第0、I、2位用于指定作为基址的寄存器;第3、4、5位用于指定作内变址的寄存器;第6、7位用于指定乘数,由干只有两位,因此可以表示4种状志,这4种状态分別表示乘数为1、2、4、8.

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

Displacment用于輔助SIB,如Mov EAX.DWORD PTR DS(EBX+EC*2+3]这条指令,其中的“+3”是由Displacement来指定的.

Immediate:立即数

猜你喜欢

转载自blog.csdn.net/zzy1448331580/article/details/83275757