欢迎来到天天文库
浏览记录
ID:37824087
大小:2.45 MB
页数:39页
时间:2019-05-31
《C++反汇编与逆向分析技术揭秘-第5章》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、第5章流程控制语句的识别流程控制语句的识别是进行逆向分析和还原高级代码的基础,对于想从事逆向分析工作的读者来说,本章的内容非常重要。对于无意从事逆向分析工作的开发人员,通过本章的学习可以更好地理解高级语言中流程控制的内部实现机制,对开发和调试大有裨益。5.1if语句if语句是分支结构的重要组成部分。if语句的功能是先对运算条件进行比较,然后根据比较结果选择对应的语句块来执行。if语句只能判断两种情况:“0”为假值,“非0”为真值。如果为真值,则进入语句块内执行语句;如果为假值,则跳过if语句块,继续运行程序的其他语句。要注意的是,if语句转换的条件跳转指令与if语
2、句的判断结果是相反的。我们以代码清单5-1为例,逐步展开对if语句的分析。代码清单5-1if语句构成—Debug版//C++源码说明:if语句结构组成if(argc==0){printf("%dr",argc);}//C++源码与对应汇编代码讲解//C++源码对比,若参数argc等于0,则为真,执行语句块if(argc==0);使用CMP指令,将ebp+8地址处的4字节数据与0相减;结果不影响argc,但影响标记位CF、ZF、OF、AF和PF00401028cmpdwordptr[ebp+8],0;根据cmp指令影响到的标记位,查看表4-1;JNE检查ZF标
3、记位的值,如果值等于0,则跳转,表示此时argc的值不等于0,;于是跳转到地址0x0040103F处;这个地址为if语句块的结束地址,随后跳转出if语句0040102Cjnemain+2Fh(0040103f){;printf函数调用讲解略}//C++源码对比,函数返回return0;0040103Fxoreax,eax代码清单5-1中if的比较条件为“argc==0”,如果成立,即为真值,则进入if语句块内执行语句。但是,转换后的汇编代码使用的条件跳转指令JNE判断结果为“不等于0跳转”,第5章流程控制语句的识别111这是为什么呢?因为按照if语句的规定,满足i
4、f判定的表达式才能执行if的语句块,而汇编语言的条件跳转却是满足某条件则跳转,绕过某些代码块,这一点与C语言是相反的。既然这样,那为什么C语言编译器不将else语句块提到前面去并把if语句块放到后面去呢?这样汇编语言和C语言中的判定条件不就一致了吗?因为C语言是根据代码行的位置来决定编译后的二进制代码的地址高低的,也就是说,低行数对应低地址,高行数对应高地址,所以有时会使用标号相减得到代码段的长度。鉴于此,C语言的编译器不能随意改变代码行在内存中的顺序。根据这一特性,如果将if语句中的比较条件“argc==0”修改为“if(argc>0)”,则其对应的汇编语言所使
5、用的条件跳转指令会是“小于等于0”。代码清单5-2if语句大于0比较—Debug版//C++源码说明:if语句大于0比较if(argc>0){printf("%dr",argc);}//C++源码与对应汇编代码讲解//C++源码对比,如果参数argc大于0,结果为真,进入执行语句if(argc>0);使用CMP指令,将ebp+8地址处的4字节数据与0相减0040103Fcmpdwordptr[ebp+8],000401043jleMyIf+42h(00401052){;printf函数调用讲解略//if语句结束处}00401052popedi通过代码清单5-
6、1和代码清单5-2的示例分析,可总结出if语句的转换规则:在转换成汇编代码后,由于当if比较结果为假时,需要跳过if语句块内的代码,因此使用了相反的条件跳转指令。将4.2.2节的代码清单4-10与代码清单5-2进行对比分析可知,两者间的结构特征十分相似,但使用的条件跳转指令不同。由此可见,在反汇编时,表达式短路和if语句这两种分支结构的实现过程都是一样的,很难在源码中对它们进行区分。总结:;先执行各类影响标志位的指令;其后是各种条件跳转指令jxxxxxx如果遇到以上指令序列,可高度怀疑它是一个由if语句组成的单分支结构,根据比较信息与条件跳转指令,找到其跳转条件相
7、反的逻辑,即可恢复分支结构原型。由于循环结构中也会出现类似代码,因此在分析过程中还需要结合上下文。112第二部分C++反汇编揭秘5.2if…else…语句5.1节讲述了if语句的构成,但是,只有if的语句是不完整的分支结构,图5-1对比了两种语句结构的执行流程。图5-1if与if…else…结构对比如图5-1所示,if语句是一个单分支结构,if…else…组合后是一个双分支结构。两者间完成的功能有所不同。从语法上看,if…else…只比if语句多出了一个else。else有两个功能,如果if判断成功,则跳过else分支语句块;如果if判断失败,则进入else分支语
8、句块中。有
此文档下载收益归作者所有