反彙編之流程控制語句的識別(if...else...語句)
阿新 • • 發佈:2019-02-03
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 .... 語句結構圖