逆向知识第八讲,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. An Introduction to Variational Methods (5.1)

    在这篇文章中,我引用Bishop书中的一个例子,来简单介绍一下Variational Methods的应用.想要更详细地理解这个例子,可以参考Bishop的书Pattern Recongnition ...

  2. Monit : 开源监控工具介绍

    · Monit 简介 Monit是一个轻量级(500KB)跨平台的用来监控Unix/linux系统的开源工具.部署简单,并且不依赖任何第三方程序.插件或者库. Monit可以监控服务器进程.文件.文件 ...

  3. 原创:工作指派问题解决方案---模拟退火算法C实现

    本文忽略了对于模拟退火的算法的理论讲解,读者可参考相关的博文或者其他相关资料,本文着重于算法的实现: /************************************************ ...

  4. HIVE---基于Hadoop的数据仓库工具讲解

    Hadoop: Hadoop是一个由Apache基金会所开发的分布式系统基础架构.用来开发分布式程序.充分利用集群的威力进行高速运算和存储.Hadoop实现了一个分布式文件系统(Hadoop Dist ...

  5. ThinkPHP中使用PHPMailer邮件类

    第一步.添加PHPMailer类库将下载后的文件解压,将PHPMail目录移动至ThinkPHP目录中的Vendor内.(请确保class.phpmailer.php文件就在ThinkPHP\Vend ...

  6. jsp 四大域范围

     JSP中四种作用域的不同 作用域规定的是变量的有效期限. 1.如果把变量放到pageContext里,就说明它的作用域是page,它的有效范围只在当前jsp页面里. 从把变量放到pageCont ...

  7. Java面向对象 GUI 补录

     Java面向对象 GUI 补录 知识概要:(1)GUI和CLI                   (2)AWT和SWING                   (3)AWT继承关系图      ...

  8. 【MVC】MvcPager分页及边界传递数据示例

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  9. asp.net数据四舍五入

    #region 数据四舍五入 /// <summary> /// 四舍五入 /// </summary> /// <param name="dblnum&quo ...

  10. Mongodb 认证鉴权那点事

    [TOC] 一.Mongodb 的权限管理 认识权限管理,说明主要概念及关系 与大多数数据库一样,Mongodb同样提供了一套权限管理机制. 为了体验Mongodb 的权限管理,我们找一台已经安装好的 ...