一. 反编译一种可能的实现方式

  我们的目的是将多种平台的汇编如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)表达式求值及赋值语句的更多相关文章

  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 ...

  2. C/C++ 语言中的表达式求值

    在此,首先向裘老师致敬! 裘宗燕:C/C++ 语言中的表达式求值 经常可以在一些讨论组里看到下面的提问:“谁知道下面C语句给n赋什么值?” m = 1; n = m+++m++; 最近有位不相识的朋友 ...

  3. C/C++ 语言中的表达式求值(原文作者:裘宗燕)

    经常可以在一些讨论组里看到下面的提问:“谁知道下面C语句给n赋什么值?”m = 1; n = m+++m++;最近有位不相识的朋友发email给我,问为什么在某个C++系统里,下面表达式打印出两个4, ...

  4. C语言 写的 表达式求值。

    有不对的地方还望指出来,让我改正.谢谢.存一个代码 #include<stdio.h> #include<stdlib.h> #include<string.h> ...

  5. C语言之四则运算表达式求值(链栈)—支持浮点型数据,负数, 整型数据运算

     运算符间的优先级关系: 链栈结构体定义: 数据域使用字符串长度为20的字符数组(故需要注意判断读取的字符串是运算符还是数值) 可支持浮点型数据,负数, 整型数据的运算 float EvaluateE ...

  6. 利用栈实现算术表达式求值(Java语言描述)

    利用栈实现算术表达式求值(Java语言描述) 算术表达式求值是栈的典型应用,自己写栈,实现Java栈算术表达式求值,涉及栈,编译原理方面的知识.声明:部分代码参考自茫茫大海的专栏. 链栈的实现: pa ...

  7. 数据结构算法C语言实现(八)--- 3.2栈的应用举例:迷宫求解与表达式求值

    一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚, ...

  8. 数据结构课程设计四则运算表达式求值(C语言版)

    本系统为四则运算表达式求值系统,用于带小括号的一定范围内正负数的四则运算标准(中缀)表达式的求值.注意事项:    1.请保证输入的四则表达式的合法性.输入的中缀表达式中只能含有英文符号"+ ...

  9. 表达式求值--数据结构C语言算法实现

    这篇博客介绍的表达式求值是用C语言实现的,只使用了c++里面的引用. 数据结构课本上的一个例题,但是看起来很简单,实现却遇到了很多问题. 这个题需要构建两个栈,一个用来存储运算符OPTR, 一个用来存 ...

随机推荐

  1. exe图标消失的解决方案

    步骤 win + r组合键打开运行窗口 输入cmd,回车 在终端窗口右键粘贴即可 taskkill /im explorer.exe /f cd /d %userprofile%\appdata\lo ...

  2. 【UE4 C++ 基础知识】<14> 多线程——AsyncTask

    概念 AsyncTask AsyncTask 系统是一套基于线程池的异步任务处理系统.每创建一个AsyncTas,都会被加入到线程池中进行执行 AsyncTask 泛指 FAsyncTask 和 FA ...

  3. LeetCode:链表专题

    链表专题 参考了力扣加加对与链表专题的讲解,刷了些 leetcode 题,在此做一些记录,不然没几天就没印象了 出处:力扣加加-链表专题 总结 leetcode 中对于链表的定义 // 定义方式1: ...

  4. 你知道如何从单片机过渡到嵌入式linux需要经历那些吗?(这个亲身体验有效)

    就现在的行业发展来看只会单片机已经不吃香了并且在薪资待遇方面来看的话单片机的收入限制性太强可能工作很多年之后发现没有了成长空间,因此逐渐转到嵌入式Linux这个方向是越来越多的人的一个选择,那么接触了 ...

  5. vim实用插件

    转载:Vim 实用插件推荐(2017) - 知乎 (zhihu.com) 1.插件管理器 ----------------------------------------- Vundle.vim - ...

  6. Linux Shell Here Document

    Here Document 是一种有特殊用处的代码块,他使用IO重定向的形式记录了一段临时的文本或交互命令,并且把这些文本或命令 依次的传递给一个程序或一个命令,作为他运行时的标准输入. Here d ...

  7. Unmount and run xfs_repair

    参考连接:https://blog.csdn.net/qq_35022803/article/details/109287086 如故障图所示,sda3出现问题, 下面的解决办法: 解决办法: 原因: ...

  8. 一条指令优化引发的血案,性能狂掉50%,clang使用-ffast-math选项后变傻了

    https://www.cnblogs.com/bbqzsl/p/15510377.html 近期在做优化时,对一些函数分别在不同编译平台上进行bench测试.发现了不少问题. 现在拿其中一个问题来分 ...

  9. supervisor安装

    supervisor管理进程,是通过fork/exec的方式将这些被管理的进程当作supervisor的子进程来启动,所以我们只需要将要管理进程的可执行文件的路径添加到supervisor的配置文件中 ...

  10. 湖湘杯2020 writeup

    这个平台中间卡的离谱,卡完过后交了flag分还掉了 Web 题目名字不重要 也算是非预期吧,赛后y1ng师傅也说了因为要多端口环境必须这样配,预期解很难 NewWebsite 后台弱口令admin a ...