C++程序反編譯(5) 掃雷1
????

????這次來嘗試反編譯Windows XP的掃雷, 主要工具是IDA Pro和Visual Studio.
????我使用的IDA Pro版本是7.5, Visual Studio 則是2013.

一、 IDA Pro打開掃雷.exe
????首先打開IDA Pro, 點擊菜單 File -> Open, 然后選擇 掃雷.exe,? 默認值就好, 點擊OK, 等待IDA分析完成.?
????

????如果打開后提示有什么pdb文件, 選否就行了, 這是要載入調(diào)試用的數(shù)據(jù)庫文件, 里面包含了各種原始的調(diào)試信息, 比如變量名這些, 實際上winmine.pdb我們獲取不到.

????識別完成后, 可以看到如下界面(右邊原來是只有匯編代碼的流程圖顯示, 按F5反編譯后得到C語言偽代碼):
????

????左邊列出了識別出來的函數(shù), 共85個. 右邊則是入口函數(shù)start, 我初步判斷這個函數(shù)是主函數(shù), 以為它返回int, 且沒有參數(shù), 很向int main().?但其實不是, 這需要從它內(nèi)部的代碼看了, 主要通過粉紅色的系統(tǒng)給API來判斷.

????上面代碼是start函數(shù)的中間部分, _getmainargs, 應(yīng)該是獲取主函數(shù)的參數(shù),.

既然前面是獲取主函數(shù)的參數(shù), 那么接下來肯定是要調(diào)用主函數(shù)了, 調(diào)用完就退出程序, 所以, sub_10021F0才是真正的主函數(shù). 但它到底是main還是WinMain? main只有0個參數(shù)和兩個參數(shù)版本, 所以不是main, 而WinMain是4個參數(shù)的, 并且第一個參數(shù)是HANDLE類型, 正好對應(yīng)GetModuleHandle類型, 因此,?sub_10021F0是WinMain函數(shù).
????

二、 創(chuàng)建Win32項目
????點擊菜單 File -> Produce file -> Create C file... , 或者快捷鍵 Ctrl + F5, 導出C代碼文件.
????Visual Studio創(chuàng)建空的Win32項目, 將導出的C文件添加到項目中, 如下:

可以看到, 共2800多行, 無數(shù)個錯誤. 而且缺少了頭文件defs.h, defs.h可以在IDA Pro的安裝目錄下找到, 找到之后, 復制一份并添加到當前項目中, 錯誤大概少了90%, 但還是很多.

三、后記
????目前為止, 所做的都是比較簡單的事, 前面也說過了, 反編譯的難點還在后面, 一篇文章介紹不了那么多, 因此, 這篇文章就先到這里.
????這個掃雷程序只有117KB, 可反編譯出來的C代碼卻有2800多行, 可見, 反編譯到底是多難的事.