逆向分析之尋找main函數
作者: 日月明
時間:2010-01-19
工具:ollydbg、IDA、peid
剛接觸逆向分析,看到一行行的彙編代碼,不時感到一陣陣頭痛,不知道從何入手。思來想去,還是想看看我們在C語言中的main函數它在什麼地方吧。。。。。。。。。。。
看看C語言的main函數吧
int main(int argc, char* argv[])
{
printf("Hello main!/n");
return 0;
}
當我們用ollydbg載入一個程序時,程序首先停留在程序入口點(通過peid可以看到)。如圖:
按F8在ollydbg中單步調試,go,go。。。。。。。。。。。。。。。
當來到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程序來說,主要是尋找其中的關鍵地方,沒有過多的關注MFC的main函數,所以這裏對MFC的main函數就不再過多的討論了。。