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的主要内容,如果未能解决你的问题,请参考以下文章