zoukankan      html  css  js  c++  java
  • 反汇编引擎工作原理

    在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:立即数

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

  • 相关阅读:
    Clean Code读书笔记
    Junit 断言 assertThat Hamcrest匹配器
    SpringMVC 常用注解
    SpringMVC 流程 配置 接口
    ng-select ng-options ng-repeat的用法与区别
    javascript总结
    intellij安装 配置 创建项目
    git常用操作指令
    springmvc报错 org.springframework.web.servlet.DispatcherServlet
    linux笔记:RPM软件包管理-源码包管理
  • 原文地址:https://www.cnblogs.com/Virus-Faker/p/14813332.html
Copyright © 2011-2022 走看看