2011-04-01 181 views
9

如何在加載任何鏈接的DLL之前停止程序?如何在程序執行開始時設置斷點

我試圖設置LoadLibraryExW功能在Break At Function調試選項,它會停止運行的功能,但在此之前,我已經在Visual Studio中的輸出窗口如下:

 
'test.exe': Loaded 'C:\Windows\System32\ntdll.dll', Symbols loaded (source information stripped). 
'test.exe': Loaded 'C:\Windows\System32\kernel32.dll', Symbols loaded (source information stripped). 
'test.exe': Loaded 'C:\Windows\System32\KernelBase.dll', Symbols loaded (source information stripped). 
'test.exe': Loaded 'C:\Windows\System32\uxtheme.dll', Symbols loaded (source information stripped). 
'test.exe': Loaded 'C:\Windows\System32\msvcrt.dll', Symbols loaded (source information stripped). 
---- plus about 30 DLLs --- 

所以,我怎麼能停止在加載ntdll.dll之前在調試器中編程?好吧,不要在加載之前,而是在執行任何DllMain函數之前以及初始化任何靜態對象之前。

回答

7

您可以通過添加註冊表項,以「圖像文件執行選項」與您的exe文件的名稱做到這一點。添加一個名爲「Debugger」的字符串值,並將其設置爲vsjitdebugger.exe以啓動即時調試器對話框。然後可以選擇其中一個可用的調試器,包括Visual Studio。在任何代碼開始運行之前,Windows已經加載EXE後立即觸發此對話框。

這裏的是,當你開始的notepad.exe觸發對話樣本.reg文件。修改鍵名到您的.exe:

REGEDIT4 

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe] 
"Debugger"="vsjitdebugger.exe" 
+0

我已經試過這個,並且Process Explorer顯示我已經在這個過程中分配了大約30個GDI對象。但在這一刻,這是我能得到的最好的。 – 2011-04-08 08:04:01

+0

您可以使用Windows Debugger Kit中的GFlags工具自動爲您自動編輯註冊表。可以在http://msdn.microsoft.com/en-us/windows/hardware/gg463009.aspx 的Windows調試工具中找到它。它還包含許多其他有用的調試工具,包括WinDbg,免費從Microsoft獲得。 – StarPilot 2012-11-28 21:33:54

1

而不是從F5開始,只需開始用F11或F10進行調試即可。

+2

在這種情況下,在加載所有DLL並初始化所有靜態對象之後,它停止在'main'函數處。 – 2011-04-01 12:56:52

+0

這是......意外的簡單,謝謝:D – porges 2016-12-07 01:18:13

0

ntdll.dll在進程創建期間由內核加載。我不知道其他的dll,但它們很可能也是由內核加載的。

據我所知,你想要做什麼不能做,除非你寫了一個rootkit覆蓋進程創建代碼的一部分。即使如此,我不確定在加載這些庫之前,創建的進程是否真的被認爲是一個進程。

0

我不認爲你可以在Visual Studio中的普通用戶模式調試器做到這一點。微軟提供了一個免費的其他調試工具包,其中包括kd(內核調試器)和windbg,可能會中斷加載,但我懷疑你會在加載ntdll之前檢​​查過程。在這一點上,這不是一個真正的過程。

你想完成什麼?

0

沒有辦法,因爲你的PE可執行取決於DLL被系統加載的(不是你的程序)之前,甚至創造過程中做到這一點。該過程僅在您的可執行文件與從其他DLL導入的所有功能鏈接時纔會啓動。

ADD: 但是當然DllMain例程只在進程啓動時運行,並且你可以調試它們。

1

使用GFlags和WinDbg中,你可以自動連接到您的目標應用程序,和之前的任何DLL加載設置一個斷點。

要做到這一點,你需要安裝「用於Windows調試工具」。你可以從微軟免費獲得。它包括GFlags和WinDbg。你可以在: http://msdn.microsoft.com/en-us/windows/hardware/gg463009.aspx

使用GFlags設置你的目標程序的自動調試選項。這是將系統設置爲啓動調試程序的最簡單方法,該調試程序將在目標應用程序啓動時自動啓動。無需與註冊表混淆,它會爲您做出所有必要的更改。

使用GFlags設置WinDbg作爲調試器啓動。將事件「創建過程」從「忽略」更改爲WinDbg的事件過濾器爲「已啓用」。默認情況下,WinDbg在創建目標進程時不會中斷。但是,如果您需要或希望它在創建過程中設置斷點,則可以通過更改此事件選項。更改此選項的最簡單方法是讓WinDbg在您的應用程序中啓動,使用它的GUI通過「DEBUG | Event Filters ...」菜單項及其對話框更改選項,保存您的工作區並停止debbuging。然後開始任何導致您的目標應用程序開始,並從那個時候爲特定的調試目標,WinDbg將打破「創建過程」。

還有其他方法可以在WindDbg中自動設置此選項,但它們不像使用其GUI那麼容易。您可以設置其調用的命令行選項以啓用「創建進程」事件。你可以讓WinDbg運行一個腳本文件來爲你設置選項。您可以將WinDbg的TOOLS環境變量設置爲指向其「Tools.ini」文件,並在其中啓用創建過程事件。還有更多的方法來設置事件選項以在創建過程中啓用一個斷點。

上面的鏈接包含調試幫助GFlags和WinDbg的鏈接。

對於大多數調試需求,開發人員不需要或不需要創建進程的中斷點(在加載所有正常運行所需的基本dll之前)。但是如果你這樣做,WinDbg和微軟提供的其他幾個免費調試器都可以做到。您只需要將該事件的默認值從忽略更改爲啓用。

相關問題