我一直在尝试仅使用 NTDLL 导出的加载器函数从 Windows 系统 DLL 加载函数。这按预期工作。为了好奇和更好地理解基于 NT 的系统中的进程结构,我开始尝试通过执行以下步骤从 NTDLL 加载函数:
- 从 gs:[60h] 加载进程的 PEB
- 根据加载器遍历加载到进程中的模块,找到NTDLL的基地址
- 解析 NTDLL 的 PE 头
- 尝试解析导出表以查找
LdrLoadDll
、LdrGetDllHandle
和LdrGetProcedureAddress
这在第 4 步失败。在调试器(VS2019 和 WinDbg 预览版)中单步执行后,似乎我尝试的偏移量产生了一个无效结构,当我的代码将当前函数名称与我正在寻找的其中之一。我的代码正在 Windows 10 Pro build 21364 的 64 位副本上编译和运行。请注意,我使用的是我自己的标头,其中包含用于此的结构的定义(这些定义来自winnt.h
和此处),因为 Windows 标头对我的其余代码不太好。试图做到这一点的功能是here. 作为记录,这是尝试实现我自己的 libc 的一部分(再次,为了好奇)。调用函数的代码在这里。非常感谢您对此的任何帮助。