【发布时间】:2018-03-01 23:03:08
【问题描述】:
我已经提取了一个使用 ETW 在 Windows 中调用的系统调用地址的转储文件。我对地址有些困惑。我只是将 NtOpenFile 用于以后的示例。
1-
我使用 cvdump 转储从 Microsoft 符号服务器 (ntkrnlmp.pdb) 收到的内核 PDB 文件。 NtOpenfile 的入口是这样的:
S_PUB32: [000D:000DF320], Flags: 00000002, NtOpenFile
然后我使用 Dependency Walker (DP) 打开 ntoskrnl.exe。我向下滚动并查看 NtOpenFile 的条目:
然后我使用这段代码收到内核基地址:
hNtdll = GetModuleHandle("ntdll.dll");
NtQuerySystemInformation = (NtQuerySystemInformationFunc)GetProcAddress(hNtdll, "NtQuerySystemInformation");
NtQuerySystemInformation(SystemModuleInformation, &ModuleInfo, sizeof(ModuleInfo), NULL);
KernelBase = (ULONG64)ModuleInfo.Modules[0].ImageBase;
内核基地址为:fffff802f7616000
使用windbg提取的NtOpenFile的实际地址是fffff802f7b0e320 nt!NtOpenFile
使用从 pdb 文件中提取的地址添加内核基址会给我错误的地址(使用 DP 结果中的地址添加是正确的)。为什么?
2-
为什么DP打开的.sys文件中没有像NtGdiFlush这样的win32k.sys中的函数?在 Windows 10 中,还有另一个名为 win32kfull.sys 的文件包含这些符号,但在 Windows 7 中没有。
3-
我根本无法映射像 NtQueryVirtualMemory 这样的函数。它存在于 ntkrnlmp.pdb 转储中,但正如我在第 1 部分中所说,地址似乎错误!并且它也存在于 DP 打开的 ntoskrnl.exe 中作为 ZwQueryVirtualMemory。但它与windbg.exe提取的NtQueryVirtualMemory地址不同 这些如何相互映射?如何使用 DP 或 PDB 文件提取此函数的地址?
4-
如何使用 windbg 找到 win32k.sys 系统调用地址(如 NtGdiFlush 的地址)?
命令kd> x /D nt!Nt* 没有给我这些符号地址。
【问题讨论】:
-
000D:000DF320位于逻辑段:偏移地址中,其中 0x000D 是 PE 段号。在标题中,我看到 D 部分的偏移量为 0x419000,而 0x419000 + 0xDF320 为 0x4F8320。 -
谢谢!但是您能告诉我您是如何从标头中获取地址 0x419000 的吗?你指的是哪个标题?我在哪里可以找到它们?
-
尝试 .symfix+ 然后 .reload 看看是否会拉下匹配的操作系统符号。
-
x 是一个命令,后跟空格,后跟模块名,或者星号表示通配符,后跟感叹号,通常称为 bang,后跟符号名或部分名称的正则表达式,然后按 x !*abc 是语法
-
论坛正在吃掉 cmets 中的星号,它是 x asterisk bang asterisk regex
标签: windows windbg system-calls windows-kernel dependency-walker