C++反匯編第六講,認識C++中的Try catch語法,以及在反匯編中還原


           C++反匯編第六講,認識C++中的Try catch語法,以及在反匯編中還原

我們以前講SEH異常處理的時候已經說過了,C++中的Try catch語法只不過是對SEH做了一個封裝.

如果不懂SEH異常處理,請點擊博客鏈接熟悉一下,當然如果不想知道,也可以直接往下看.因為異常處理所以做了封裝,但是不影響我們還原.

這里有兩種解決方法,

第一種,小白也能明白了還原方式,不用懂原理

第二種,了解其原理,並能在IDA中正確的還原.

SEH異常處理博客鏈接:

  http://www.cnblogs.com/iBinary/category/1083755.html

一丶小白也懂的異常處理還原.

第一種,不用懂任何原理,(反匯編要懂,最起碼的匯編代碼知道是什么,不然這個專題講了你也看不懂)

先看下高級代碼:

  

int main(int argc, char* argv[])
{
    try
    {
        throw 3;//拋出3整形的異常
    }
    catch (int)
    {
        printf("%d\r\n",3);
    }
    return 0;
}

OD調試,觀看步驟.

首先步驟分兩步.

1.找SEH異常處理回調.

2.找參數多的call下斷點

3.最后一個是call 寄存器.則找到正確的cath位置.

 

1.找到SEH的異常處理回調函數(如果不懂,看下SEH的篩選器異常.)

觀看棧參數,可以看到回調函數地址是00410CC0,此時反匯編窗口跟過去下斷點.

2.觀看參數多了call,下斷點,然后跟進.

因為層級較多,這里大家動手實戰即可.

3.找到最后一層call一個寄存器.

此時則找到了我們的cath處理塊了.

 

二丶理解原理進行實戰.

上面說的,不懂原理你也可以做.比如以后工作了,原理不懂,起碼做代碼還原的時候還可以混口飯吃 ^_^

下面講解原理.

首先,我們先尋找數據關系.

一個函數可以有多個 try 這是沒問題的,所以 函數和try的關系是一對多的關系.

一個try有多個catch也是沒有問題的.那么對應關系也是一對多.

所以操作系統為了管理這些.需要建表.(當然是未公開的),我們可以逆向得知.

1.原理介紹,上半部分表

觀看表

看到怎么多表是不是很暈.其實很簡單,只是里面的某個字段對我們有用.

1.觀看函數信息表FuncInfo,重要字段就是dwTryCount,以及pTryBlockMap,我們說過一個函數可以有多個try,所以函數信息就記錄了try的個數.以及每個try的try塊結構,關於上面的成員,都是SEH的異常展開的.要做首尾動作的,對於我們還原沒有任何阻礙,可以不用理解.

2.TryBlockMap表(tyr塊信息表),我們還說過,一個try可以有多個catch,顯然,try塊信息表也要記錄catch的個數.一個catch信息塊的結構.

3.cathch信息塊的結構體(msRTTIDsrc)msRTTIDsrc這個表是IDA識別的,我們可以自己說他是catch信息表,msRTTIDsrc的全名是 Microsoft Run Time TypeInfo ....微軟運行時類型識別.

表結構體中重要字段就是 dwCount,catch信息快的個數,一個cathch信息表.

4.catch信息表(msRTTIDsrc),里面有4個成員, nflag 一個標志,表示你是常量,還是變量,還是引用. ptype,表示你的類型是什么類型.是int,還是float什么的,這個有個專門的表格存放着.下面重要字段則是catch的函數地址.編譯器內部編譯的時候,編譯的catch是一個函數,也是有返回值的,返回值是catch_end的位置.

到這里,我們的上半部分就看完了.

總結一下:

  對於上半部分.主要着重於 函數信息表,try塊表.catch表.以及catch塊表.

為什么說上半部分,是這樣的,對於我們還原來說.有兩種情況.

1.完整的還原trycatch的異常信息結構

2.找到關鍵的catch匹配函數.

這兩種是完全不一樣的,如果我們還原就看上版本的表.如果我們要找那個catch捕獲異常,則看下部分的表,(下面講解.)

實戰演練.

實戰演練的時候,我們就要知道函數信息表在哪,其實我們已經找到了,只不過大家不知道,按照小白思路為什么一路跟就可以找到catch塊表.只是我們沒講.

1.找到注冊異常回調的地方,進入回調函數內部.

2.看到反匯編.

這個地方,給eax賦值的地址就是函數信息表了.我們用IDA打開.根據表結構可以很自然的就能找到.catch塊的位置.

IDA實戰.

1.找到函數信息表點擊進去

可以看到MaicNumber等等一些列的東西.

,通過最后一個成員,可以找到Try塊信息表.

2.找到Try塊信息表

可以看到Try塊信息表中有幾個Catch信息.

3.找到Catch信息表.

看到最后是catch的回調地址,里面則是catch的位置.

我們也能看到類型是什么.自己點擊進去看看即可.

4.找到Catch函數地址,點擊查看.

正確找到了Catch塊了.

 

2.下半部分表格詳解.

上面的部分是針對我們還原做的.下半部分主要就是找我要快速定位這個異常是誰接受的,那個catch塊處理的.

第一個表  異常拋出表,重要字段catch數組表

第二個表是個數組表,一個throw對應多個catch,所以有個數組,這個數組是異常匹配表.表明了有多少個catch可以匹配.

一個記錄個數,第二個成員則是二級指針.其內容是一個地址,其地址是一個cathc信息塊的結構.

實戰演練.

關於異常拋出表要怎么尋找,還記得的我們的高級代碼有一個 throw嗎?,其位置就是拋出異常表的位置.

關於拋出異常,我們需要了解的知識.當我們拋出一個常量或者變量的時候,不管怎么樣,都會建立一個內存單元來接受我們拋出的值.所以別看你拋出的是常量,其實也成為內存單元了,也相當於一個變量了.

1.找到異常信息表.

最后一個成員是catch表.這個表保存了可以匹配的catch有多少個.

2.找到catch異常信息匹配表.

可以看出,值為1,下面是一個catch表,表明了有一個匹配的.

3.找到catch信息表.

通過異常信息表的第二個參數,也就是類型表,可以看是哪個匹配的.而且對類型表做一個引用,看誰引用類類型表,則能找到catch的函數地址.當然這一步是還原的動作.

4.找到類型表.對類型表做一個交叉引用.

如果引用顯示的太少了,可以自己百度,  IDA引用數量調整.看怎么設置的,或者當前位置按  x鍵查看.

如果按x,跳過去的是try塊表,你需要通過try塊表可以直接查看.那個catch信息表.

 

今天講的主要是表結構.如果想對每一個成員都了解,並且想知道怎么跟出來了. 可以看一下書籍  <<C++反匯編與逆向分析揭秘>>也就是一本小黃書.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM