x86汇编反编译到c语言之——(1)表达式求值及赋值语句
一. 反编译一种可能的实现方式
我们的目的是将多种平台的汇编如x86,ARM,6502反编译为c语言,所以实现时先将多种汇编转化为
特定虚拟机汇编语言,然后只需要将虚拟机汇编语言反编译为c语言。其中多种平台汇编语言到虚拟机汇编语言
也计划由程序通过学习自动完成。
二. 测试的C语句及编译后的x86汇编代码
int a;
int main(void) {
a = 2+3*4;
return 0;
}
1 lea rax, a
2 push rax
3 mov rax, 4
4 push rax
5 mov rax, 3
6 pop rdi
7 imul eax, edi
8 push rax
9 mov rax, 2
10 pop rdi
11 add eax, edi
12 pop rdi
13 mov [rdi], eax
三. x86汇编到虚拟机汇编
我们的目标是将上面的汇编反编译为c语言,在这个过程中先将汇编转化为虚拟机汇编语言。
这个算法只关注内存操作,因为c语言没有寄存器和栈的概念。
算法的执行如下,首先汇编的最后一句是内存操作,具体是写内存,算法会首先确定写的内存的具体地址,
通过观察这个地址在rdi寄存器中,修改rdi的为上一条语句"pop rdi",所以会查询哪句将地址压栈,具体会查询到
是第二行"push rax",然后追寻rax的值,追寻到为第一句"lea rax, a",至此具体内存地址确定了。
下面算法开始追寻eax的值,追寻到第11句"add eax, edi",这句可以理解为eax=eax+edi,所以下面的工作
为确定eax和edi的值,同时生成add虚拟机汇编语句。
eax的值在第9句"mov rax, 2"确定,此时确定了add虚拟机汇编语句的第一个操作数。edi的值在第10句
"pop rdi",所以查询哪句压栈了,找到第8句"push rax",所以查询谁修改了rax的值,查询到第7句
"imul eax, edi",这句可以理解为eax=eax*edi,所以下面追寻eax和edi的值,此时生成mul虚拟机汇编语句,
同时确定了add虚拟机汇编语句的第二个操作数。
eax在第5句"mov rax, 3"确定,此时确定mul虚拟机汇编语句的第一个操作数,edi由第6句"pop rdi"确定,
所以查询谁压栈了,查询到第4句"push rax",所以查询rax的值,结果为第3句"mov rax, 4",所以edi值确定为4,
此时确定mul虚拟机汇编语句的第二个操作数。
最后生成将值写入内存的虚拟机汇编语句。
四. 虚拟机汇编到c语言
1. 虚拟机汇编语言
设计的虚拟机是基于栈的,所以上面生成的语句code段部分可能如下。
|OP_CONSTANT|
|0|
|OP_CONSTANT|
|1|
|OP_CONSTANT|
|2|
|OP_MUL|
|OP_ADD|
|OP_SET_GLOBAL|
|3|
常量段为
|2|
|3|
|4|
|a|
上面的语句执行过程为,OP_CONSTANT会从常量段中取出对应下标的数字压入栈中,
OP_CONSTANT 0将2压入栈中,OP_CONSTANT 1将3压入栈中,OP_CONSTANT 2将4压入栈中,
OP_MUL将栈中最顶层的2个数弹出并计算他们的乘积,将结果压回栈中,这样栈中就是2和12,
OP_ADD将栈中最顶层的2个数弹出并计算他们的和,将结果压回栈中,这样栈中就是14。最后将栈顶的
14写回到变量a中。
2. 反编译为c语言
遇到OP_MUL,分析最近的两个压栈操作,这里是两个OP_CONSTANT,于是生成语句3*4,遇到指令
OP_ADD,分析最近的两个压栈操作,这里是OP_MUL和OP_CONSTANT,于是生成语句2+3*4。最后
OP_SET_GLOBAL寻找最近操作栈顶的操作,发现是OP_ADD,于是生成语句a = 2+3*4,至此x86汇编语言被
反编译为c语言。
x86汇编反编译到c语言之——(1)表达式求值及赋值语句的更多相关文章
- x86汇编反编译到c语言之——(2)if语句
一. 测试的C语句及编译后的x86汇编代码 int a; int b; int main(void) { int c; if (c) a = 4; else b = 5; return 0; } 1 ...
- C/C++ 语言中的表达式求值
在此,首先向裘老师致敬! 裘宗燕:C/C++ 语言中的表达式求值 经常可以在一些讨论组里看到下面的提问:“谁知道下面C语句给n赋什么值?” m = 1; n = m+++m++; 最近有位不相识的朋友 ...
- C/C++ 语言中的表达式求值(原文作者:裘宗燕)
经常可以在一些讨论组里看到下面的提问:“谁知道下面C语句给n赋什么值?”m = 1; n = m+++m++;最近有位不相识的朋友发email给我,问为什么在某个C++系统里,下面表达式打印出两个4, ...
- C语言 写的 表达式求值。
有不对的地方还望指出来,让我改正.谢谢.存一个代码 #include<stdio.h> #include<stdlib.h> #include<string.h> ...
- C语言之四则运算表达式求值(链栈)—支持浮点型数据,负数, 整型数据运算
运算符间的优先级关系: 链栈结构体定义: 数据域使用字符串长度为20的字符数组(故需要注意判断读取的字符串是运算符还是数值) 可支持浮点型数据,负数, 整型数据的运算 float EvaluateE ...
- 利用栈实现算术表达式求值(Java语言描述)
利用栈实现算术表达式求值(Java语言描述) 算术表达式求值是栈的典型应用,自己写栈,实现Java栈算术表达式求值,涉及栈,编译原理方面的知识.声明:部分代码参考自茫茫大海的专栏. 链栈的实现: pa ...
- 数据结构算法C语言实现(八)--- 3.2栈的应用举例:迷宫求解与表达式求值
一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚, ...
- 数据结构课程设计四则运算表达式求值(C语言版)
本系统为四则运算表达式求值系统,用于带小括号的一定范围内正负数的四则运算标准(中缀)表达式的求值.注意事项: 1.请保证输入的四则表达式的合法性.输入的中缀表达式中只能含有英文符号"+ ...
- 表达式求值--数据结构C语言算法实现
这篇博客介绍的表达式求值是用C语言实现的,只使用了c++里面的引用. 数据结构课本上的一个例题,但是看起来很简单,实现却遇到了很多问题. 这个题需要构建两个栈,一个用来存储运算符OPTR, 一个用来存 ...
随机推荐
- SpringBoot入门07-Thymeleaf中显示ajax请求到的数据
Thymeleaf中显示ajax请求所需依赖 <!--所需依赖--><dependency> <groupId>org.springframework.boot&l ...
- python中dump与dumps实现序列化
前言 使用中如果我们想把python可识别对象的dict类型的数据通过str类型写入文件或者存入变量中就需要用到dump与dumps 详解 dump 1.新建个dict文件,然后将dict文件存入一个 ...
- 手摸手教你用 yapi-to-typescript生成Yapi的TypeScript数据类型
一 背景 现代社会比较重视效率,本着这个思想宗旨,能用工具自动高效做的事情,就不要低质量的勤奋.yapi-to-typescript就是一款自动生成接口请求与响应的typescript数据类型定义的工 ...
- 初学python-day11 函数3
函数 1. global关键字 修改全局变量,声明函数内外使用同一个变量 示例: 1 name = 'xiaoming' 2 3 def test(): 4 global name 5 name = ...
- 寻找写代码感觉(八)之SpringBoot过滤器的使用
一.什么是过滤器? 过滤器是对数据进行过滤,预处理过程,当我们访问网站时,有时候会发布一些敏感信息,发完以后有的会用*替代,还有就是登陆权限控制等,一个资源,没有经过授权,肯定是不能让用户随便访问的, ...
- poi实现生成下拉选
在我们日常开发中,经常需要使用poi操作excel文件,现在就简单介绍一下在poi中是如何生成下拉选的. 1.创建workbook 2.创建数据约束 3.设置数据的有效性 @Test public v ...
- vs2017和Qt5的字符编码问题
默认vs2017的源文件字符编码是gbk的格式,Qt5的内部字符编码为utf8的格式,Qt5又去掉了设置字符串的接口,这样在源文件中使用了字符串之后,就会出现乱码问题,对原有代码逐个修改字符串是不可能 ...
- Python之@property详解及底层实现介绍
转自:https://blog.csdn.net/weixin_42681866/article/details/83376484 前文 Python内置有三大装饰器:@staticmethod(静态 ...
- Spring:面向切面编程的AOP
一.前言 除了依赖注入(DI),Spring框架提供的另一个核心功能是对面向方面的编程(AOP)的支持. AOP通常被称为实现横切关注点的工具.横切关注点一词是指应用程序中的逻辑不能与应用程序的其余部 ...
- single-number leetcode C++
Given an array of integers, every element appears twice except for one. Find that single one. Note: ...