逆向知识第八讲,if语句在汇编中表达的方式
逆向知识第八讲,if语句在汇编中表达的方式
一丶if else的最简单情况还原(无分支情况)
高级代码:
#include "stdafx.h" int main(int argc, char* argv[])
{
unsigned int nNumber = ;
scanf("%ud",&nNumber); if(argc == )
{
nNumber = ; //第一种情况下无分支
}
else
{
nNumber = -;
} return nNumber;
}
总共两种情况,我们看下Release中怎么优化的把(注意,优化方式选择O2,速度优先)
汇编代码:

可以看到我们熟悉的代码了.也就是昨天的三目运算.
总共三行汇编代码.
还原套路一样,还是 代入大于0 小于0 还有==0,看看最终结果是什么.
鉴于昨天还原过代码了,这里这届代入,还原出高级代码.
argc > 0的情况下
if(argc > ) eax = -
argc < 0的情况下
if(argc < ) eax =-
argc == 0的情况下
if(argc == ) eax =
综合三种情况,可以得出具体的条件了. 其中 ><这样写是在高级语言中不能这样写的,
所以得出的还原代码为
if(argc == ) eax =
else eax == -
二丶if else 的第二种情况(减少分支)
高级代码:
// MyCode.cpp : Defines the entry point for the console application.
// #include "stdafx.h" int main(int argc, char* argv[])
{
unsigned int nNumber = ;
scanf("%ud",&nNumber); if(argc == nNumber)
{
printf("%d",nNumber / );
}
else
{
printf("%d",nNumber / );
} return nNumber;
}
对应汇编代码:

这个主要涉及找上下界问题
1.地址: 1018 101C 分别保存了局部变量的值
2.地址: 1023 比较了argc和局部变量Var4的值
3.地址: 1025 jnz跳转,因为1023地址的比较会影响标志位 由此判定, argc和var4比较,jnz(不相等)但因为汇编中是反条件,所以是相等的情况下
4.因为jnz是一个地址,所以这个地址是一个下界,那么jnz上面的比较代码则是上界,在其内部,我们还原为if语句块(先不用管里面具体干啥)
还原if语句块
if(argc == var4) printf("%d",var4 / );
还原else语句块
else printf("%d",var4 / );
在下方我们发现了相同的汇编代码,也就是把retn放到上面去了,这个主要是为了减少分支.
三丶if else 第第三种形式,代码外提的情况
代码外提的情况下,主要在优化方式的选择上,我们知道 o2(优化方式是速度优先) 现在我们改成o1(也就是体积优先了)
这个时候就会出现代码外提.
高级代码:
// MyCode.cpp : Defines the entry point for the console application.
// #include "stdafx.h" int main(int argc, char* argv[])
{
unsigned int nNumber = ;
scanf("%ud",&nNumber); if(argc == nNumber)
{
printf("Hello");
}
else
{
printf("World");
} return nNumber;
}
切换为o1

protect -> setting即可.
对应汇编代码:

首先,找if else的时候,先确定上下界
地址: 101A位置 寻得了 if的上界
地址: 101E位置 寻得了 if的下界
注意: 中间划掉了两个指令,这两个指令是流水线优化,平栈的指令.所以没有帮助,划掉
地址: 1025位置,其指令跳转的地址是一个增量,那么则确定是else的下界
地址: 1027位置 寻得了else的上界
其实简单来说,第一个跳转位置,跳转到哪里的一块区域,是一个if的语句块而跳转的位置则是else语句块的上界,其上面固定一个jmp(注意其地址跳转是一个增量)那么跳转的地址是else的下界
重点代码外提:
我们可以看到 我们的if语句块中 push了一个 hello,我们的else语句块中,push了一个 word
那么除了if else 直接调用的printf,这样也是可以的.因为参数是一样的.平栈都是相等的.所以可以提到外面来打印输出.
四丶多分支if elseif .... else的还原
这个其实很简单了.如果是多分支,则寻找上界下界即可.
因为编译器做的东西很多了.
高级代码:
// Test.cpp : Defines the entry point for the console application.
// #include "stdafx.h" int main(int argc, char* argv[])
{
unsigned int nVar_4 = ;
scanf("%d", &nVar_4); // argc == 0 ? 0 : -1
if (argc == )
{
printf("argc == 0\r\n");
}
else if(argc == )
{
printf("argc == 1\r\n");
}
else if(argc == )
{
printf("argc == 2\r\n");
}
else if(argc == )
{
printf("argc == 3\r\n");
}
else
{
printf("else\r\n");
} printf("haha\r\n");
printf("haha\r\n");
printf("haha\r\n");
printf("haha\r\n");
printf("haha\r\n");
return nVar_4;
}
对应汇编代码:

看到这种,直接判断为 if else if else if else这种语句,然后寻找上下界即可.
逆向知识第八讲,if语句在汇编中表达的方式的更多相关文章
- 逆向知识第九讲,switch case语句在汇编中表达的方式
一丶Switch Case语句在汇编中的第一种表达方式 (引导性跳转表) 第一种表达方式生成条件: case 个数偏少,那么汇编中将会生成引导性的跳转表,会做出 if else的情况(类似,但还是能分 ...
- 内核知识第八讲,PDE,PTE,页目录表,页表的内存管理
内核知识第八讲,PDE,PTE,页目录表,页表的内存管理 一丶查看GDT表. 我们通过WinDbg + 虚拟机可以进行双机调试.调试一下看下GDT表 我们知道,GDT表中.存储的是存储段信息. 保存了 ...
- Linux基础知识第八讲,系统相关操作命令
目录 Linux基础知识第八讲,系统相关操作命令 一丶简介命令 2.磁盘信息查看. 3.系统进程 Linux基础知识第八讲,系统相关操作命令 一丶简介命令 时间和日期 date cal 磁盘和目录空间 ...
- 逆向知识第一讲,IDA的熟悉使用,以及TEB,PEB结构
逆向知识第一讲,IDA的熟悉使用,以及TEB,PEB结构 一丶熟悉IDA,以及手工制作sig文件. IDA,静态分析工具,网上随便找一个即可下载. 首先,我们写一个可执行EXE,最简单的 使用IDA打 ...
- 逆向知识第十四讲,(C语言完结)结构体在汇编中的表现形式
逆向知识第十四讲,(C语言完结)结构体在汇编中的表现形式 一丶了解什么是结构体,以及计算结构体成员的对其值以及总大小(类也是这样算) 结构体的特性 1.结构体(struct)是由一系列具有相同类型或不 ...
- 逆向知识第一讲,IDA的熟悉使用
逆向知识第一讲,IDA的熟悉使用 一丶熟悉IDA,以及手工制作sig文件. IDA,静态分析工具,网上随便找一个即可下载. 首先,我们写一个可执行EXE,最简单的 使用IDA打开. 1.提示使用什么格 ...
- PE格式第八讲,TLS表(线程局部存储)
PE格式第八讲,TLS表(线程局部存储) 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) 一丶复习线程相关知识 首先讲解 ...
- PC逆向之代码还原技术,第四讲汇编中减法的代码还原
目录 PC逆向之代码还原技术,第四讲汇编中减法的代码还原 一丶汇编简介 二丶高级代码对应汇编观看. 1.代码还原解析: 三丶根据高级代码IDA反汇编的完整代码 四丶知识总结 PC逆向之代码还原技术,第 ...
- 逆向知识之CS辅助/外挂专题.2.实现CS1.6透视原理
逆向知识之CS辅助/外挂专题.2.实现CS1.6透视原理 一丶透视简介 我们涉及到FPS游戏.免不了说透视.自瞄什么的. 在CS1.6中. 有OpenGl.也有D3D. 透视的方法很多. gl透视(也 ...
随机推荐
- NOIP2017SummerTraining0720
这套题,看到第一题就想到了以前做过的运动鞋那道题,然后就往DP这个方向去思考,想来想去每什么思路,然后就去看第二题,第二题一看就是一道最短路的问题,但是它的建图十分困难, 怎么打都不知到该怎么建图,然 ...
- day01:study HTTP协议
总结: 1.对web客户端和web服务器之间的通讯有了基本原理有了简单理解. 2.对http协议有了相关概念的建立 3.B/S C/S 两种形式 4.搭建tomcat服务器的环境,相关配置(虚拟目录 ...
- Html事件冒泡
原以为span不同于input,事件冒泡会被父级标签吞噬,写了个测试事件冒泡的Demo,发现并不是想得那样.另外:event.stopPropagation()以及event.stopImmediat ...
- Hadoop就是一个别人造好的轮子
这个想法源自于我看了<Hadoop: The Definitive Guide>的Part I Ch 2中MapReduce的引入和介绍,书中先说了怎么通过原始的办法处理数据,然后引入到如 ...
- SQLserver学习(四)——T-SQL编程之事务、索引和视图
今天来分享下T-SQL高级编程中的事务.索引.视图,可以和之前的SQL server系列文章结合起来. 一.事务 事务(TRANSACTION)是作为单个逻辑工作单元执行的一系列操作,这些操作作为一个 ...
- ch2-vue实例(new Vue({}) 属性与方法 声明周期)
Vue 实例1 每个Vue.js都是通过创建一个Vue的根实例启动的 var vm = new Vue({}) 2 扩展Vue构造器,用预定义选项创建可复用的组件构造器 var MyComponent ...
- Weave Scope 容器地图 - 每天5分钟玩转 Docker 容器技术(80)
Weave Scope 的最大特点是会自动生成一张 Docker 容器地图,让我们能够直观地理解.监控和控制容器.千言万语不及一张图,先感受一下. 下面开始实践 Weave Scope. 安装 执行如 ...
- 错误:Cannot set property 'innerHTML' of null
360浏览器代码编辑器里提示错误:Cannot set property 'innerHTML' of null 原因是代码执行时要调用的内容不存在
- J2EE走向成功路-01-Struts2 配置
配置环境 1. 导入jar包,Struts2官网:http://struts.apache.org/ 2. 创建Action类 继承ActionSupport (ActionSupport类是 ...
- 学习笔记之08试用div做网页(滨院)-小作业
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...