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

一丶汇编简介

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

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

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

观看如下代码

int main(int argc, char* argv[])
{
int nValue = 10 - 2; //常量 - 常量 给变量
int nVar = nValue - 10; //变量 - 常量
int nVar3 = nValue - nVar; //变量 - 变量
nVar3 = nValue - -5; //变量 - 负数常量 return 0;
}

有四种方式

第一种 常量 - 常量

第二种 变量 - 常量

第三种 变量 - 变量

第四种 变量 + 负数常量

1.代码还原解析:

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

reg: 代表任意通用寄存器

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

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

  • 第一种方式 常量 - 常量

    常量-常量 在编译器编译的时候. 优化的时候直接就已经计算出来了. 所以常量- 常量就是固定的值了.

    如果给变量则会使用mov指令将常量赋值给变量.

  • 第二种方式 变量 -常量

    变量 - 常量 .我们首先要知道.变量在汇编的角度来说.就是在栈中内存存储的. 而栈 - imm(立即数)

    在湖边中没有这种指令

    例如:

    sub [ebp - ?],10

    所以只要操作变量必然会操作一个寄存器进行操作.

    所以会产生以下代码定式:

mov reg,[ebp - ?]  获得变量值
sub reg,imm 用寄存器相减
mov [ebp - ?],reg 重新将寄存器的值赋值给某变量.
  • 第三种方式 变量 - 变量

    变量- 变量 我们通过第二种方式可以得知.操作变量的时候必然会使用寄存器.此时有两个变量.

    那么会不会操作两个寄存器?

    答: 不会操作两个寄存器. 汇编中支持 寄存器的值 跟 栈中内存的值 互相操作.

产生的代码定式:

mov reg,[ebp - 4]  获得第一个变量的值
sub reg,[ebp - 8] reg - 第二个变量的值. 结果给reg存储
mov [ebp - c[,reg 将结果利用mov赋值指令赋值给变量三.
  • 第四种方式 变量 - 负数

    首先操作了变量.那么肯定会操作寄存器. 而 - 负数 在数学中 负负得正. 所以负数在汇编中会被加上

    所以产生代码定式:
mov reg,[ebp - 4];
add reg,|负数| |负数| 这个代表负数的绝对值
mov [ebp - 8], reg

三丶根据高级代码IDA反汇编的完整代码


.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:00401250
.text:00401250 push ebp 保存栈低
.text:00401251 mov ebp, esp 指向新栈
.text:00401253 sub esp, 4Ch 开辟局部变量空间
.text:00401256 push ebx
.text:00401257 push esi
.text:00401258 push edi 保存寄存器环境
.text:00401259 lea edi, [ebp+var_4C] 获得局部变量空间首地址
.text:0040125C mov ecx, 13h
.text:00401261 mov eax, 0CCCCCCCCh
.text:00401266 rep stosd 利用rep 加串操作指令 stosd 按照4个字节.从 eax中取出cc值. 存放到 edi中. 循环次数 ecx控制. .text:00401268 mov [ebp+var_4], 8 常量赋值给变量 .text:0040126F mov eax, [ebp+var_4]
.text:00401272 sub eax, 0Ah var_8 = var_4 - 0xA
.text:00401275 mov [ebp+var_8], eax .text:00401278 mov ecx, [ebp+var_4]
.text:0040127B sub ecx, [ebp+var_8]
.text:0040127E mov [ebp+var_C], ecx var_c = var4 - var_8; .text:00401281 mov edx, [ebp+var_4]
.text:00401284 add edx, 5 var_c = var_4 + 5; 上方是 var_4 - -5 ,因为负负得正.所以汇编中使用加法了.
.text:00401287 mov [ebp+var_C], edx .text:0040128A xor eax, eax
.text:0040128C pop edi
.text:0040128D pop esi
.text:0040128E pop ebx
.text:0040128F mov esp, ebp
.text:00401291 pop ebp
.text:00401292 retn
.text:00401292 _main_0 endp

可以根据自己需求,将上面的代码进行还原. 当然还原出的高级代码可能跟我写的高级代码不一样.这是正常的.

但是如果还原正确.那么在IDA中.二进制十一摸一样的. 也就是汇编. 此时就算还原正确.

四丶知识总结

总体来讲. 如果是常量进行操作.则在编译期间直接运算完毕了. 如果操作变量则会操作通用寄存器.

使用通用寄存器进行计算.

最重要的一点: 计算机不会做加法.所以 我们的做减法运算的时候. 其实是按照补码存放的. 使用补码去操作的.

例如:

11 - 3 我们可以看做 11 + 3(补码)

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

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

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

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

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

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

  3. C++反汇编第四讲,反汇编中识别继承关系,父类,子类,成员对象

    C++反汇编第四讲,反汇编中识别继承关系,父类,子类,成员对象 讲解目录: 1.各类在内存中的表现形式   备注: 主要复习开发知识,和反汇编没有关系,但是是理解反汇编的前提.     2.子类继承父 ...

  4. 郑政 | 2021软件代码开发技术作业四 | 需求改进&系统设计

    需求改进&系统设计 -------------------------------------------------------------------------------------- ...

  5. 从0 开始 WPF MVVM 企业级框架实现与说明 ---- 第四讲 WPF中 ControlTemplate

    上讲我们介绍了DataTemplate,现在我们就介绍下ControlTemplate,可能后面大多在编码时候会出现一些英文,工作习惯,请见谅. ControlTemplate: 控件的外观,也就是控 ...

  6. 开发人员应该对IIS理论层的知识了解的多一些~第四讲 HttpModule中的几大事件

    返回目录 本文主要介绍HttpModule,它在一个网页请求过程中是一个怎样的过程是我们要知道的,在网页加载过程中HttpModule在何时被执行也是我们要知道的,以及,HttpModule在网页请求 ...

  7. 大型.NET商业软件代码保护技术 技术与实践相结合保护辛苦创造的劳动成果

    列举工作以来遇到的各种类型的软件所采用的代码保护技术,只讲原理不涉及技术细节实现,以避免产生法律问题.有些朋友说直接把代码放在Github开源下载,开源可以促进技术交流与进步,然而值钱的代码都积压在硬 ...

  8. ZH奶酪:PHP中添加HTML代码的三种方法

    php中添加HTML代码,就是php类型的文件中添加html代码~ 第一种是在HTML中加PHP. 大段大段的html代码中,在各个需要执行php的地方<?php .... ?> 比如 l ...

  9. php中嵌套html代码和html代码中嵌套php方式

    php中嵌套html代码和html代码中嵌套php方式 一.总结 拷贝的话直接html代码是极好的方式 1.php中嵌套html代码(本质是原生php):a.原生嵌套<?php .....?&g ...

随机推荐

  1. [BZOJ1925][SDOI2010]地精部落(DP)

    题意 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为 N 的山脉 H可分 为从左到右的 N 段,每段有一个独一无二的高度 Hi,其中Hi是1到N ...

  2. Java拦截器的实现原理

    对于某个类的A方法进行拦截,在A执行前插入一段代码,A执行后也插入一段代码 原理: 写个拦截器,拦截器中包含要插入前后执行的两段代码 interceptor { C();//C方法 D();//D方法 ...

  3. 用gulp-imageisux智图api压缩图片

    ➣ 智图平台是什么? 智图是腾讯ISUX前端团队开发的一个专门用于图片压缩和图片格式转换的平台,其功能包括针对png,jpeg,gif等各类格式图片的压缩,以及为上传图片自动选择最优的图片格式.同时, ...

  4. spring-cloud-Zuul学习(二)【基础篇】--典型配置【重新定义spring cloud实践】

    -- 2019-04-15 20:22:34 引言 上一节是一个最基本的zuul网关实例,它是整个spring-cloud生态里面“路由-服务”的一个缩影,后续也就是锦上添花.这节主要讲述zuul的一 ...

  5. python中的双向链表实现

    引子 双向链表比之单向链表,多数操作方法的实现都没有什么不同,如is_empty, __len__, traverse, search.这些方法都没有涉及节点的变动,也就可通过继承单向链表来实现即可. ...

  6. Linux 结构化命令

    if -then 语句 if -then 语句有如下格式 if command then commands f i bash shell 的if语句会先运行if后面的那个命令,如果改命令的退出状态码是 ...

  7. 判断js中的数据类型的几种方法

    判断js中的数据类型有一下几种方法:typeof.instanceof. constructor. prototype. $.type()/jquery.type(),接下来主要比较一下这几种方法的异 ...

  8. 正则表达示 for Python3

    前情提要 从大量的文字内容中找到自己想要的东西,正则似乎是最好的方法.也是写爬虫不可缺少的技能.所以,别墨迹了赶紧好好学吧! 教程来自http://www.runoob.com/python3/pyt ...

  9. 1 eclipse 离线安装activiti插件

    第一步:下载需要的离线activiti文件: 链接:https://pan.baidu.com/s/1-_XjIsuZfhiEZn6iLul6-Q  密码:mfyk  (这是其他网友的链接) 第二步: ...

  10. json转义 使用 JavaScriptSerializer 时 需要添加的引用

    当创建JavaScriptSerializer创建对象时,JavaScriptSerializer jss=new JavaScriptSerializer():时. 1.   需要添加的是Syste ...