逆向知识第八讲,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语句在汇编中表达的方式的更多相关文章

  1. 逆向知识第九讲,switch case语句在汇编中表达的方式

    一丶Switch Case语句在汇编中的第一种表达方式 (引导性跳转表) 第一种表达方式生成条件: case 个数偏少,那么汇编中将会生成引导性的跳转表,会做出 if else的情况(类似,但还是能分 ...

  2. 内核知识第八讲,PDE,PTE,页目录表,页表的内存管理

    内核知识第八讲,PDE,PTE,页目录表,页表的内存管理 一丶查看GDT表. 我们通过WinDbg + 虚拟机可以进行双机调试.调试一下看下GDT表 我们知道,GDT表中.存储的是存储段信息. 保存了 ...

  3. Linux基础知识第八讲,系统相关操作命令

    目录 Linux基础知识第八讲,系统相关操作命令 一丶简介命令 2.磁盘信息查看. 3.系统进程 Linux基础知识第八讲,系统相关操作命令 一丶简介命令 时间和日期 date cal 磁盘和目录空间 ...

  4. 逆向知识第一讲,IDA的熟悉使用,以及TEB,PEB结构

    逆向知识第一讲,IDA的熟悉使用,以及TEB,PEB结构 一丶熟悉IDA,以及手工制作sig文件. IDA,静态分析工具,网上随便找一个即可下载. 首先,我们写一个可执行EXE,最简单的 使用IDA打 ...

  5. 逆向知识第十四讲,(C语言完结)结构体在汇编中的表现形式

    逆向知识第十四讲,(C语言完结)结构体在汇编中的表现形式 一丶了解什么是结构体,以及计算结构体成员的对其值以及总大小(类也是这样算) 结构体的特性 1.结构体(struct)是由一系列具有相同类型或不 ...

  6. 逆向知识第一讲,IDA的熟悉使用

    逆向知识第一讲,IDA的熟悉使用 一丶熟悉IDA,以及手工制作sig文件. IDA,静态分析工具,网上随便找一个即可下载. 首先,我们写一个可执行EXE,最简单的 使用IDA打开. 1.提示使用什么格 ...

  7. PE格式第八讲,TLS表(线程局部存储)

    PE格式第八讲,TLS表(线程局部存储) 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) 一丶复习线程相关知识 首先讲解 ...

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

    目录 PC逆向之代码还原技术,第四讲汇编中减法的代码还原 一丶汇编简介 二丶高级代码对应汇编观看. 1.代码还原解析: 三丶根据高级代码IDA反汇编的完整代码 四丶知识总结 PC逆向之代码还原技术,第 ...

  9. 逆向知识之CS辅助/外挂专题.2.实现CS1.6透视原理

    逆向知识之CS辅助/外挂专题.2.实现CS1.6透视原理 一丶透视简介 我们涉及到FPS游戏.免不了说透视.自瞄什么的. 在CS1.6中. 有OpenGl.也有D3D. 透视的方法很多. gl透视(也 ...

随机推荐

  1. 宿命的PSS

    宿命的PSS 时间限制: 1 Sec  内存限制: 128 MB提交: 60  解决: 37[提交][状态][讨论版] 题目描述 最小生成树P.S.S在宿命的指引下找到了巫师Kismi.P.S.S希望 ...

  2. Node.js学习之TCP/IP数据通讯

    Node.js学习之TCP/IP数据通讯 1.使用net模块实现基于TCP的数据通讯 提供了一个net模块,专用于实现TCP服务器与TCP客户端之间的通信 1.1创建TCP服务器 在Node.js利用 ...

  3. 简单Elixir游戏服设计- 游戏玩法介绍

    抄以前的,做了点修改. 到目前为止,我们完成了玩家的数据和进程建模,现在介绍游戏玩法. 为什么我们还不做客户端接入.协议指定呢?为什么还没有网关和数据存储呢.在我接手的游戏, 这些通常已经定下来了,我 ...

  4. IIS7中JS、CSS、Image无法显示和加载解决方案

    前两天把机器从Windows7升级到Windows10,IIS也跟着升级了,在获取项目搭载IIS上发现原有的页面中所有的JS.CSS.Image都无法访问,提示500错误,起初以为是IIS没有装好 重 ...

  5. css3弹性盒模型flex快速入门与上手1

    一.什么是flex? flex是css3中引入的一种布局方式,可以非常灵活高效控制元素的排列与对齐方式,大多人称之为弹性布局. 二.怎么使用flex? 任何一个容器都可以指定为flex布局 #box ...

  6. bootstrap 的可编辑下拉框 jquery.editable-select

    搜了半天发现在某处下载jquery.editable-select需要积分,于是整理出来方便 其他人. 先上下载链接:http://pan.baidu.com/s/1kUXvwlL      pass ...

  7. Centos7下安装php7

    通过编译的方式安装php7 1. 安装PHP7 ## 下载 wget http://us2.php.net/distributions/php-7.0.2.tar.gz ## 安装 tar zxvf ...

  8. Levenshtein Distance + LCS 算法计算两个字符串的相似度

    //LD最短编辑路径算法 public static int LevenshteinDistance(string source, string target) { int cell = source ...

  9. C# Async/await 异步多线程编程

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.N ...

  10. [js高手之路]html5 canvas动画教程 - 自己动手做一个类似windows的画图软件

    这个绘图工具,我还没有做完,不过已经实现了总架构,以及常见的简易图形绘制功能: 1,可以绘制直线,圆,矩形,正多边形[已完成] 2,填充颜色和描边颜色的选择[已完成] 3,描边和填充功能的选择[已完成 ...