2011-04-01 180 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和微软提供的其他几个免费调试器都可以做到。您只需要将该事件的默认值从忽略更改为启用。

相关问题