第一部分 程式碼逆向技術基礎

滕瑞發表於2015-03-22

第1章 關於逆向工程:

“嗯,先學這些概念吧,其他慢慢學。”這才是學習逆向技術的正確態度。

逆向工程需要的基礎還是挺多的,彙編,C/C++語言,Windows程式設計,以及各種工具的使用。這些都不是一蹴而就的。看到高手也是這麼過來的,多少給了我一點繼續讀下去的信心。

第2章 逆向分析Hello World!程式:

我的開發環境是Visual Studio Express 2013,書上的第一個例子就遇到了連結問題。原因是書上的工程用的是控制檯應用程式專案,而我自以為是地建了一個Windows應用程式的專案。解決的方法是重新建立一個Console應用程式專案,或者把_tmain()方法替換為WinMain()。

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

隨後下載了一個OllyDbg1.10版本,開始了真正的逆向除錯。摸索了半天后,瞭解到預設會有4個視窗:“程式碼視窗”,“資料視窗”,“暫存器視窗”和“棧視窗”。當需要執行Ctrl + G的時候,要選對視窗才行。

第一種“打補丁”的結果如下:

enter image description here

第二種“打補丁”的結果如下:

enter image description here

書上提示說程式無法執行是正常的,學過第13章後就可以理解了-_-!

第3章 小端序標記法

有點簡單,暫時略過。

第4章 IA-32暫存器基本講解

書上說剛開始先了解8個通用暫存器的用途即可。不過這8個暫存器也好難啊。。。

第5章 棧

“棧是逆向擴充套件的”,一般畫那個4G虛擬記憶體的時候,左上是0地址,右下是4G,棧向低地址擴充套件,而堆的地址向高地址擴充套件。在OllyDbg裡面一直按住F7或者F8,右下角的棧視窗可以較直觀顯示棧的增長和壓縮。

第6章 分析abex' crackme#1

這一節的示例程式會被識別為木馬,於是輾轉到沒有防毒程式的Windows虛擬機器裡進行試驗。

enter image description here

第7章 棧幀

這一章詳細介紹了棧,並提到了緩衝區溢位的隱患,另外還講了幾個簡單的彙編指令。

每個函式開始都是儲存EBP,大學微機原理考試時,老師說寫出這兩行的就給一半分。

PUSH EBP 
MOV EBP,ESP

移動ESP就相當於開闢了棧空間:

SUB ESP,8

函式返回的時候,再恢復原來的棧:

MOV ESP,EBP
POP EBP

這裡的POP操作其實是將EBP當前地址中儲存的值,作為EBP的新地址(值)。同樣,之前的PUSH操作,其實是在EBP的新地址中儲存了原來EBP的地址。總之EBP的值的地址上儲存的是前一個EBP指向的地址。

另外學到了幾個新設定:

  1. 在棧視窗中右鍵->Address->Relative to EBP
  2. 不勾選Disasm中的“Show Default segments”和“Always show size of memory operands”
  3. 勾選Analysis1中的“Show ARGs and LOCALs in procedures”
  4. 另外,作者好像還在程式碼視窗配置了Appearance->Highlighting->Christmas Tree

第8章 abex' crackme #2

這一章破解的是VB程式。工具比較熟悉了以後,直接打斷點,然後在棧視窗中找到EBP,往上面找找就看到了比較的字串。成功破解,但序號產生器的演算法有點麻煩了,先略過。

enter image description here

第9章 Process Explorer

下載了Process Explorer,用它發現我的電腦上Google Update一直在後臺執行著,或許是以前玩GAE的時候留下的。暫時沒有發現其他可疑的程式。

第10章 函式呼叫約定

今天搞清楚了cdecl,stdcall和fastcall的區別了,以前只在程式碼和連結資訊裡面見過這些欄位。其中cdecl是呼叫者負責處理棧,stdcall是被呼叫者清理棧。fastcall與stdcall類似,但通常會使用暫存器傳遞引數,而非棧記憶體。使用棧傳遞引數,往往會用[EBP+8],[EBP+C]這樣的棧地址訪問引數,而是用暫存器是直接用ECX和EDX暫存器傳遞引數。

第11章 視訊講座

http://www.tuts4you.com

還沒有去下載,先存個書籤。

破解結果:

enter image description here

第12章 究竟應當如何學習程式碼逆向分析

不知不覺竟然看完了第一部分,而且自己動手實踐了裡面的例子,感覺還是挺有意思的。希望能堅持看完這本書吧!

相關文章