2011-06-16 101 views
2

在調試Windows進程時,儘可能早地中斷有時會很方便。我可以在ntdll.dll!_LdrpInitializeProcess中設置斷點嗎?

Inital調用棧看起來是這樣的:(當你在一個DllMain功能上DLL_PROCESS_ATTACH設置一個斷點,你得到這個EG)

... 
    [email protected]() + 0x14 bytes 
    [email protected]() + 0x205 bytes 
> [email protected]() - 0x96d bytes  
    [email protected]() + 0x6269 bytes 
    [email protected]() + 0x7 bytes  

所以設置一個斷點在這些NTDLL例程應該真正打破的過程中非常早。

但是,我不知道如何在啓動調試器中的過程之前設置斷點。在Visual Studio(2005)中可能嗎?怎麼樣?它可以在WinDbg中完成嗎?

回答

1

我已經發現如何在Visual Studio中完成它。

這裏的問題是,在任何彙編函數中設置斷點將被記住爲「數據斷點」。這些斷點在進程停止時會被禁用,所以即使我在這個函數中設置了一個斷點(我可以這樣做,因爲如果我在任何DllMain函數中設置斷點,我在堆棧上有函數),這個斷點將被禁用新的流程運行。

但是對於ntdll.dll(和kernel32.dll),加載地址幾乎是固定的,不會改變(至少在重新啓動之前)。

因此,在啓動進程之前,我只需重新啓用與此NtDll函數對應的地址的數據斷點,然後調試器就會在那裏停止。

+0

當你重新啓動時,它們甚至不會改變。他們爲什麼?當您安裝修改DLL的系統更新時,它們可能會發生更改,但每次都會在這些DLL的首選基址中加載這些DLL。 – 2011-06-17 20:32:52

+0

@David:[ASLR]怎麼樣(http://en.wikipedia.org/wiki/Address_space_layout_randomization)? – 2011-06-18 11:57:35

+0

你在你的應用程序中啓用ASLR嗎? – 2011-06-18 12:12:36

5

我會使用類似GFlags的東西在啓動過程時啓動調試器。

下面是一個簡單GFLAGS設置test.exe的

enter image description here

這裏是調試器輸出。注意調用堆棧與ntdll!LdrpInitializeProcess

的CommandLine: 「C:\ TEMP \ TEST.EXE」 符號搜索路徑是: SRV *; SRV C:\符號http://msdl.microsoft.com/download/symbols 可執行搜索路徑是:ModLoad : 00d28000
image00000000 00d20000 (1b40.464): Break instruction exception - code 80000003 (first chance) ntdll!LdrpDoDebuggerBreak+0x30: 00000000 77c7cb60立方厘米INT 3 0:000>ķ小孩子SP RetAddr
調用位置00000000 0012ed70 00000000 77c32ef5 NTDLL LdrpDoDebuggerBreak +的0x30 000000! 00 0012edb0 00000000 77c11a17 ntdll!LdrpInitializeProcess + 0x1b4f 77bfc32e ntdll! ?? :: FNODOBFM :: string'+0x29220 00000000 0012f310 00000000`00000000 NTDLL!LdrInitializeThunk + 0xe

或者你可以像WinDBG的調試器這將默認闖入ntdll!LdrpInitializeProcess中打開過程。

HTH

相關問題