逆向知识第八讲,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. form表单中enctype="multipart/form-data"的传值问题

    form表单中enctype="multipart/form-data"的传值问题!! Form表单中enctype="multipart/form-data" ...

  2. JS判断访问设备是移动设备还是pc

    <scripttype="text/javascript"> function browserRedirect() { var sUserAgent= navigato ...

  3. Java面向对象 String 基本数据类型对象包装类

      Java面向对象  String 知识概要:              (1)String的用法详解 (2)基本数据类型对象包装类 String          顾名思义,该类主要是对字符串 ...

  4. 从template到DOM(Vue.js源码角度看内部运行机制)

    写在前面 这篇文章算是对最近写的一系列Vue.js源码的文章(https://github.com/answershuto/learnVue)的总结吧,在阅读源码的过程中也确实受益匪浅,希望自己的这些 ...

  5. 使用MxNet新接口Gluon提供的预训练模型进行微调

    1. 导入各种包 from mxnet import gluon import mxnet as mx from mxnet.gluon import nn from mxnet import nda ...

  6. jquery事件使用方法总结

    jquery提供了许多的事件处理函数,学习前端一段时间了,下面对其总结一下,梳理一下知识点. 一.鼠标事件 1. click():鼠标单击事件 $div = $("div") $d ...

  7. 【学习】条码扫描器:QuaggaJS

    QuaggaJS是条形码扫描器完全用JavaScript编写,支持实时对各类条码进行定位和解码,如EAN和CODE128.该库还能够使用getUserMedia获得直接访问用户的摄像头流.为了充分利用 ...

  8. win10 + python3.6 + VSCode + tensorflow-gpu + keras + cuda8 + cuDN6N环境配置

    写在前面的话: 再弄这个之前,我对python也好,tensorflow也好几乎是0认知的,所以配置这个环境的时候,走了不少弯路,整整耗费了一个星期的时间才搭配完整这个环境,简直了...然而最气的是, ...

  9. 浅谈javascript继承体系

    最近做web项目,接触了jquery等框架,虽然使用方便,但是还是想学习下Javascript,今天分享下最近对js原型继承的理解,不足之处欢迎指正. 一.构造器的原型属性与原型对象 刚接触js时通常 ...

  10. SpringMVC 基本概念

    DispatcherServlet:前端控制器,解释用户请求,通过HandlerMapping查找对应Handler处理请求,调用ViewResolve回填页面,DispatcherServlet在W ...