初識exe程序反匯編小感[轉(zhuǎn)]
本文出自 “空中的魚” 博客,出處http://airfish.blog.51cto.com/358752/264819
一、工作環(huán)境:
1、查殼工具:PEiD(用于初步確定exe程序是否加殼以及使用何種開發(fā)軟件編寫);
2、反編譯工具:DeDe(經(jīng)過查殼工具檢查,將要被反匯編的程序是用“BorlandC++1999” 編寫的,所以選用專門反編譯Delphi程序的DeDe;用于初步確定程序模塊、函數(shù)方法劃分對應(yīng)exe程序相應(yīng)匯編指令地址的位置);
3、反匯編動態(tài)調(diào)試工具:OllyICE(即,OD;用于動態(tài)反匯編調(diào)試程序的相關(guān)代碼邏輯);
4、開發(fā)環(huán)境:VS.NET 2005;
5、其他工具:EditPlus、記事本、計算器等若干;

“多項(xiàng)掃描”上面那行“Microsoft Visual C++ 7.0 Dll Method3” 就是該程序的開發(fā)環(huán)境了。
接下來電擊窗口右下角的“>>”按鈕,再來看看該程序是否加殼,如示意圖2:

分別點(diǎn)擊“熵值”、“EP校驗(yàn)”、“快速校驗(yàn)”這三行最右側(cè)的“-”按鈕,就可以看到是否加殼的提示了。
哈哈,test.exe程序太干凈了。沒有任何加殼,可以選用相應(yīng)的反編譯工具進(jìn)行下一步啦。 ^_^

注意選擇“過程”按鈕,如上圖所示。然后雙擊右下側(cè)列表中的Button3Click,就可以查看該方法對應(yīng)的函數(shù)體了。當(dāng)然,這樣看到的函數(shù)體不會是我們一般意義上的函數(shù)體,這函數(shù)體只有一個框架是高級語言的樣子,函數(shù)體內(nèi)部都是匯編代碼,不過這已經(jīng)足夠了,后面我們還要進(jìn)行詳細(xì)的反匯編調(diào)試分析呢。嘿嘿。函數(shù)體示意圖5如下:

好,記下這段函數(shù)的首地址、尾地址,開始嘗試反匯編操作。
4、 反匯編準(zhǔn)備:
使用OD(OllyICE)打開test.exe程序,如示意圖6:

找到剛才記錄下的首地址、尾地址。如上圖中兩個黑圓點(diǎn)處的紅條,分別是首地址:00401EC4、尾地址:00401EF5。
5、 反匯編調(diào)試:
根據(jù)步驟4中定位的匯編指令地址,再結(jié)合示意圖6中[ASCII”Hello OD”]、[ASCII”this is OllyDbg DeAsm”]等關(guān)鍵字符串,進(jìn)行所有匹配字符串的檢索,就可以開始使用OD進(jìn)行調(diào)試了。具體使用方法請參閱OD自帶的help文件。
逐句分析所需部分的匯編代碼邏輯流程。其間可以用其他一些輔助工具來幫助記錄動態(tài)分析過程中的數(shù)值傳遞軌跡及變換方法。
6、 C++實(shí)現(xiàn):
近期由于一個項(xiàng)目的需要,我初步接觸了exe程序反匯編。折騰了好幾天終于見到了那個程序中急需的算法的真面目了。回顧整個過程,小有感悟。為記念初識程序反匯編的心路歷程,特記錄下對程序反匯編過程的粗淺感受。
一、工作環(huán)境:
1、查殼工具:PEiD(用于初步確定exe程序是否加殼以及使用何種開發(fā)軟件編寫);
2、反編譯工具:DeDe(經(jīng)過查殼工具檢查,將要被反匯編的程序是用“BorlandC++
3、反匯編動態(tài)調(diào)試工具:OllyICE(即,OD;用于動態(tài)反匯編調(diào)試程序的相關(guān)代碼邏輯);
4、開發(fā)環(huán)境:VS.NET 2005;
5、其他工具:EditPlus、記事本、計算器等若干;
二、基礎(chǔ)知識:
1、匯編程序設(shè)計:主要深入了解程序數(shù)據(jù)存放、堆棧使用、子程序調(diào)用等技巧;不同類型數(shù)據(jù)的地址跳轉(zhuǎn)規(guī)則(一般都是跳轉(zhuǎn)該類型長度個位置);
2、c++程序設(shè)計:基本語法結(jié)構(gòu);指針、數(shù)據(jù)類型的使用和控制;
3、相關(guān)工具軟件的基本使用方法;
1、匯編程序設(shè)計:主要深入了解程序數(shù)據(jù)存放、堆棧使用、子程序調(diào)用等技巧;不同類型數(shù)據(jù)的地址跳轉(zhuǎn)規(guī)則(一般都是跳轉(zhuǎn)該類型長度個位置);
2、c++程序設(shè)計:基本語法結(jié)構(gòu);指針、數(shù)據(jù)類型的使用和控制;
3、相關(guān)工具軟件的基本使用方法;
三、工作過程:
我的反匯編大概過程是:
查殼->脫殼、判斷開發(fā)程序使用的環(huán)境->反編譯->初步定位主要功能模塊或函數(shù)的匯編指令起始、終止地址->反匯編準(zhǔn)備->查找程序中的特征字符串或特征值,進(jìn)一步確定需要反匯編的代碼邏輯的位置->開始反匯編調(diào)試運(yùn)行,分析需要反匯編的代碼邏輯的具體過程->將分析出來的邏輯流程使用c++語言實(shí)現(xiàn)。
我的反匯編大概過程是:
查殼->脫殼、判斷開發(fā)程序使用的環(huán)境->反編譯->初步定位主要功能模塊或函數(shù)的匯編指令起始、終止地址->反匯編準(zhǔn)備->查找程序中的特征字符串或特征值,進(jìn)一步確定需要反匯編的代碼邏輯的位置->開始反匯編調(diào)試運(yùn)行,分析需要反匯編的代碼邏輯的具體過程->將分析出來的邏輯流程使用c++語言實(shí)現(xiàn)。
1、 查殼:
運(yùn)行PeiD,打開要反匯編的exe程序,在這里姑且稱之為:test.exe吧。
如示意圖1:
運(yùn)行PeiD,打開要反匯編的exe程序,在這里姑且稱之為:test.exe吧。
如示意圖1:

“多項(xiàng)掃描”上面那行“Microsoft Visual C++ 7.0 Dll Method
接下來電擊窗口右下角的“>>”按鈕,再來看看該程序是否加殼,如示意圖2:

分別點(diǎn)擊“熵值”、“EP校驗(yàn)”、“快速校驗(yàn)”這三行最右側(cè)的“-”按鈕,就可以看到是否加殼的提示了。
哈哈,test.exe程序太干凈了。沒有任何加殼,可以選用相應(yīng)的反編譯工具進(jìn)行下一步啦。 ^_^
2、 反編譯:
“1、”中只是示意圖,我實(shí)際反編譯的程序是由“BorlandC++1999” 編寫的,所以選擇DeDe 3.5作為反編譯工具;DeDe3.5的具體使用方法,請自行在網(wǎng)上查閱。
示意圖3:
“1、”中只是示意圖,我實(shí)際反編譯的程序是由“BorlandC++
示意圖3:

注意選擇“過程”按鈕,如上圖所示。然后雙擊右下側(cè)列表中的Button3Click,就可以查看該方法對應(yīng)的函數(shù)體了。當(dāng)然,這樣看到的函數(shù)體不會是我們一般意義上的函數(shù)體,這函數(shù)體只有一個框架是高級語言的樣子,函數(shù)體內(nèi)部都是匯編代碼,不過這已經(jīng)足夠了,后面我們還要進(jìn)行詳細(xì)的反匯編調(diào)試分析呢。嘿嘿。函數(shù)體示意圖5如下:

好,記下這段函數(shù)的首地址、尾地址,開始嘗試反匯編操作。
4、 反匯編準(zhǔn)備:
使用OD(OllyICE)打開test.exe程序,如示意圖6:

找到剛才記錄下的首地址、尾地址。如上圖中兩個黑圓點(diǎn)處的紅條,分別是首地址:00401EC4、尾地址:00401EF5。
5、 反匯編調(diào)試:
根據(jù)步驟4中定位的匯編指令地址,再結(jié)合示意圖6中[ASCII”Hello OD”]、[ASCII”this is OllyDbg DeAsm”]等關(guān)鍵字符串,進(jìn)行所有匹配字符串的檢索,就可以開始使用OD進(jìn)行調(diào)試了。具體使用方法請參閱OD自帶的help文件。
逐句分析所需部分的匯編代碼邏輯流程。其間可以用其他一些輔助工具來幫助記錄動態(tài)分析過程中的數(shù)值傳遞軌跡及變換方法。
6、 C++實(shí)現(xiàn):
根據(jù)分析出的匯編代碼邏輯,使用C++實(shí)現(xiàn)同樣的功能。
備注:在定位反匯編所需的代碼位置時,除了一些ASCII字符串的定位方法,還能通過程序中聲明的一些常量字符串、映射控制矩陣、計數(shù)器等常量來進(jìn)行更為精確的定位。
以上就是我初識程序反匯編主要過程的記錄。注意:由于“保密協(xié)議”的限制,在此不便過多討論項(xiàng)目代碼細(xì)節(jié)。還望大家敬請原諒。寫的很粗淺,希望有反匯編經(jīng)驗(yàn)的前輩不吝指教,在此,先謝過啦。哈哈 ^_^
posted on 2010-08-11 10:44 luqingfei 閱讀(5954) 評論(1) 編輯 收藏 引用 所屬分類: 反匯編