windbg:进入进程的 dll

Posted

技术标签:

【中文标题】windbg:进入进程的 dll【英文标题】:windbg: stepping into dll of a process 【发布时间】:2021-08-28 17:54:39 【问题描述】:

这里是新手问题。我已经搜索了几天的解决方案,但没有得到任何地方。使用 windbg 预览。

有一个加载 dll 的进程,我想查看从 dll 内部调用的地址的反汇编。没有可用的符号,因为它是第三方。我可以找到入口点并打破它,但之后我无法进入 dll。我知道我需要将dll加载到windbg中,但是当我启动exe时我不能把它放在参数中,因为我只知道加载模块后的入口点。 如果我在我的 dll 上使用 .load 并在入口处设置断点,它也不起作用。 任何人以前都这样做过并且可以告诉我我需要做什么才能进入 dll 的程序集?

编辑: 在 windbg 中,我启动了可执行文件 (.exe),并希望查看 .dll 内的地址和操作,这些地址和操作在程序的特定操作期间被调用。

【问题讨论】:

既然你在你的 exe bp 下一条指令中标记了这个 windbg 使用 wt 命令 bp 函数,如果普通 wt 花费的时间太长,wt 也会检查包含和排除 这是第三方 dll,所以我没有 exe 或 dll 文件的任何符号。尝试了 wt 但它没有显示任何调用的偏移量。只有 dll 的名称而不是函数位置 【参考方案1】:

简单的事情优先:.load 用于将 WinDbg 插件加载到 WinDbg 进程中。这不是你想要的。

我假设您希望进行逆向工程而不是调试。 WinDbg 不适合此任务。当然还有更好的工具,比如 IDA。

分析而不执行

但无论如何,让我们开始吧。我将为这个例子选择一个任意的 DLL。它是 AMD 显示驱动程序提供的一个 DLL,C:\AMD\PSP Driver\WTx64\amdtee_api32.dll,我对此一无所知。

    打开 WinDbg 预览 转到“打开转储文件”(这不是很直观,但它会起作用) 在文件打开对话框中,输入*,将显示 DLL(默认情况下仅限于 DMP 文件) 选择要加载的 DLL

此时,它会说

Microsoft (R) Windows Debugger Version 10.0.21349.1004 AMD64
Copyright (c) Microsoft Corporation. All rights reserved.
Loading Dump File [C:\AMD\PSP Driver\WTx64\amdtee_api32.dll]

您现在可以使用与实时调试会话期间相同的命令对 DLL 进行操作。

0:000> lm
start    end        module name
10000000 10055000   amdtee_api32   (export symbols)       amdtee_api32.dll

所以我没有可用的 PDB 文件,只是导出符号,因为有:

0:000> x *!*
7ffe0300          SharedUserData!SystemCallStub = <no type information>
10001050          amdtee_api32!TEEC_InitializeContext (<no parameter info>)
[...]

我们可以反汇编一个函数:

0:000> uf amdtee_api32!TEEC_InitializeContext
amdtee_api32!TEEC_InitializeContext:
10001050 55              push    ebp
10001051 8bec            mov     ebp,esp
10001053 83ec08          sub     esp,8
10001056 c745f801000000  mov     dword ptr [ebp-8],1
1000105d 837d0c00        cmp     dword ptr [ebp+0Ch],0
10001061 750a            jne     amdtee_api32!TEEC_InitializeContext+0x1d (1000106d)  Branch
[...]

您甚至可以访问加载 DLL 的内存

0:000> db amdtee_api32
10000000  4d 5a 90 00 03 00 00 00-04 00 00 00 ff ff 00 00  MZ..............
10000010  b8 00 00 00 00 00 00 00-40 00 00 00 00 00 00 00  ........@.......
10000020  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
10000030  00 00 00 00 00 00 00 00-00 00 00 00 10 01 00 00  ................
10000040  0e 1f ba 0e 00 b4 09 cd-21 b8 01 4c cd 21 54 68  ........!..L.!Th
10000050  69 73 20 70 72 6f 67 72-61 6d 20 63 61 6e 6e 6f  is program canno
10000060  74 20 62 65 20 72 75 6e-20 69 6e 20 44 4f 53 20  t be run in DOS 
10000070  6d 6f 64 65 2e 0d 0d 0a-24 00 00 00 00 00 00 00  mode....$.......

【讨论】:

谢谢!我已经尝试在 ghidra 中找到相关功能,但 dll 相对较大。所以想看看在相关的程序操作过程中,进程调用了dll中的哪些地址。当我在实时调试中遇到入口断点时,有没有办法进入 dll? @d8613r:那么,您已经有了一个加载 DLL 并运行它的 EXE? 是的,没错。 exe 在我启动程序时加载 dll,但它用于程序中的许多操作。我只是在 dll 中寻找一些在 exe 的特定操作中使用的函数。当这些到达 dll 的入口时我可以中断,但是我不知道如何使 dll 的这些特定地址可见

以上是关于windbg:进入进程的 dll的主要内容,如果未能解决你的问题,请参考以下文章

windbg 边学边记

如何用windbg调试因需加载的DLL

如何在进程创建的过程中Attach上WinDBG

如何在 C# 程序中注入恶意 DLL ?

windbg 命令

如何使用WinDbg调试进程信息