文档详情

第五章 程序流程控制语句的识别.pdf

发布:2017-06-01约3.12千字共19页下载文档
文本预览下载声明
程序流程控制语句 软件学院 王冬琦 程序控制语句的识别 • 程序控制语句是计算机程序的最重要组成 部分,通过本章的学习,学习的意义在于: 逆向分析必学; 清晰高级语言中程序控制语句的内部实现, 提高开发调试高级语言的能力。 本章主要内容: 1. 分支语句:IF.. ELSE..;switch;do/while/for 2. 编译器的优化 分支语句 • IF语句 Build debug版本的简单IF程序,使用IDA 反汇编并分析IF语句的工作流程,为汇编程序 撰写注释并作为大作业的一部分。 留意红框内的汇编代码,思考这部分代码的功能 分支语句 C++ :IF(xxx) then yyy 汇编:JNE ZF非0则跳转 这里注意在分析目标程序的反汇编代码时, JNE和IF的逻辑是相反的,因此在试图还原成 C++或高级语言时应熟知这一点。 分支语句 • IF ELSE的嵌套 通过分析可知,IF分支与单IF的内部 实现一致,条件不成立时(ELSE)之 前cmp 比较之后跳转到的地址即为ELSE 语句块的起始地址。熟知这个过程, 让我们很容易找到对应的语句块,进而 分析语句块的功能。 argc==0 argc!=0 分支语句 • IF/IF ELSE语句的结构分析 思考,是否满足左侧这种形式汇编指令其高 级语言代码一定为if else组合?Why ? 两个跳转,第一个跳转的目的(ELSE_BEGIN)之前有一个jmp指令,则可将 这段代码看成是IF ELSE组合而成的双分支结构,据此得到If 和else的块的边界。 cmp 和jxx还原出if的比较信息,jmp指令之后即为else块开始。依此,就可以 分析出if..else..组合的原型。 分支语句 • 有关if else 组成的多分支,请参见学生用文 档4 ,根据该文档进行以实验的形式学习分 析方法。 分支语句 • Switch也是一种分支语句,一般认为switch 的效率要高于if else,下面我们看一下 switch是如何实现的。下面是一段3分支 switch代码,其反汇编结果如下页所示。 3分支swtich 的反汇编结果 分支语句 • 通过以上反汇编结果可知,可以通过分析 条件跳转之后是否有语句块来判定是否为 switch 。 • 另外,如果跳转到的目的语句块中如果有 break,语句块结尾就会出现jmp ,这些jmp 就都会跳到同一个地址,如果不含break, 则可参考两个条件跳转目的地址定位他们 之间的case语句块。 如图所示的代码和其反汇编片段,其中 jumptable是由case语句块首地址组成的表 (数组)。 当
显示全部
相似文档