PC逆向之代码还原技术,第三讲汇编中加法的代码还原

一丶汇编简介

在讲解加法的代码还原之前.我们首先要知道. 加法在汇编中对应的指令是什么.

Add 汇编指令. Add x,y 将x的值 加上y 并且重新赋值给x

二丶高级代码对应汇编观看.

观看如下代码

int main(int argc, char* argv[])
{ 1 + 2;
int nValue = 10 + 2; //常量 + 常量
int nVar = nValue + 10; //变量 + 常量
int nVar3 = nValue + nVar; //变量 + 变量
return 0;
}

有四种方式

第一种 直接 空语句 1 + 2 ;

第二种 常量 + 常量

第三种 变量 + 常量

第四种 变量 + 变量

1.代码还原解析:

代码还原解析需要了解的知识:

reg: 代表任意通用寄存器

imm: 立即数,可以看做常量

? : 代表任意数值.可以 [ebp -?]可以确定那个变量,变量是在栈中存放的.

  • 第一种方式

    此语句并不会产生作用.所以不会产生对应的汇编代码.

  • 第二种方式

    常量 + 常量 会在编译的时候直接进行优化. 如上面代码 10 + 2 产生的对应汇编代码为

mov [ebp - ?],0xC
  • 第三种方式:

第三种方式是变量+ 常量. 在汇编中.变量 + 常量并不能直接操作.需要交给寄存器进行中转

所以会产生如下表达式

mov reg,[ebp - ?]
add reg,imm
mov [ebp - ?],reg

上面代码对应:

.text:0040126F                 mov     eax, [ebp+ - 4]
.text:00401272 add eax, 0Ah
.text:00401275 mov [ebp - 4], eax
  • 第四种方式

    第四种方式 变量+变量

变量 + 变量 不用想,肯定是交给寄存器中转.

产生代码定式:

mov reg,[ebp - ?]
add reg,[ebp - ?]
mov [ebp - ?],reg

上面代码产生的汇编代码.IDA中查看.

.text:00401278                 mov     ecx, [ebp+var_4]
.text:0040127B add ecx, [ebp+var_8]
.text:0040127E mov [ebp+var_C], ecx

三丶根据上图完整汇编代码进行还原总结

text:00401250 _main_0         proc near               ; CODE XREF: _main↑j
.text:00401250
.text:00401250 var_4C = byte ptr -4Ch
.text:00401250 var_C = dword ptr -0Ch
.text:00401250 var_8 = dword ptr -8
.text:00401250 var_4 = dword ptr -4 .text:00401268 mov [ebp+var_4], 0Ch 常量赋值给变量 .text:0040126F mov eax, [ebp+var_4] 三句代码可以看成一句
.text:00401272 add eax, 0Ah 变量 + 常量
.text:00401275 mov [ebp+var_8], eax .text:00401278 mov ecx, [ebp+var_4] 三句代码可以看成一句
.text:0040127B add ecx, [ebp+var_8] 变量 + 变量 结果给变量
.text:0040127E mov [ebp+var_C], ecx
.text:00401289 _main_0 endp
.text:00401289

总结

根据上面加法的代码以及汇编对应的代码.我们可以产生代码定式

常量 + 常量 常量直接进行优化.不会产生汇编代码.如果赋值给变量则产生汇编代码

mov [ebp - ?],imm

常量 + 变量 赋值给变量 会产生汇编代码.此时我们心中要知道.如果操作变量相加.则肯定需要寄存器

中转.所以会产生汇编代码

mov reg,[ebp - ?]
add reg,imm
mov [ebp - ?] reg

变量 + 变量 赋值给变量 操作了变量.那么心中自然知道.会操作寄存器. 而汇编允许寄存器+栈中的值

所以可以产生代码定式

mov reg,[ebp - 4] 变量1
add reg,[ebp - 8] 变量2
mov [ebp - c],reg 变量3
三个代码可以看成 变量 + 变量 赋值给了变量

注意:上面为Debug版本下产生的代码定式. 在Releas下会进行优化.

在Releas下我们上面的代码会直接优化,没有产生任何汇编代码.

原因是: 常量传播 窥孔优化 常量折叠. 因为上面代码我们并没有用. 无意义的代码.所以不断进行优化就会优化没有.

可以参考本人编写的详细博客: 博客链接

PC逆向之代码还原技术,第三讲汇编中加法的代码还原的更多相关文章

  1. PC逆向之代码还原技术,第五讲汇编中乘法的代码还原

    目录 PC逆向之代码还原技术,第五讲汇编中乘法的代码还原 一丶简介乘法指令 1.乘法指令 2.代码还原注意问题 二丶乘法的汇编代码产生的格式 1.高级代码观看 2.乘法的汇编代码还原. 三丶乘法总结 ...

  2. 好代码是管出来的——.Net中的代码规范工具及使用

    上一篇文章介绍了编码标准中一些常用的工具,本篇就具体来介绍如何使用它们来完成代码管理. 本文主要内容有: Roslyn简介 开发基于Roslyn的代码分析器 常用的基于Roslyn的代码分析器 在.N ...

  3. PC逆向之代码还原技术,第六讲汇编中除法代码还原以及原理第二讲,被除数是正数 除数非2的幂

    目录 一丶简介 二丶代码还原讲解 1.被除数无符号 除数非2的幂 2.被除数无符号 除数为特例7 三丶代码还原总结 一丶简介 上一篇博客说的除2的幂. 如果被除数是有符号的,那么会进行调整,并使用位操 ...

  4. 【图片+代码】:GCC 链接过程中的【重定位】过程分析

    作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++.嵌入式.Linux. 关注下方公众号,回复[书籍],获取 Linux.嵌入式领域经典书籍:回复[PDF],获取所有原创文章( PDF 格式). ...

  5. git 一般的开发流程中的代码管理

    一般的开发流程中的代码管理 1. 从版本库中下载代码 git clone ssh://wenbin@192.168.1.3:29418/mustang-web 2. 针对某个feature(比如ins ...

  6. Net中的代码规范工具及使用

    Net中的代码规范工具及使用 https://www.cnblogs.com/selimsong/p/9209254.html 上一篇文章介绍了编码标准中一些常用的工具,本篇就具体来介绍如何使用它们来 ...

  7. PC逆向之代码还原技术,第四讲汇编中减法的代码还原

    目录 PC逆向之代码还原技术,第四讲汇编中减法的代码还原 一丶汇编简介 二丶高级代码对应汇编观看. 1.代码还原解析: 三丶根据高级代码IDA反汇编的完整代码 四丶知识总结 PC逆向之代码还原技术,第 ...

  8. PC逆向之代码还原技术,第二讲寻找程序入口点

    PC逆向之代码还原技术,第二讲寻找程序入口点 一丶简介 程序逆向的时候.我们需要知道程序入口点.动态分析的时候以便于看是什么程序编写的. 比如VC++6.0 我们可以写一个程序测试一下 我们写一段代码 ...

  9. PC逆向之代码还原技术,第一讲基本数据类型在内存中的表现形式.浮点,指针寻址公式

    目录 代码还原技术 一丶简介代码还原 二丶代码还原中的数据类型表现形式 1.整数类型 2.无符号整数 3.有符号整数 4.浮点数数据类型 5.浮点编码 4.Double类型解析. 三丶浮点汇编 1.浮 ...

随机推荐

  1. 2018 Multi-University Training Contest 3 - HDU Contest

    题解: solution Code: A. Ascending Rating #include<cstdio> const int N=10000010; int T,n,m,k,P,Q, ...

  2. Gcd&Exgcd算法学习小记

    Preface 对于许多数论问题,都需要涉及到Gcd,求解Gcd,常常使用欧几里得算法,以前也只是背下来,没有真正了解并证明过. 对于许多求解问题,可以列出贝祖方程:ax+by=Gcd(a,b),用E ...

  3. Luogu 3384 【模板】树链剖分

    题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节点的值都加上z 操作2: 格式 ...

  4. golang ntp协议客户端

    NTP(Network Time Protocol,网络时间协议)是由RFC 1305定义的时间同步协议,用来在分布式时间服务器和客户端之间进行时间同步.NTP基于UDP报文进行传输,使用的UDP端口 ...

  5. 【C语言】多项式加法(mooc第七周测试题)

    这个小题目吧我折磨的够呛,,主要在于特殊情况考虑不周,测试用例老是通不过.. 小结: 做法:用一个数组来存储多项式,用下标表示幂次数,数组元素值表示对应系数 输出特殊格式考虑:系数和幂次数为0,1,- ...

  6. jieba库与好玩的词云的学习与应用实现

    经过了一些学习与一些十分有意义的锻(zhe)炼(mo),我决定尝试一手新接触的python第三方库 ——jieba库! 这是一个极其优秀且强大的第三方库,可以对一个文本文件的所有内容进行识别,分词,甚 ...

  7. ajax一些东西

    jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为String类型的参数,请求方式(p ...

  8. MSSQL事务隔离级别详解(SET TRANSACTION ISOLATION LEVEL)

    控制到 Transact-SQL 的连接发出的 SQL Server 语句的锁定行为和行版本控制行为. TRANSACT-SQL 语法约定 语法   -- Syntax for SQL Server ...

  9. 高性能网络服务器编程:为什么linux下epoll是最好,Netty要比NIO.2好?

    基本的IO编程过程(包括网络IO和文件IO)是,打开文件描述符(windows是handler,java是stream或channel),多路捕获(Multiplexe,即select和poll和ep ...

  10. [Swift]LeetCode140. 单词拆分 II | Word Break II

    Given a non-empty string s and a dictionary wordDict containing a list of non-empty words, add space ...