PC逆向之代码还原技术,第三讲汇编中加法的代码还原
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逆向之代码还原技术,第三讲汇编中加法的代码还原的更多相关文章
- PC逆向之代码还原技术,第五讲汇编中乘法的代码还原
目录 PC逆向之代码还原技术,第五讲汇编中乘法的代码还原 一丶简介乘法指令 1.乘法指令 2.代码还原注意问题 二丶乘法的汇编代码产生的格式 1.高级代码观看 2.乘法的汇编代码还原. 三丶乘法总结 ...
- 好代码是管出来的——.Net中的代码规范工具及使用
上一篇文章介绍了编码标准中一些常用的工具,本篇就具体来介绍如何使用它们来完成代码管理. 本文主要内容有: Roslyn简介 开发基于Roslyn的代码分析器 常用的基于Roslyn的代码分析器 在.N ...
- PC逆向之代码还原技术,第六讲汇编中除法代码还原以及原理第二讲,被除数是正数 除数非2的幂
目录 一丶简介 二丶代码还原讲解 1.被除数无符号 除数非2的幂 2.被除数无符号 除数为特例7 三丶代码还原总结 一丶简介 上一篇博客说的除2的幂. 如果被除数是有符号的,那么会进行调整,并使用位操 ...
- 【图片+代码】:GCC 链接过程中的【重定位】过程分析
作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++.嵌入式.Linux. 关注下方公众号,回复[书籍],获取 Linux.嵌入式领域经典书籍:回复[PDF],获取所有原创文章( PDF 格式). ...
- git 一般的开发流程中的代码管理
一般的开发流程中的代码管理 1. 从版本库中下载代码 git clone ssh://wenbin@192.168.1.3:29418/mustang-web 2. 针对某个feature(比如ins ...
- Net中的代码规范工具及使用
Net中的代码规范工具及使用 https://www.cnblogs.com/selimsong/p/9209254.html 上一篇文章介绍了编码标准中一些常用的工具,本篇就具体来介绍如何使用它们来 ...
- PC逆向之代码还原技术,第四讲汇编中减法的代码还原
目录 PC逆向之代码还原技术,第四讲汇编中减法的代码还原 一丶汇编简介 二丶高级代码对应汇编观看. 1.代码还原解析: 三丶根据高级代码IDA反汇编的完整代码 四丶知识总结 PC逆向之代码还原技术,第 ...
- PC逆向之代码还原技术,第二讲寻找程序入口点
PC逆向之代码还原技术,第二讲寻找程序入口点 一丶简介 程序逆向的时候.我们需要知道程序入口点.动态分析的时候以便于看是什么程序编写的. 比如VC++6.0 我们可以写一个程序测试一下 我们写一段代码 ...
- PC逆向之代码还原技术,第一讲基本数据类型在内存中的表现形式.浮点,指针寻址公式
目录 代码还原技术 一丶简介代码还原 二丶代码还原中的数据类型表现形式 1.整数类型 2.无符号整数 3.有符号整数 4.浮点数数据类型 5.浮点编码 4.Double类型解析. 三丶浮点汇编 1.浮 ...
随机推荐
- Android中View的绘制流程(专题讲解)
Android中的UI视图有两种方式实现:.xml文件(实现代码和UI的分离)和代码实现. Android的UI框架基本概念: 1. Activity:基本的页面单元,Activity包含一个Wind ...
- box-shadow 画叮当猫
值 描述 h-shadow 必需.水平阴影的位置.允许负值 v-shadow 必需.垂直阴影的位置.允许负值 blur 可选.模糊距离 spread 可选.阴影的尺寸 color 可选.阴影的颜色.请 ...
- 机器学习(九)隐马尔可夫模型HMM
1.隐马尔可夫HMM模型 一个隐马尔可夫模型可以表示为\[\lambda=\{A,B,\pi\}\]具体就不说了,比较基本. 2.HMM模型的三个基本问题 1.概率计算问题:给定\(\lambda\) ...
- 微信小程序开发----微信开发者工具使用
新建项目选择小程序项目,选择代码存放的硬盘路径,填入刚刚申请到的小程序的 AppID,给你的项目起一个好听的名字,最后,勾选 "创建 QuickStart 项目" (注意: 你要选 ...
- Nginx的虚拟主机配置
虚拟主机技术能够让同一台服务器.同一组Nginx进程上运行多个网站,降低了资金和服务器资源的损耗.Nginx可以配置三种类型的虚拟主机,本文就是主要介绍这三种虚拟主机配置方式. 配置基于IP的虚拟主机 ...
- charles-web端开发者实用功能点
##网速模拟功能 throttle功能对于前端来说非常实用,可以看页面在低网速下的表现,从而找出优化的点. 在线上环境通常有些因为网速慢导致的bug,在本机无法重现,那时候就很抓瞎,如果嫌远程麻烦,推 ...
- 主流数据库连接池性能比较 hikari druid c3p0 dbcp jdbc
背景 对现有的数据库连接池做调研对比,综合性能,可靠性,稳定性,扩展性等因素选出推荐出最优的数据库连接池 . NOTE: 本文所有测试均是MySQL库 测试结论 1:性能方面 hikariCP> ...
- WordPress外链新窗口打开并使用php页面go跳转
之前浏览别人的博客网站,打开外链时会有一个等待时间的代码,虽然不知道有什么用,但觉的挺有档次..今天正好看到教程,就自己也加上了,就复制粘贴些代码可以了 首先创建一个php文件,名字随便,如果你不想改 ...
- [Swift]LeetCode114. 二叉树展开为链表 | Flatten Binary Tree to Linked List
Given a binary tree, flatten it to a linked list in-place. For example, given the following tree: 1 ...
- [Swift]LeetCode294. 翻转游戏之 II $ Flip Game II
You are playing the following Flip Game with your friend: Given a string that contains only these tw ...