逆向分析之尋找main函數

逆向分析之尋找main函數

作者: 日月明

時間:2010-01-19

 

工具:ollydbgIDApeid

 

   剛接觸逆向分析,看到一行行的彙編代碼,不時感到一陣陣頭痛,不知道從何入手。思來想去,還是想看看我們在C語言中的main函數它在什麼地方吧。。。。。。。。。。。

看看C語言的main函數吧

 int main(int argc, char* argv[])
{
  printf("Hello main!/n");
  return 0;
}

 

   當我們用ollydbg載入一個程序時,程序首先停留在程序入口點(通過peid可以看到)。如圖:

 

  

F8ollydbg中單步調試,gogo。。。。。。。。。。。。。。。

 

 

當來到call dword ptr ds:[<&KERNEL32.GetCommandLineA>]指令後,就說明我們離main函數不遠了。我們發現後面有許多call指令,請注意:我們要找的main函數就在其中的某個call中。

那主要函數所對應的是哪個call呢????

再按F8,當來到一個call指令,此時按F7跟入如圖:

發現此函數調用了一些系統環境變量初始化的一些函數。顯然,它不是我們所要找的main函數。

再按F8,來到call指令,依次跟進,重複上面的過程。當我們來到main函數的call時跟進發現如圖:

 

call是直接到了一個jmp指令,然後再由jmp所到的地址繼續執行。Jmp跳轉到如圖指令

典型的幾個壓棧指令。可以看出,這就是我們的main函數入口了。。。。

注意:jmp所到的地址就是我們main函數地址!!!!

終於,我們的mian函數找到了吧。。。。。。

 

總結:

1.         載入程序來到GetCommandLineA指令處。(離main不遠了,就在之後的某個call指令之後)。

2.         依次跟進後面的每個call指令,發現call指令來到jmp後又跳轉到幾個典型的壓棧指令,說明這就是main函數。

以上尋找main函數的方法適用於控制檯、win32 等,不適用於由MFC寫的程序。

 

我們知道由MFC寫的程序main函數是經過封裝的,那我們如何尋找它的main函數呢???

好了,現在我再帶大家一起來找一下MFC中的main函數吧。Let’s go ! 。。。。。。

 

首先,我們來看,進入main函數之前MFC的初始的東東比較多如圖:

 

 

F8單步,最後來到了

call dword ptr ds:[<&KERNEL32.GetModuleHandleA>] ; kernel32.GetModuleHandleA

些時,我們發現沒有GetCommanLineA函數。也許是執行略有不同吧。來到此指令之後也意味着我們離main函數不遠了,依次重複跟進後面的call指令。

 

 

跟入call指令之後發現後面還有好多call啊,嚇了一跳。。不怕,不怕。我們發現有個call也要來到jmp指令,然後再跳轉到一個指定的地址。(這不是和上面的類似了嘛!!)。

注意:jmp跳轉到的地址就是我們的main函數。

Yeah,終於找着了吧。。。。

 

對於我們分析MFC程序來說,主要是尋找其中的關鍵地方,沒有過多的關注MFCmain函數,所以這裏對MFCmain函數就不再過多的討論了。。

 

 

 

 

發佈了20 篇原創文章 · 獲贊 4 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章