一、 條件分支的逆向基礎
(1)簡單if-else
我們知道簡單的if-else的跳轉結構是這樣的。
例如:
if(i1<x1)
……;
else
……;
在反彙編結果中我們會看到類似下面的結果
兩點說明::
①jxx AAAAAAAA 這句由於false則跳轉,因此還原爲if代碼時,要注意。
②jmp BBBBBBBB 這句在功能上屬於if的部分,但是如果沒有else,編譯器不會填寫此句。
(2)多層嵌套if-else
if(i<x1)
{…
if(i<x2)
{…
if(i<x3)
…..
else
…..
}
else
……
}
對應反彙編形態:(地址A、B、C、D從小到大分佈)
Debug版
說明:
這裏我們看到在Debug版裏,多層嵌套if-else只是簡單重複單層if-else的結構。另外,jxx仍然是false則跳轉,翻譯爲if時,要注意。
Release版
說明:
我們看到Release版對Debug改進,避免了jmp的多次運行。
二、複雜條件的條件分支逆向
1.複合條件的條件分支
(1)與——&&
if(i1<x1 && i2<x2 && i3<x3)
……
else
……
反彙編形態:
(2)或——||
if(i1<x1 || i2<x2 || i3<x3)
……
else
……
反彙編形態:
(3)混合
if(i1<x1||i2<x2&&i3<x3)
……
else
……
if(i1<x1&&i2<x2||i3<x3)
……
else
……
反彙編形態: