if语句,if...else语句的分析
if语句的反汇编判断
if语句的反汇编判断基本是围绕JCC指令的,如果想要有深刻的理解,可以自行练习JCC指令
执行各类影响标志位的指令
jxx xxxx
1、案例一
mov eax,dword ptr [ebp+8] 分析:cmp指令 影响标志位
cmp eax,dword ptr [ebp+0Ch] jle :小于或者等于就跳转到00401059
jle 00401059
2、案例二
mov eax,dword ptr [ebp+8] 分析:cmp指令 影响标志位
cmp eax,dword ptr [ebp+0Ch] jl :小于则跳转
jl 00401059
3、案例三
mov eax,dword ptr [ebp+8] jge :大于或者等于则跳转
cmp eax,dword ptr [ebp+0Ch]
jge 00401059
4、案例四
mov eax,dword ptr [ebp+8] jg :大于则跳转
cmp eax,dword ptr [ebp+0Ch]
jg 00401059
仅列举少许,有兴趣可以尝试全部的JCC指令,以便加深理解
案例分析
在分析if语句时,我们得先有一个整体概念,即在函数调用前,先分析大段,如下:
函数调用处代码:
push 5 分析:
push 4 两个参数
call 0040100f
add esp,8
分析第一个实例:
push ebp
mov ebp,esp
sub esp,40h
push ebx
push esi
push edi
lea edi,[ebp-40h]
0040103C mov ecx,10h
mov eax,0CCCCCCCCh
rep stos dword ptr [edi]
mov eax,dword ptr [ebp+]
0040104B cmp eax,dword ptr [ebp+0Ch]
0040104E jle
mov ecx,dword ptr [ebp+]
mov dword ptr [004225c4],ecx
pop edi
0040105A pop esi
0040105B pop ebx
0040105C mov esp,ebp
0040105E pop ebp
0040105F ret
我在Excel中将其用颜色标注,上下两段颜色一样的,我们可以不用看,之前有过探究,开辟堆栈所进行的一系列操作,实际功能块就是中间紫色那块

我们的分析过程可大致分为下面五个步骤:
函数内部功能分析:
1、分析参数:
[ebp+8] : X [ebp+0Ch] :Y
2、分析局部变量
无
3、分析全局变量
mov dword ptr 004225c4,ecx
4、功能分析
mov eax,dword ptr [ebp+8]
cmp eax,dword ptr [ebp+0Ch]
将参数X存到到EAX中,然后比较EAX,与参数Y的大小
如果X<=Y 那么跳转到00401059的位置
否则,将X的值存储到全局变量中
5、返回值分析
无
分析第二个实例:
调用处代码:
push 5
push 4
call 0040100f
add esp,8
函数内部:
push ebp
mov ebp,esp
sub esp,44h
push ebx
push esi
push edi
lea edi,[ebp-44h]
0040103C mov ecx,11h
mov eax,0CCCCCCCCh
rep stos dword ptr [edi]
mov eax,[004225c4]
0040104D mov dword ptr [ebp-],eax
mov ecx,dword ptr [ebp+]
cmp ecx,dword ptr [ebp+0Ch]
jg
mov edx,dword ptr [ebp+0Ch]
0040105B add edx,dword ptr [ebp-]
0040105E mov dword ptr [004225c4],edx
pop edi
pop esi
pop ebx
mov esp,ebp
pop ebp
0040106A ret
我还是在Excel中标注一下颜色:

函数内部功能分析:
1、分析参数:
Y: ebp+8 Z: ebp+c
2、分析局部变量
A:ebp-4
3、分析全局变量
Global:dword ptr [004225c4],edx
4、功能分析
a、00401048 mov eax,[004225c4]
0040104D mov dword ptr [ebp-4],eax
A = Global
b、00401050 mov ecx,dword ptr [ebp+8]
00401053 cmp ecx,dword ptr [ebp+0Ch]
参数Y与Z比较大小
c、00401056 jg 00401064
如果Y比Z大,则跳转至0x00401064,否则程序走下一步
d、00401058 mov edx,dword ptr [ebp+0Ch]
0040105B add edx,dword ptr [ebp-4]
0040105E mov dword ptr [004225c4],edx
到这一步,说明Y小于等于Z,将Z与A相加,并把相加的值赋给Global
5、返回值分析
无
6、还原成C函数
int Global;
void function(int Z, int Y)
{
int A = Global;
if (Y <= Z)
{
Global = A + Z;
}
}
IF...ELSE...语句的反汇编判断:
IF...ELSE...语句的反汇编判断:
IF_BEGIN:
先执行各类影响标志位的指令
jxx ELSE_BEGIN
......
IF_END:
jmp END
ELSE_BEGIN:
......
ELSE_END:
END:
特点分析:
1、如果不跳转,那么会执行到jmp处,jmp直接跳转到END处
2、如果跳转,则会直接跳过jmp END处的代码,直接执行后面的代码
总结:
跳转执行一部分代码,不跳转执行另外一部分代码
第一个jxx跳转的地址前面有一个jmp ,可以判断是if...else...语句
第一个案例分析
004010B0 push ebp
004010B1 mov ebp,esp
004010B3 sub esp,44h
004010B6 push ebx
004010B7 push esi
004010B8 push edi
004010B9 lea edi,[ebp-44h]
004010BC mov ecx,11h
004010C1 mov eax,0CCCCCCCCh
004010C6 rep stos dword ptr [edi]
004010C8 mov eax,[004225c4]
004010CD mov dword ptr [ebp-],eax
004010D0 mov ecx,dword ptr [ebp+]
004010D3 cmp ecx,dword ptr [ebp+0Ch]
004010D6 jle 004010e6
004010D8 mov edx,dword ptr [ebp+]
004010DB add edx,dword ptr [ebp-]
004010DE mov dword ptr [004225c4],edx
004010E4 jmp 004010f1
004010E6 mov eax,dword ptr [ebp+0Ch]
004010E9 add eax,dword ptr [ebp-]
004010EC mov [004225c4],eax
004010F1 pop edi
004010F2 pop esi
004010F3 pop ebx
004010F4 mov esp,ebp
004010F6 pop ebp
004010F7 ret

函数内部功能分析:
1、分析参数:
[ebp+8] : X [ebp+0Ch] :Y
2、分析局部变量
[ebp-4] = eax = [004225c4]
3、分析全局变量
[004225c4] G
4、功能分析
a、004010C8 mov eax,[004225c4]
004010CD mov dword ptr [ebp-4],eax
Local = Global
b、004010D0 mov ecx,dword ptr [ebp+8]
004010D3 cmp ecx,dword ptr [ebp+0Ch]
比较X与Y的大小
c、如果Y<=X 那么执行
004010E6 mov eax,dword ptr [ebp+0Ch] X
004010E9 add eax,dword ptr [ebp-4] Local + X
004010EC mov [004225c4],eax Global = Local + X
d、如果Y>X 那么执行
004010D8 mov edx,dword ptr [ebp+8] Y
004010DB add edx,dword ptr [ebp-4] Local + Y
004010DE mov dword ptr [004225c4],edx Global = Local + Y
004010E4 jmp 004010f1
5、返回值分析
无
第二个案例分析
004010B0 push ebp
004010B1 mov ebp,esp
004010B3 sub esp,48h
004010B6 push ebx
004010B7 push esi
004010B8 push edi
004010B9 lea edi,[ebp-48h]
004010BC mov ecx,12h
004010C1 mov eax,0CCCCCCCCh
004010C6 rep stos dword ptr [edi]
004010C8 mov eax,[004225c4]
004010CD mov dword ptr [ebp-],eax
004010D0 mov dword ptr [ebp-],
004010D7 mov ecx,dword ptr [ebp+]
004010DA cmp ecx,dword ptr [ebp+0Ch]
004010DD jl 004010e8
004010DF mov edx,dword ptr [ebp-]
004010E2 add edx,
004010E5 mov dword ptr [ebp-],edx
004010E8 mov eax,dword ptr [ebp+]
004010EB cmp eax,dword ptr [ebp+0Ch]
004010EE jge 004010fb
004010F0 mov ecx,dword ptr [ebp-]
004010F3 mov dword ptr [004225c4],ecx
004010F9 jmp
004010FB mov edx,dword ptr [ebp-]
004010FE add edx,dword ptr [ebp-]
mov dword ptr [004225c4],edx
pop edi
pop esi
pop ebx
0040110A mov esp,ebp
0040110C pop ebp
0040110D ret

分析过程如下:

if语句,if...else语句的分析的更多相关文章
- 对于Oracle中分页排序查询语句执行效率的比较分析
转自:http://bbs.csdn.net/topics/370033478 对于Oracle中分页排序查询语句执行效率的比较分析 作者:lzgame 在工作中我们经常遇到需要在Oracle中进行分 ...
- 【java开发】分支语句、循环语句学习
一.Java分支语句类型 if-else 语句 switch 关于if-esle语句可以拆分为三种 if语句 if(条件){语句块;} if-else语句if(条件语句){语句块;} if-else ...
- 前端笔记知识点整合之JavaScript(三)关于条件判断语句、循环语句那点事
一.条件分支语句 条件分支语句,也叫作条件判断语句,就是根据某种条件执行某些语句,不执行某些语句. JS中有三种语法是可以表示条件分支的 1.1 if……else…… 条件分支的主力语法,这个主力 ...
- 前端笔记之JavaScript(三)关于条件判断语句、循环语句那点事
一.条件分支语句 条件分支语句,也叫作条件判断语句,就是根据某种条件执行某些语句,不执行某些语句. JS中有三种语法是可以表示条件分支的 1.1 if……else…… 条件分支的主力语法,这个主力语法 ...
- 【DB2】SQL0501N FETCH 语句或 CLOSE 语句中指定的游标尚未打开,或者游标标量函数引用中的游标变量尚未打开。 SQLSTATE=24501
在DB2中建立存储过程时使用了隐式游标,在调用的时候报错如下: SQL0501N FETCH 语句或 CLOSE 语句中指定的游标尚未打开,或者游标标量函数引用中的游标变量尚未打开. SQLSTA ...
- 为什么说在使用多条件判断时switch case语句比if语句效率高?
在学习JavaScript中的if控制语句和switch控制语句的时候,提到了使用多条件判断时switch case语句比if语句效率高,但是身为小白的我并没有在代码中看出有什么不同.去度娘找了半个小 ...
- continue语句在for语句和while语句中的区别
while语句的形式: while( expression ) statement for语句的形式: for( expression1; expression2;expression3 ) // ...
- javascript语句——条件语句、循环语句和跳转语句
× 目录 [1]条件语句 [2]循环语句 [3]跳转语句 前面的话 默认情况下,javascript解释器依照语句的编写顺序依次执行.而javascript中的很多语句可以改变语句的默认执行顺序.本文 ...
- javascript语句——表达式语句、块语句、空语句和声明语句
× 目录 [1]表达式 [2]块语句 [3]空语句[4]声明 前面的话 如果表达式在javascript中是短语,那么语句(statement)就是javascript整句或命令.表达式计算出一个值, ...
- PHP include语句和require语句
<?php /* PHP include语句和require语句 include和require 语句是相同的 除了错误处理方面: *require 会生成致命错误,并停止脚本 *include ...
随机推荐
- wx-show与!show
切换的表示 <!--index.wxml--> <view class="container"> <view class="item&quo ...
- JavaScript 字符串是否包含某个字符串
字符串方式 indexOf() (推荐) var str = "123"; console.log(str.indexOf("3") != -1 ); // ...
- Elasticsearch核心技术与实战-简介
讲师阮一鸣介绍ebay的Pronto团队在ebay内部管理上百个Elasticsearch集群,超过4000个数据节点.在生产环境上支持的服务有 订单搜索.商品推荐.日志管理.风险控制.IT运维.安全 ...
- 蓝色大气简约立体答辩ppt模板推荐
小编个人非常喜欢这个模版,大气深蓝色,具有科技感,非常适合学生的毕业答辩PPT模板. 模版来源:http://ppt.dede58.com/gongzuohuibao/26496.html
- cmdb项目-1
1.什么是cmdb 配置管理数据库 ,存储基础设备的各种信息配置等 CMDB可以存储并自动发现整个IT网络上的各种信息,比如一个IT网络上有多少台服务器.多少存储.设备的品牌.资产编号.维护人员.所属 ...
- [browser location和history] 简单实现了个路由[转载]
今天看了1下前面写的,好像缺乏交流性,周末再来弄吧 -0- 今天看了browser 的 location 和 history location属性 // //location.hash 性是一个可读可 ...
- js实现防抖函数和节流函数
防抖函数(debounce) 含义:防抖函数指的是在特定的时间内没有再次触发,才得以进行接下来的函数运行: 用途:当window.onresize不断的调整大小的时候,为了避免不断的重排与重绘,可以用 ...
- choose Perseverance :)
心里话 很久都没有更新博客了,我会陆陆续续的把云笔记中的一些有意思的文章放在博客中. 这10个月以来经历了很多,9月份参加了省赛获得了一个二等奖,和一等奖失之交臂的滋味很难受,到10月份开始维护自己的 ...
- 转战物联网·基础篇03-从JSON数据到短指令谈思维的转变
了解了物联网项目的大体结构之后,我们先从物联网的联网相关部分说起,这也是物联网项目中的关键环节.在联网环节中,不仅要考虑如何连接上,还要考虑连接后如何传输数据.换句话说数据是以什么格式进行传输,对 ...
- Android实现九宫拼图过程记录
算法老师给了一份关于九宫拼图的算法过程用C++写的,让我们自己封装,成为一个有图形界面的工程,我接触过android,c++的mfc,Java的图形界面JUI,网页的css.html.javascri ...