在WINDOWS中是无法直接执行DLL文件的. 想要调试DLL文件,就只能通过EXE去加载DLL文件.
这样正常情况下,我们只要在 LOAD_DLL_DEBUG_EVENT 事件到达的时候,给DLL的OEP处添加一个断点即可.
之前我嫌调试器加载速度慢, 我专门做了一些处理, 其中我将 LOAD_DLL_DEBUG_EVENT 事件做了个延时加载处理.
当时测试的时候, 发现加载模块非常浪费时间, 因为我在模块中获取了模块的 MD5 等信息, 所以很"浪费时间".
因此, 为了解决这个问题, 我才特意加的延时处理.(可以参考之前的文章: F3或者Ctrl+F2加载目标程序非常慢)
谁知道正好调试DLL的时候, 和延时加载冲突了.
目前的临时解决方案, 就是 LOAD_DLL_DEBUG_EVENT 事件到达的时候, 先判断调试的是否是DLL模块.
如果不是DLL模块, 则正常走延时加载函数. 如果是DLL模块. 则先判断当前加载的是否是被调试的目标模块.
(因为往往先到达的总是系统模块, 如 kernel32.dll ntdll.dll等.所以要加判断. 目前是通过完整的绝对路径来判断是否是目标模块.)
判断是目标模块后, 直接先获取OEP, 然后给OEP添加个INT3断点. 这样就能正常调试DLL文件了.
|