我如何在不链接它或任何其他 DLL 的情况下从 NTDLL 加载函数?

How could I go about loading functions from NTDLL without linking against it or any other DLLs?

我一直在尝试仅使用 NTDLL 导出的加载程序函数从 Windows 系统 DLL 加载函数。这按预期工作。为了好奇心和更好地理解基于 NT 的系统中的进程结构,我开始尝试通过执行以下步骤从 NTDLL 加载函数:

  1. 从gs加载进程的PEB:[60h]
  2. 根据加载器遍历加载到进程中的模块,找到NTDLL的基地址
  3. 解析NTDLL的PE头文件
  4. 尝试解析导出 table 以查找 LdrLoadDllLdrGetDllHandleLdrGetProcedureAddress

这在第 4 步失败。在调试器(VS2019 和 WinDbg 预览版)中单步执行后,我尝试的偏移似乎产生了一个无效结构,当我的代码比较时会导致访问冲突将当前函数名称更改为我正在搜索的函数名称之一。我的代码正在 运行 Windows 10 Pro build 21364 的 64 位副本上进行编译。请注意,我使用的是 my own header that contains definitions for the structures used for this (these definitions are from winnt.h and here) because the Windows headers don't really play nice with the rest of my code. The function trying to do this is here. For the record, this is part of an attempt to implement my own libc (again, for the sake of curiosity). The code that calls the functions is here。非常感谢任何对此的帮助。

没关系,事实证明我对我使用的结构有过时的冗长定义。我在 https://vergiliusproject.com.

找到了更好的(更新的)定义