反汇编引擎实现——流程分析
目录
指令格式及操作数解析归类
对于不同类别如何处理
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
反汇编引擎实现——流程分析相关推荐
- Google原生输入法LatinIME引擎初始化流程分析(二)
引擎初始化首先是在Java层调用native的初始化方法,Java层调用如下: private void initPinyinEngine() {byte usr_dict[];usr_dict = ...
- DbgPrint 函数流程分析
DbgPrint 函数流程分析 前言 Windows 下编写内核驱动时经常用到 DbgPrint 函数输出一些调试信息,用来辅助调试.当正在用 WinDbg 内核调试时,调试信息会输出到 WinDbg ...
- 驰骋工作流引擎的流程属性-节点属性-前台操作
1: 工作流引擎功能-流程属性 • 支持客户参与流程:比如在一个erp系统里供应商相对企业来说是外部用户,在一个学校系统里,教师是内部用户,学生是外部用户.ccflow支持外部用户登录参与 ...
- 【逆向】UE4 渲染流程分析
UE4作为当今商业引擎界的大佬,渲染和图形质量一直是首屈一指的水准,但是相对于unity来说UE4基本上是一套完整方案提供,不通过源码修改对渲染进行定制的可能性比较小,而且同时UE4这方面的文档很少, ...
- 【网络安全】Metasploit生成的Shellcode的导入函数解析以及执行流程分析(2)
密码破解的利器--彩虹表(rainbow table) 确定 shellcode 依赖于哪些导入将使研究人员进一步了解其其余逻辑.不用动态分析shellcode,并且考虑到研究人员已经弄清楚了上面的哈 ...
- HDFS2.x之RPC流程分析
HDFS2.x之RPC流程分析 1 概述 Hadoop提供了一个统一的RPC机制来处理client-namenode, namenode-dataname,client-dataname之间的通信.R ...
- 16.U-boot的工作流程分析-2440
16.U-boot的工作流程分析-2440 分析的流程: 程序入口 第一阶段程序分析 第二阶段程序分析 2440开发板: 1.uboot的入口: 要看uboot工程的入口,首先打开顶层目录的Makef ...
- mysql 8.0 一条insert语句的具体执行流程分析(三)
代码版本:mysql 8.0.22 编程语言:c++ && c++11 && c++14 && c++17 上一篇文章:mysql 8.0 一条inse ...
- mysql 8.0 一条insert语句的具体执行流程分析(二)
继续上一篇文章:mysql 8.0 一条insert语句的具体执行流程分析(一)_一缕阳光的博客-CSDN博客 由于最近换工作一直在试用期内,在拼命的学习.总结中,因此没有时间写文章,今天转正了腾出来 ...
最新文章
- [BZOJ2653]middle
- 一条路走不通了,就走另一条:
- 90.前端 :执行方法前提示功能
- 人工智能时代,怎样高效关注行业趋势、了解AI技术与落地?
- 运维如何逆袭?月薪30K的牛逼运维需要的知识,全在这里了
- leetcode-7-整数翻转
- The Definitive Guide to SWT and JFace 目录
- 取值方法_数据维度爆炸怎么办?详解 5 大常用的特征选择方法
- 精通Android开发 0
- SpringBoot的jar传递参数时,使用两个「--」横线来标记参数
- C#Socket同步异步通讯总结笔记
- CCF NOI1087 第K名
- Atitit 文件上传 架构设计 实现机制 解决方案 实践java php c#.net js javascript c++ python
- 贝叶斯公式52张牌猜黑桃A策略
- python的easyocr图像文字识别
- 捡到的苹果手机怎么解id锁_苹果手机维修中软解与硬解的区别
- 毕业两年,只会Crud,侥幸通过面试定级 P6,没想到我也可以入职阿里!(面经分享)
- linux基础命令之一
- 一文让你知道测试职业到底有哪些发展方向
- localtime函数使用