目录

指令格式及操作数解析归类

对于不同类别如何处理

MOD=0

MOD=1/2/3

SIB解析

前缀解析

关于ESP和EBP为什么被用来特殊寻址


指令格式及操作数解析归类

  指令格式一般是按照intel给出的指令格式作为基础,然后再扩充一些反编译过程中会用到的元素,诸如源和目的操作数的顺序,反编译时候的地址等信息。

  至于操作数类别,还是按照intel手册上的分类来的,诸如E、G、I等种类。对于不同种类需要做不同的处理。

图1指令格式及操作数解析归类

  至于右上角那个数组,是为了方便编程。因为最后要用汇编语言来表示结果,恰好各个寄存器也是顺序编号的,就用数组来索引了。


对于不同类别如何处理

图2 对于不同类别如何处理1

图3 对于不同类别如何处理2

对于不同的操作数类别做不同的处理,流程图中应该很详细了。

如果有的操作数需要MODR/M和SIB域该怎么处理呢?像E这个类别


MOD=0

图4 MOD=0如何处理

  根据是否有前缀做分类处理

  根据R/M的值做分类,比较特殊的是R/M==4和R/M==5的,也就是轮到esp和ebp了,要搞特殊化了。后面会说原因的。


MOD=1/2/3

图5 MOD=1/2/3如何处理

  还是根据前缀是否存在和R/M的特殊值来做处理。比较奇怪的是R/M==5,也就是ebp这个时候倒正常了。


SIB解析

图6 SIB解析

  可以看到SIB的处理里面特殊的情况比较多,只能一条条慢慢实现了。


前缀解析

图7 前缀解析

  前缀的处理出要要关注两点,一个是前缀不可能无限多,第二个就是要处理重复的前缀。像右下角的例子,group1出现了两次,那么重复的前缀及其之前的前缀都无效了。


关于ESP和EBP为什么被用来特殊寻址

图8 关于ESP和EBP为什么被用来特殊寻址

  这个是我在邓志的个人主站上找到答案的。非常感谢。膜拜大神。

  对ebp做的特殊处理就是ebp不能单独以[ebp]形式参与寻址,要么用立即数取代,要么用[ebp+disp]形式。

  而关于esp做的特殊处理,我想完全是因为找不到合适的寄存器了,才让[esp]这种形式承担SIB的义务。但是[esp]这种形式承担了SIB的义务,那么编译器就想用[esp]这种形式怎么办,你说不给我[ebp]这种形式,是因为他是基址寄存器,不让单独用,我接受这个理由了。难道[esp]你还来一个规定吗?intel没有做特殊规定,为了表示出[esp]这种形式,让index==4(即ESP)时,scale*index=0,这样base==4(ESP)时候,就存在[esp]这样的形式了。


比较low的opcode map表

图9 opcode_map表

  其实上面说了那么多,就是为了这一张表,按照intel的map表转化为自己的程序能识别的格式,我这个比较low,完全是照着intel的表格抄了一份。

转载于:https://www.cnblogs.com/shangye/p/6183597.html

反汇编引擎实现——流程分析相关推荐

  1. Google原生输入法LatinIME引擎初始化流程分析(二)

    引擎初始化首先是在Java层调用native的初始化方法,Java层调用如下: private void initPinyinEngine() {byte usr_dict[];usr_dict = ...

  2. DbgPrint 函数流程分析

    DbgPrint 函数流程分析 前言 Windows 下编写内核驱动时经常用到 DbgPrint 函数输出一些调试信息,用来辅助调试.当正在用 WinDbg 内核调试时,调试信息会输出到 WinDbg ...

  3. 驰骋工作流引擎的流程属性-节点属性-前台操作

    1:    工作流引擎功能-流程属性 •    支持客户参与流程:比如在一个erp系统里供应商相对企业来说是外部用户,在一个学校系统里,教师是内部用户,学生是外部用户.ccflow支持外部用户登录参与 ...

  4. 【逆向】UE4 渲染流程分析

    UE4作为当今商业引擎界的大佬,渲染和图形质量一直是首屈一指的水准,但是相对于unity来说UE4基本上是一套完整方案提供,不通过源码修改对渲染进行定制的可能性比较小,而且同时UE4这方面的文档很少, ...

  5. 【网络安全】Metasploit生成的Shellcode的导入函数解析以及执行流程分析(2)

    密码破解的利器--彩虹表(rainbow table) 确定 shellcode 依赖于哪些导入将使研究人员进一步了解其其余逻辑.不用动态分析shellcode,并且考虑到研究人员已经弄清楚了上面的哈 ...

  6. HDFS2.x之RPC流程分析

    HDFS2.x之RPC流程分析 1 概述 Hadoop提供了一个统一的RPC机制来处理client-namenode, namenode-dataname,client-dataname之间的通信.R ...

  7. 16.U-boot的工作流程分析-2440

    16.U-boot的工作流程分析-2440 分析的流程: 程序入口 第一阶段程序分析 第二阶段程序分析 2440开发板: 1.uboot的入口: 要看uboot工程的入口,首先打开顶层目录的Makef ...

  8. mysql 8.0 一条insert语句的具体执行流程分析(三)

    代码版本:mysql 8.0.22 编程语言:c++ && c++11 && c++14 && c++17 上一篇文章:mysql 8.0 一条inse ...

  9. mysql 8.0 一条insert语句的具体执行流程分析(二)

    继续上一篇文章:mysql 8.0 一条insert语句的具体执行流程分析(一)_一缕阳光的博客-CSDN博客 由于最近换工作一直在试用期内,在拼命的学习.总结中,因此没有时间写文章,今天转正了腾出来 ...

最新文章

  1. [BZOJ2653]middle
  2. 一条路走不通了,就走另一条:
  3. 90.前端 :执行方法前提示功能
  4. 人工智能时代,怎样高效关注行业趋势、了解AI技术与落地?
  5. 运维如何逆袭?月薪30K的牛逼运维需要的知识,全在这里了
  6. leetcode-7-整数翻转
  7. The Definitive Guide to SWT and JFace 目录
  8. 取值方法_数据维度爆炸怎么办?详解 5 大常用的特征选择方法
  9. 精通Android开发 0
  10. SpringBoot的jar传递参数时,使用两个「--」横线来标记参数
  11. C#Socket同步异步通讯总结笔记
  12. CCF NOI1087 第K名
  13. Atitit  文件上传  架构设计 实现机制 解决方案  实践java php c#.net js javascript  c++ python
  14. 贝叶斯公式52张牌猜黑桃A策略
  15. python的easyocr图像文字识别
  16. 捡到的苹果手机怎么解id锁_苹果手机维修中软解与硬解的区别
  17. 毕业两年,只会Crud,侥幸通过面试定级 P6,没想到我也可以入职阿里!(面经分享)
  18. linux基础命令之一
  19. 一文让你知道测试职业到底有哪些发展方向
  20. localtime函数使用

热门文章

  1. 初学APM 行用性能管理/监控
  2. 女生告诉男生怎么样泡妹妹——《追MM秘籍》
  3. 将标准 C++ 视为一个新语言
  4. 都说它是年度Android机皇,都说它是年度Android机皇三星Note10到底怎么样
  5. 福建2022农民丰收节 国稻种芯:主会场活动在永泰隆重举办
  6. php ejs,EJS模板引擎实例详解
  7. 如何安装使用“聚宽” --- JQData
  8. 五、IPSec开源项目strongSwan
  9. 手机验证码登录与注册
  10. IDataParameter[]怎么创建