如何在加载任何链接的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
函数之前和初始化任何静态对象之前。
答案 0 :(得分:7)
您可以通过使用您的exe名称向“图像文件执行选项”添加注册表项来执行此操作。添加名为“Debugger”的字符串类型的值,并将其设置为vsjitdebugger.exe以启动实时调试器对话框。然后,您可以选择一个可用的调试器,包括Visual Studio。在任何代码开始运行之前,Windows加载EXE后立即触发此对话框。
这是一个示例.reg文件,当您启动notepad.exe时会触发该对话框。将密钥名称修改为.exe:
REGEDIT4
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\notepad.exe]
"Debugger"="vsjitdebugger.exe"
答案 1 :(得分:2)
使用Gflags和WinDbg,您可以自动附加到目标应用程序,并在加载任何DLL之前设置断点。
为此,您需要安装“Windows调试工具”。您可以从Microsoft免费获得。它包括GFlags和WinDbg。您可以在以下位置找到它: http://msdn.microsoft.com/en-us/windows/hardware/gg463009.aspx
使用GFlags在目标程序上设置自动调试选项。这是设置系统以启动调试器的最简单方法,该调试器将在目标应用程序启动时自动启动。无需愚弄注册表,它将为您做出所有必要的更改。
使用GFlags将WinDbg设置为作为调试器启动。将事件“创建过程”中的WinDbg的事件过滤器从“忽略”更改为“已启用”。默认情况下,WinDbg不会中断目标的进程创建。但是,如果您需要或希望它在创建过程中设置断点,则可以通过更改此事件选项。更改此选项的最简单方法是让WinDbg启动您的应用程序,使用其GUI通过“DEBUG | Event Filters ...”菜单项及其对话框更改选项,保存工作区并停止重新打印。然后开始导致目标应用程序启动的任何内容,从那个时间开始,对于该特定的调试目标,WinDbg将在“创建进程”中断开。
还有其他方法可以在WindDbg中自动设置此选项,但它们并不像使用GUI那么简单。您可以为其调用设置命令行选项以启用Create Process事件。您可以让WinDbg运行一个脚本文件,为您设置选项。您可以设置WinDbg的TOOLS环境变量以将其指向其“Tools.ini”文件,并在那里启用create process事件。还有一些方法可以设置事件选项以在Create Process上启用断点。
上面的链接包含有关GFlags和WinDbg的调试帮助的链接。
对于大多数调试需求,开发人员在创建进程时不需要或想要一个断点(在加载运行所需的所有正常基本dll之前)。但是如果你这样做,WinDbg和微软提供的其他几个免费调试器都可以做到。您只需将该事件的默认值从忽略更改为启用。
答案 2 :(得分:1)
不是从F5开始,只需使用F11或F10开始调试。
答案 3 :(得分:0)
ntdll.dll在进程创建期间由内核加载。我不知道具体的其他dll,但它们很可能也被内核加载。
据我所知,除非您编写一个rootkit来覆盖部分流程创建代码,否则您无法完成的工作。即便如此,我还不确定在加载这些库之前,创建的进程是否真的被认为是一个进程。
答案 4 :(得分:0)
我认为您无法使用Visual Studio中的常规用户模式调试器执行此操作。 Microsoft提供了其他调试工具的免费工具包,包括kd(内核调试器)和windbg,它们可能能够中断加载,但我怀疑你在加载ntdll之前是否能够检查进程。那时它并不是一个真正的过程。
你想要完成什么?
答案 5 :(得分:0)
无法执行此操作,因为您的PE可执行文件所依赖的DLL在创建进程之前由系统(而不是您的进程)加载。仅当您的可执行文件与从其他DLL导入的所有函数链接时,该过程才会启动。
添加:强> 但是,当然只有在启动进程时才会为每个DLL运行DllMain例程,您可以调试它们。
答案 6 :(得分:0)
一种很早就中断的方法是在LdrInitializeThunk
上手动添加功能断点。这不会在ntdll之前中断,但应该在任何静态初始化或用户代码之前