windbg 之 如何定位進程入口點地址

載入HelloWorld.exe以後咱們看看加載了哪些模塊:html

查看一下堆棧:sass

都是ntdll中的函數,咱們想要運行到HelloWorld.exe的main函數中停下。cookie

這麼辦:函數

使用!dh命令。orm

幫助文檔中給出!dh的解釋以下:htm

The !dh extension displays the headers for the specified image.blog

Parameters

Options

Any one of the following options:內存

-f

Displays file headers.ci

-s

Displays section headers.文檔

-a

Displays all header information.

Address

Specifies the hexadecimal address of the image.

執行命令:

能夠看到入口點地址爲112C6,這個是RVA,即相對虛擬地址。什麼是相對虛擬地址呢?咱們往下看。

咱們使用lm命令查看到start下的地址,就是HelloWorld.exe模塊加載到內存以後的一個虛擬地址的起始位置,之因此稱之爲虛擬地址,就是由於它是在4G內存(32位)中的一個相對位置。

這裏是0x1180000:

而相對虛擬地址就是相對於1180000的位置再偏移112C6,即112C6+1180000 = 11912C6,獲得的就是入口點的虛擬地址。再不明白就以下圖所示:

 

這時咱們獲得入口點的地址爲11912C6,下斷點:

運行,命中0號斷點:

此時Disassembly窗口顯示以下:

再單步運行一步就跳到了main:

對應的Disassembly窗口顯示以下:

順便提一下:

push ebp

mov ebp,esp

是典型的進入一個函數的頭兩個指令。他們的做用是將上一個函數的基址先進棧,然後將當前esp所指位置設爲當前函數的基址。

這裏的」___security_init_cookie「是設置一個security cookie,防止堆棧溢出,之後能夠跟進這個call,查看具體實現的細節,相關內容能夠參考:

http://blog.sina.com.cn/s/blog_4e0987310101ie77.html

跟入

__tmainCRTStartu

能夠看到該main函數中具體細節。

相關文章
相關標籤/搜索