逆向知识第八讲,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透视(也 ...
随机推荐
- NOIP2017SummerTraining0710
个人感受:这套题,题目泄露,没什么好打的,第一题刚开始题目理解错误,后来还行,第二道题,打了一个50还是60分的dp,第三道暴力过了小数据,拿了200分,排名15+. 问题 A: 七天使的通讯 时间限 ...
- Thirft框架快速入门
Thrift介绍1.什么是thrift?thrift早期由facebook内部团队开发,主要用于实现跨语言间的方法调用,属于远程方法调用的一种,后开源纳入apache中,成为了apache thrif ...
- webpack2使用ch4-向根目录index.html文件传参并使用参数 使用线上资源 压缩html
1 webpack.config.js const webpack = require('webpack'), htmlWebpackPlugin = require('html-webpack-pl ...
- 获取报告 Stream转string,利用字符串分割转换成DataTable
protected void Button1_Click(object sender, EventArgs e) { MemoryStream stream = new MemoryStream(); ...
- C语言通过函数参数不能带出动态内存的例子。
实验结论:通过函数参数不能带出动态内存,函数参数虽然为指针,其实是在函数内部的临时变量,只是该指针的初始值是通过调用函数赋值的.C语言函数参数都是传值的. #include <stdio.h&g ...
- jquery基本选择器:id选择器、class选择器、标签选择器、通配符选择器
全栈工程师开发手册 (作者:栾鹏) jquery系列教程1-选择器全解 jquery基本选择器 jquery基本选择器,包括id选择器.class选择器.标签选择器.通配符选择器,同时配合选择器的空格 ...
- 张高兴的 Windows 10 IoT 开发笔记:ToF Sensor VL53L0X
GitHub : https://github.com/ZhangGaoxing/windows-iot-demo/tree/master/VL53L0X
- win10 uwp 反射
本文在h神的指导下完成. 反射是强大的好用的,我们可以添加新功能不修改之前的代码,通过使用反射得到. 本文下面和大家说如何做一个和WPF一样的反射功能,如何才能获的 UWP 程序集所有类. 先来说下反 ...
- PHP中提问频率最高的11个面试题和答案
问题:请用最简单的语言告诉我PHP是什么? 回答:PHP全称:Hypertext Preprocessor,是一种用来开发动态网站的服务器脚本语言. 问题:什么是MVC? 回答:MVC由Model(模 ...
- Akka(31): Http:High-Level-Api,Route rejection handling
Route 是Akka-http routing DSL的核心部分,使用户能比较方便的从http-server的角度筛选http-request.进行server运算.构建回复的http-respon ...