使用 GDB 调试注入到程序中的 DLL
Debugging a DLL injected into a program using GDB
我有 2 个程序和一个 DLL。
loader.exe
启动 main.exe
并在 main.exe
的内存 space 中注入 lib.dll
。 main.exe
在某一时刻执行 lib.dll
的函数。加载程序和DLL都已编译并启用了调试符号。
我已经尝试 运行在 DLL 上使用 GDB 并在相关函数上设置断点,但我怀疑你是这样做的,因为当我 运行 加载程序时没有任何反应。我无法调试 loader.exe
,因为它所做的只是启动主程序、注入 DLL,然后退出。那我该怎么办?
请记住,我正在 Windows 使用 MinGW32 完成所有这些工作。
我通过更改启动程序的工作方式解决了这个问题:它以挂起状态启动目标程序并注入 DLL,然后恢复启动程序。
为了调试目标程序中注入的DLL函数,我首先使用GDB调试启动程序,并在目标程序启动并注入DLL之后,但在恢复目标程序之前放置断点。
然后,我打开了另一个 GDB 实例,运行 它没有针对任何目标,而是使用 attach
将 GDB 附加到已经启动但仍暂停的目标程序实例。
由于 DLL 现在已加载到地址 space,因此我可以对目标程序中的任何 DLL 函数进行断点。通过继续调试启动程序的原始 GDB 实例,它随后解除了目标程序的挂起,使其正常 运行。
我有 2 个程序和一个 DLL。
loader.exe
启动 main.exe
并在 main.exe
的内存 space 中注入 lib.dll
。 main.exe
在某一时刻执行 lib.dll
的函数。加载程序和DLL都已编译并启用了调试符号。
我已经尝试 运行在 DLL 上使用 GDB 并在相关函数上设置断点,但我怀疑你是这样做的,因为当我 运行 加载程序时没有任何反应。我无法调试 loader.exe
,因为它所做的只是启动主程序、注入 DLL,然后退出。那我该怎么办?
请记住,我正在 Windows 使用 MinGW32 完成所有这些工作。
我通过更改启动程序的工作方式解决了这个问题:它以挂起状态启动目标程序并注入 DLL,然后恢复启动程序。
为了调试目标程序中注入的DLL函数,我首先使用GDB调试启动程序,并在目标程序启动并注入DLL之后,但在恢复目标程序之前放置断点。
然后,我打开了另一个 GDB 实例,运行 它没有针对任何目标,而是使用 attach
将 GDB 附加到已经启动但仍暂停的目标程序实例。
由于 DLL 现在已加载到地址 space,因此我可以对目标程序中的任何 DLL 函数进行断点。通过继续调试启动程序的原始 GDB 实例,它随后解除了目标程序的挂起,使其正常 运行。