- 1、本文档共19页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第五章 程序流程控制语句的识别
程序流程控制语句
软件学院
王冬琦
程序控制语句的识别
• 程序控制语句是计算机程序的最重要组成
部分,通过本章的学习,学习的意义在于:
逆向分析必学;
清晰高级语言中程序控制语句的内部实现,
提高开发调试高级语言的能力。
本章主要内容:
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语句块首地址组成的表
(数组)。
当
文档评论(0)