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. centos7搭建zabbix3.0监控系统

    关闭防火墙和selinux systemctl stop firewalld.service                (停止防火墙) systemctl disable firewalld.se ...

  2. 如何使用$.each()与$().each()以及他们的区别

    1.首先,说下$.each(Arry/Object,function(index,val){ //index表示下标,val表示下标对应的值 }) 下面是使用$.each()的几种类型,其中arr2与 ...

  3. IE控件cab包手动安装

    一.XP系统 第1步:先解压cab包,在解压的文件中找到*.inf文件,然后右击,选择安装,此时会把解压文件拷到C:Windows\System32文件夹下.第2步:注册拷到上述文件夹下的ocx文件. ...

  4. sublime设置sublimeREPL-python-run current file 快捷键

    弄了3个小时的快捷键,一直不能成功使用,百度上一堆一样的方法,最后FQ才找到能用的方法,真是服了. 方法: ①首选项->快捷键设置 填写如下内容: [ {"keys": [& ...

  5. python 错误记录

    class Func: d = dict() def __setitem__(self, key, value): # xxx object does not support item assignm ...

  6. DevOps详解

    最近我阅读了很多有关DevOps的文章,其中一些非常有趣,然而一些内容也很欠考虑.貌似很多人越来越坚定地在DevOps与chef.puppet或Docker容器的熟练运用方面划了等号.对此我有不同看法 ...

  7. Java面经

    转载:[Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)   原文:http://www.cnblogs.com/wang-meng/p/5 ...

  8. git 本地同步分支数,删除远程已经删除掉的多余分支

    git remote show orgin  (展示当前本地分支和远程上的分支差异,多余分支后会被标注 use 'git remote prune' to remove.) git remote pr ...

  9. unittest批量执行测试用例

    现有四个测试用例分别在两个.py文件中,如何执行这些文件? unittest中有这样处理:unittest.TestLoader().discover() 第一个文件test_case1.py fro ...

  10. 【RL-TCPnet网络教程】第33章 SMTP简单邮件传输协议基础知识

    第33章      SMTP简单邮件传输协议基础知识 本章节为大家讲解SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)的基础知识,方便后面章节的实战操作. (本 ...