[1] 以逆向的角度来看流程控制语句——if
[1] 以逆向的角度来看流程控制语句——if
1. if语句(单分支)
if语句转换的条件跳转指令与if语句的判断结果是相反的, 因为C语言是根据代码行的位置决定编译后二进制代码地址高低的,即低行数对应低地址,高行数对应高地址
汇编标识:
00401003 cmp dword ptr [ebp+8], 0
00401007 jnz short loc_401016 ;如果argc!=0,则跳转到if结束块代码
{
00401009 push offset aArgc0
0040100E call printf
00401013 add esp, 4 ;if语句块代码
}
00401016 loc_401016:
00401016 xor eax, eax ;if结束块代码
逆向总结:
执行影响标志位指令
JXX向下跳转到if结束代码块
{
if语句块代码
...
语句块结束无JMP
}
if结束代码块
以上指令序列即可推断为由if语句组成的单分支结构
2. if…else…语句
Debug 汇编标识:
00401003 cmp dword ptr [ebp+8], 0
00401007 jnz short loc_401018 ;如果argc!=0,则跳转到else语句块代码
{
00401009 push offset aArgc0
0040100E call sub_401070
00401013 add esp, 4 ;if语句块代码
}
00401016 jmp short loc_401025 ;跳转到if_else结束代码块
{
00401018 loc_401018:
00401018 push offset aArgc0_0
0040101D call sub_401070
00401022 add esp, 4 ;else语句块代码
}
00401025 loc_401025: ;if_else结束代码块
逆向总结:
执行影响标志位指令
JXX向下跳转到else语句块代码
{
if语句块代码
...
JMP向下跳转到if_else结束代码块
}
{
else语句块代码
...
语句块结束无JMP
}
if_else结束代码块
先考察两个跳转指令,当第一个条件跳转指令跳转到地址ELSE_BEGIN处之前有JMP指令,则视为由if…else…组合而成的双分支结构。根据这两个跳转指令可以得到if和else语句块的代码边界。通过cmp与jxx可还原if的比较信息,jmp指令之后即为else块的开始。依此分析,即可逆向分析出if…else…组合的原型
Release 汇编标识:
执行影响标志位指令
JXX向下跳转到else语句块代码
{
if语句块代码
...
语句块结束无JMP
}
if_else结束代码块
{
else语句代码块
...
JMP向上跳转到if_else结束代码块
}
对于GCC编译器的Release,进入if语句块不会产生跳转,进入else语句块则会产生两次跳转。gcc在编译时会判断if和else的语句块的命中率,将命中率高的语句块代码调整到if语句块
3. 用if构成的多分支流程
Debug 汇编标识:
00401003 cmp dword ptr [ebp+8], 0
00401007 jle short loc_401018 ;如果argc<=0,则跳转到else_if语句块代码
{
00401009 push offset aArgc0
0040100E call sub_401080
00401013 add esp, 4 ;if语句块代码
}
00401016 jmp short loc_40103A ;跳转到if_else_if结束代码块
{
00401018 cmp dword ptr [ebp+8], 0
0040101C jnz short loc_40102D ;如果argc!=0,则跳转到else语句块代码
0040101E push offset aArgc0_0
00401023 call sub_401080
00401028 add esp, 4 ;else_if语句块代码
}
0040102B jmp short loc_40103A ;跳转到 if_else_if结束代码块
{
0040102D push offset aArgc0_1
00401032 call sub_401080
00401037 add esp, 4 ;else语句块代码
}
0040103A xor eax, eax ;if_else_if结束代码块
逆向总结:
执行影响标志位指令
JXX向下跳转到else_if语句块代码
{
if语句块代码
...
JMP向下跳转到if_else_if结束块代码
}
{
else_if语句块代码
执行影响标志位指令
JXX向下跳转到else语句块代码
...
JMP向下跳转到if_else_if结束块代码
}
{
else语句块代码
...
语句块结束无JMP
}
if_else_if结束块代码
当每个条件跳转指令的跳转地址之前都紧跟JMP指令,并且它们跳转的地址值一样时,可视为一个多分支结构。JMP指令指明了多分支结构的末尾,配合比较判断指令与条件跳转指令,可还原出各分支语句块的组成
Release 汇编标识:
执行影响标志位指令
JXX向下跳转到else_if语句块代码
{
if语句块代码
...
语句块结束无JMP
}
if_else_if结束代码块
...
{
else_if语句代码块
执行影响标志位指令
JXX向下跳转到else语句块代码
...
JMP向上跳转到if_else_if结束代码块
}
{
else语句块代码
...
JMP向上跳转到if_else_if结束块代码
}
逆向总结:
对于GCC编译器的Release,进入if语句块不会产生跳转,进入else语句块则会产生两次跳转。gcc在编译时会判断if和else的语句块的命中率,将命中率高的语句块代码调整到if语句块
由于编译器可以在编译期间对代码进行优化,当代码中的分支结构形成永远不可抵达的分支语句块时,它永远不会被执行,可以被优化掉而不参与编译处理
[1] 以逆向的角度来看流程控制语句——if的更多相关文章
- JAVA 1.6 流程控制语句
1. 条件运算符(三元表达式),其形式为:type d = a ? b : c; 具体化形式为:int d = 2 < 1 ? 3 : 4;2. 轻量级的文本编辑器:UltraEdit.Edit ...
- 二、JavaScript语言--JS基础--JavaScript进阶篇--流程控制语句
1.if语句--做判断 if语句是基于条件成立才执行相应代码时使用的语句. 语法: if(条件) { 条件成立时执行代码} 注意:if小写,大写字母(IF)会出错! 假设你应聘web前端技术开发岗位, ...
- C#之流程控制语句
通过一系列的学习,我们知道尽管计算机可以完成工作,但实质上这些工作都是按照我们事先编好的程序执行的,所以,程序是计算机的灵魂,计算机程序执行的控制流程由三种基本的控制结构控制,即顺序结构,选择结构,循 ...
- java-04流程控制语句
这里先简单介绍几种流程控制语句 包括if/if-else.switch语句 1.三大流程控制结构 所谓流程控制,就是说要控制程序的执行方式,根据不同的情况执行不同的代码,从而得到不同情况下的不同结果. ...
- JavaScript的流程控制语句
JS的核心ECMAScript规定的流程控制语句和其他的程序设计语言还是蛮相似的.我们选择一些实用的例子来看一下这些语句.顺序结构我们在这里就不再提到,直接说条件和循环以及其他语句.一.条件选择结构 ...
- JavaScript进阶 - 第4章 跟着我的节奏走(流程控制语句)
第4章 跟着我的节奏走(流程控制语句) 4-1 做判断(if语句) if语句是基于条件成立才执行相应代码时使用的语句. 语法: if(条件) { 条件成立时执行代码} 注意:if小写,大写字母(IF) ...
- PHP流程控制语句(if,foreach,break......)
背景:PHP程序中,必不可少的要用到流程控制语句.这次对于流程控制语句进行一些总结. 条件控制语句和循环控制语句是两种基本的语法结构,它们都是用来控制程序执行流程.也是构成程序的主要语法基础. 一.程 ...
- 流程控制语句反汇编(1)(Debug版)
// 流程控制语句反汇编 //Author:乾卦 Date:2014-5-8 #include<stdio.h> int main() { ,b=; if(a>b) { a=b; } ...
- MySQL全面瓦解20:可编程性之流程控制语句
背景 说到流程控制语句,我们在程序语法中用的比较多,比如C#的if..else...,while...,?: 等.同样的,在MySQL中,也有一些流程控制的语法,方便我们在写函数.存储过程的时候对逻辑 ...
- 『无为则无心』Python基础 — 13、Python流程控制语句(条件语句)
目录 1.流程控制基本概念 2.选择结构(条件语句) (1)条件语句概念 (2)if语句语法 (3)if...else...语句 (4)多重判断 (5)if语句嵌套 3.应用:猜拳游戏 4.三元运算符 ...
随机推荐
- 2023 年汽车行业向好发展,火山引擎 VeDI 助力车企数智转型
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,并进入官方交流群 2023 年的汽车市场,预计能有一个向好的转型. 据中汽协公布的 2022 年 1-11 月累计汽车销量数据,达到 243 ...
- MyBatis batchInsert 批量插入数据
mybatis 是一个 Java 的持久层框架,它支持定制化 SQL.存储过程以及高级映射.通过 MyBatis,开发者可以直接编写原生态 SQL,避免了 JDBC 代码的繁琐. 如何在 MyBati ...
- 42 干货系列从零用Rust编写负载均衡及代理,wmproxy中配置tcp转websocket
wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,四层TCP/UDP转发,七层负载均衡,内网穿透,后续将实现websocket代 ...
- 神经网络优化篇:详解RMSprop
RMSprop 知道了动量(Momentum)可以加快梯度下降,还有一个叫做RMSprop的算法,全称是root mean square prop算法,它也可以加速梯度下降,来看看它是如何运作的. 回 ...
- Codeforces 451B Sort the Array(水题)
题目连接:Codeforces 451B Sort the Array 题目大意:给出一个长度为n的序列,可以有一次机会旋转a[l]到a[r]之间的数,问说可否形成一个递增序列. 解题思路:将数组排下 ...
- 2016年第七届 蓝桥杯A组 C/C++决赛题解
蓝桥杯历年国赛真题汇总:Here 1.随意组合 小明被绑架到X星球的巫师W那里. 其时,W正在玩弄两组数据 (2 3 5 8) 和 (1 4 6 7) 他命令小明从一组数据中分别取数与另一组中的数配对 ...
- Java 21新特性-虚拟线程 审核中
本文翻译自国外论坛 medium,原文地址:https://medium.com/@benweidig/looking-at-java-21-virtual-threads-0ddda4ac1be1 ...
- 2023Java面试学习网站推荐
本文给大家推荐博主收藏的6个程序员面试学习站点,按照项目简介.网站截图.是否收费供大家参考. 1. JavaGuide 网站地址:https://javaguide.cn 项目简介:「Java学习 + ...
- freeswitch如何判断挂机方
概述 freeswitch作为VOIP的软交换平台,需要对呼叫的信息做判断和归类. 常见的呼叫信息中,挂机方向的信息对于话单统计有很大的用处. 但是fs的原始话单和日志中并没有挂机方向的信息. 环境 ...
- 【动画进阶】神奇的 3D 卡片反光闪烁动效
最近,有群里在群里发了这么一个非常有意思的卡片 Hover 动效,来源于此网站 -- key-drop,效果如下: 非常有意思酷炫的效果.而本文,我们不会完全还原此效果,而是基于此效果,尝试去制作这么 ...