if ..... else .... 组合后是一个双分支结构,两者间的功能有所不同。从愈发上看,if...else.... 只是比 if 多出了一个 else, else, 有2个功能,如果 if 判断成功,
则跳过else分支语句块, 如果,if 判断失败,则进入else 语句块。 有了 else语句块的存在,程序在进行流程选择时,必会经过2个分支中的一个。
总结:
;先执行影响标志位的相关指令
jxx ....................................else_begin
if _begin
........
if_end
jmp ...... else_end
else_begin
.....
else_end
如果遇见以上指令,先考察其中的两个跳转指令,当地一个条件跳转指令跳到 else_begin 处的之前有个jmp 指令,则可视为由 if ... else ....组合而成的双分支结构。
根据这两个跳转指令可以得到 if 和 else 语句块的代码边界。通过 cmp 与 jxx 可 还原出 if 的比较信息, jmp 指令之后即为 else 语句块的开始,依次分析,即可逆向分析出 if ....else..... 组合原型。
但是,有时候会遇到复杂的条件表达式作为分支或者循环结构的判定条件的情况, 这时即使直接阅读高级源码也会让人抓狂。在没有 高级源码的情况下,分析者需要先定位语句块的边界,然后根据跳转目标和逻辑依赖慢慢反推出高级源码。
附上 if .... else .... 语句结构图