x64dbg 如何调试从应用程序调用的 DLL

逆向工程 调试
2021-06-11 05:41:14

我有一个 64 位应用程序,当运行时会加载一个 dll(插件)我只想调试这个插件,我尝试将 x64dbg 设置为在 dll 加载时中断,但是有两个问题,这个应用程序加载了数百个其他 dll,当我确实进入我的 dll 并尝试逐步完成我似乎陷入了 ntdll.dll 而不是我感兴趣的那个。

有没有更好的方法来做到这一点?或任何其他更适合这项工作的调试器?我也有 IDA pro,但我更熟悉 olly/x64 程序。

3个回答

我将添加我的发现作为答案,因为事实证明它在新调试器中实际上非常简单(我不相信 ollyDBG 具有此功能)。

X32DBG 和 X64DBG 可用于同一进程

1)在调试器中打开可执行文件(exe)(根据exe是32位还是64位选择合适的调试器)

2)选择“断点”选项卡

3)找到标题为“dll断点”的部分

4) 在此部分右键单击,在 dll 文件的名称中选择“添加”类型。例如“module.dll”

5) 现在运行你的进程,当这个 dll 被加载时调试器会中断

有几个简单的步骤可以做到:

  • 如果你有源代码,你可以在代码的开头创建一个非常基本的无限循环,一旦这个 dll 加载,点击中断最终会让你进入那个循环。此时,您可以手动退出并继续调试。
  • 如果您没有源代码,您可以使用0xccfor 断点或0xEB 0xFE( jmp 0x0) for 无限循环在入口点修补 dll 在断点操作码的情况下,您将在执行时触发调试器。在第二种情况下,您可以执行我之前描述的操作。
    • 对于修补,您可以使用任何十六进制编辑器。CFF Explorer非常方便,它可以指向入口点,并且使用内部十六进制编辑器可以添加补丁。不要忘记在调试器中断后将原始字节写在一边以恢复。

调试 dll 比调试独立的可执行文件要困难一些。因为在找到参数之前,导出的任何函数都不会调用它们,然后返回调用约定的 tbe 参数类型都变得比引用函数更难。

一些独立调试它们的方法是编写一个带有加载库调用的包装 exe,然后结合静态分析从那里开始。

如果你有windbg,你也可以以独立的方式加载一个dll。和。windbg -z foo.dll。这会将 dll 作为转储文件加载,并将在 AddressOfEntryPoint 中停止。

如果是 32,我可以说将 ollydbg 与 loaddll 一起使用并调用导出函数,但是由于您说的是 64 位,我不知道 x64dbg 是否具有类似的功能