程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> c程序的啟動過程的反匯編分析

c程序的啟動過程的反匯編分析

編輯:關於C

0x01 工具准備

1.最簡c代碼一只,

int main(){

return 0;}

2.ollydbg

3.VC++6.0

4.GCC(mingw)

0x02 代碼分析

int main()

{

return 0;

}

在gcc下,添加-nostdlib編譯選項,即鏈接器不鏈接標准庫,會提示以下錯誤信息:

D:\Backup\我的文檔\src>gcc main.c -nostdlib-o main.exe

C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\ccmSU3wr.o:main.c:(.text+0x9): undefined re

ference to `__main'

collect2.exe: error: ld returned 1 exit status

關於-nostdlib編譯選項,只有命令行指定的項才傳遞給鏈接器。標准啟動文件和庫都不會傳遞給鏈接器。該選項隱式打開選項-nostartfiles 和-nodefaultlibs。該選項也可以寫作--no-standard-libraries。

在gcc執行匯編之後,在鏈接部分,當只打開選項-nostartfiles時,結果正常,未出現錯誤信息。而在-nodefaultlibs選項中,提示很多錯誤信息。

vcHL0rvQqbqvyv2jrMD9yOdwcmVfY3BwX2luaXShomNoZWNrX21hbmFnZWRfYXBwoaJwcmVfY19pbml0oaJfdG1haW5DUlRTdGFydHVwoaJfSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2VQb2ludGVyoaJkdXBsaWNhdGVfcHBzdHJpbmdzoaJXaW5NYWluQ1JUU3RhcnR1cKGibWFpbkNSVFN0YXJ0dXChol9taW5nd19wcmVwYXJlX2V4Y2VwdF9mcl9tc3ZjcjgwX2FuZF9oaWdoZXKhrS48L3A+CjxwPrvjseDA78PmtcRfbWFpbr7NysdD0+/R1MDvw+a1xG1haW6jrMrH0vLOqrvjseDG97rNQ7Hg0uvG97bUt/u6xbXEw/zD+7Lu0ru49s/Cu67P36GjPC9wPgo8cD7BtL3Txve74dTaz7XNs7Hq17y/4s7EvP6jrMDgJiMyMDI4NDvT2i9saWIvY3J0Mi5vtcTOxLz+1tCjrNGw1dJfc3RhcnS3+7rFo6zIu7rz1Npfc3RhcnTW0Na00NC0tL2ottG21M/zo6zVu6OstPK/qs+1zbPUpM/IzOG5qbXEyeixuKOsvathcmd2LGFyZ2Oyzsr9tKvI621haW66r8r9o6zIu7rztffTw21haW66r8r9oaM8L3A+CjxoMT4KPHA+MHgwMyAgdmMgbWFpbrqvyv23tLvjseC31s72PC9wPgo8L2gxPgo8cD48L3A+CjxwPjE6ICAgIGludCBtYWluKCk8L3A+CjxwPjI6ICAgIHs8L3A+CjxwPjAwNDAxMDEwICAgcHVzaCAgICAgICAgZWJwICAgLy/U2rbR1bvJz7GjtOZFQlA8L3A+CjxwPjAwNDAxMDExICAgbW92ICAgICAgICAgZWJwLGVzcCAvL72rttHVu7Wxx7DOu9bDuPhFQlCjrNLU1Nq20dW7veG5udbQtOa0oiYjMjA1NDA7yrG1xLLOv7y14zwvcD4KPHA+MDA0MDEwMTMgICBzdWIgICAgICAgICBlc3AsNDBoIC8vt9bF5L/VvOQ8L3A+CjxwPjAwNDAxMDE2ICAgcHVzaCAgICAgICAgZWJ4ICAvL7GjtObK/b7dts4mIzIwNTQwOzwvcD4KPHA+MDA0MDEwMTcgICBwdXNoICAgICAgICBlc2kgLy/UtLXY1rfWuNXrPC9wPgo8cD4wMDQwMTAxOCAgIHB1c2ggICAgICAgIGVkaSAvL8S/tcS12Na31rjV6zwvcD4KPHA+MDA0MDEwMTkgICBsZWEgICAgICAgICBlZGksW2VicC00MGhdIC8v17DI69PQ0Ke12Na3o6zTw8C0tcO1vb7Wsr+x5MG/us26r8r9ss7K/bXE1rjV66Gj1eLA71tlYnAtNDBoXb7Nyse7+bXY1rfU2c/yz8LGq9LGNDBoo6y+zcrHx7DD5su1tcTOqrG+tdix5MG/wfSz9rXEv9W85LXExvDKvLXY1reju72r1eK49iYjMjA1NDA717DU2MjrZWRpvMS05sb3o6y007b4tcO1vb7Wsr+x5MG/tcS12Na3PC9wPgo8cD4wMDQwMTAxQyAgIG1vdiAgICAgICAgIGVjeCwxMGggLy/U2mVjeLzEtObG97TmtKIxMGg8L3A+CjxwPjAwNDAxMDIxICAgbW92ICAgICAgICAgZWF4LDBDQ0NDQ0NDQ2g8L3A+CjxwPjAwNDAxMDI2ICAgcmVwIHN0b3MgICAgZHdvcmQgcHRyIFtlZGldIC8vs/XKvLuvvtayv7Hkwb+/1bzkLGRzOltlZGldPC9wPgo8cD4zOiAgICAgICAgcmV0dXJuIDA7PC9wPgo8cD4wMDQwMTAyOCAgIHhvciAgICAgICAgIGVheCxlYXg8L3A+CjxwPjQ6ICAgIH08L3A+CjxwPjAwNDAxMDJBICAgcG9wICAgICAgICAgZWRpIC8vu9a4tMv509C8xLTmxve1xCYjMjA1NDA7PC9wPgo8cD4wMDQwMTAyQiAgIHBvcCAgICAgICAgIGVzaTwvcD4KPHA+MDA0MDEwMkMgICBwb3AgICAgICAgICBlYng8L3A+CjxwPjAwNDAxMDJEICAgbW92ICAgICAgICAgZXNwLGVicCAvL7vWuLS20dW7PC9wPgo8cD4wMDQwMTAyRiAgIHBvcCAgICAgICAgIGVicDwvcD4KPHA+MDA0MDEwMzAgICByZXQgLy+3tbvYtb3UtEVJULXY1rc8L3A+CjxwPiA8L3A+CjxwPlZjsum/tLX308PVu6Osv8nS1L+0tb3U2m1haW66r8r91q7HsKOsz7XNs7u5xvS2r8HLbWFpbkNSVFN0YXJ0dXC6r8r9o6zV4rj2uq/K/crHv9jWxsyou7e+s8/CtuDX1r3aseDC67XExvS2r7qvyv2ho9Taa2VybmVsMzIuZGxs1tC12Na3N2M4MTZmZDe0prX308PBy21haW5DUlRTdGFydHVwuq/K/aGjPC9wPgo8cD5tYWluKCkgbGluZSAyPC9wPgo8cD5tYWluQ1JUU3RhcnR1cCgpIGxpbmUgMjA2ICYjNDM7IDI1IGJ5dGVzPC9wPgo8cD5LRVJORUwzMiEgN2M4MTZmZDcoKTwvcD4KPGgxPgo8cD4weDA0IG9sbHlkYme3tLvjseC31s72PC9wPgo8L2gxPgo8cD48YnI+CjwvcD4KPHA+T2TU2Mjro6zI5828y/nKvqGjPC9wPgo8aW1nIHNyYz0="/uploadfile/Collfiles/20140720/20140720085845402.png" alt="\">


堆棧窗口如圖所示。

\


通過堆棧,可以看到kelnel32調用了入口函數(mainCRTStartup),對於od來說,main函數並不是Entry point,而是mainCRTStartup函數。

一直單步,單步到00401146處,od分析為調用GetVersion函數,獲取當前運行平台的版本號,因為是控制台程序,所以獲取版本號為ms-dos的版本信息。

繼續單步,單步到0040119E處,單步進入,可以看到有HeapCreate申請堆空間函數,大小由傳遞的參數決定,並且該call裡有HeapDestroy銷毀堆函數。因此0040119E為初始化堆空間,如圖所示。

\


在004011C0處,od分析為GetCommandLineA函數,獲取命令行參數信息的首地址。

進入下面的那個call後,可以看到GetEnvironmentStringsW和GetEnvironmentStrings函數,獲取環境變量的首地址,如圖所示。以Unicode編碼形式返回到寄存器和堆棧中,最後采用WideCharToMultiByte函數將Unicode字符串到一個多字節字符串,

M8觍?ff鷌?9Z喎?http://book.2cto.com閱讀《c++反匯編與逆向分析技術揭秘》,在閱讀到第三章認識啟動函數,找到用戶入口時,得知main函數之前系統要做一些准備工作,再加上上學期學的C語言程序入口函數不是main函數,而是_start函數,這不禁引發了一些思考,到底編譯器在編譯和系統執行程序的時候發生了什麼,因此想以實例進行一定的分析。在思考的過程中,有些涉及到了編譯器的知識,包括它如何工作的,匯編之後又是如何鏈接的,這一部分內容不太熟悉,這一方面得掌握編譯原理的知識,還得學習編譯器的相關內容。那些東西還沒學,因此不免有一些缺憾。了解反匯編的一些內容,可以更深層次的理解相對底層的一些東西,包括棧,堆和寄存器的數據交換。另外並未使用到神器IDA,利用IDA會更好地靜態分析一些函數。


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved