c - 链接到 ntdll.lib 并调用 ntdll.dll 中的函数

标签 c visual-studio dll window

我最近在研究私有(private) API。我尝试在运行时使用 LoadLibraryGetProcAddress 调用 ntdll.dll 中的 NtOpenFile 等函数。幸运的是,它成功了。今天早上我在我的计算机上执行了文件搜索,并在我的 C 盘中找到了 ntdll.lib。据我所知,这样的 .lib 文件应该包含可用于链接的 dll 导出 stub 。因此,我尝试将我的应用程序链接到该库,但我不断收到 unresolved external symbol 错误。但是,dumpbin/EXPORTS 显示 ntdll.lib 显然导出了 NtOpenFile。我该如何解决这个错误?

最佳答案

不再是这种情况,你可以找到 ntdll.lib 导入库和 NT header ,因为我在 2019 年写了这篇文章。

GetProcAddress() 方法需要很多额外的代码。当然,直接导入更简洁,并且是我们用于 C/C++ 桌面应用程序的模式。

我过去常常通过使用 .def 文件等创建一个简单的 Windows DLL 项目来制作我自己的“ntdll.lib”导入库。一次添加每个 ntdll API 函数,因为我需要它们作为 stub 和用于头文件。 丢弃 .dll,仅使用其中的 .lib。

但至少从 MSVC 2017 开始,它包括用户模式(用于桌面应用程序)ntdll.lib 库,用于 32 位和 64 位版本的 x86 和 ARM。这可能需要安装 Windows 10 WDK。 只需在“C:\Program Files (x86)”中搜索“ntdll.lib”,您就会找到它们。

然后在标题前面,很多 ntdll 原型(prototype)和定义都在“winternl.h”中,但不幸的是很多部分都丢失了和/或只有结构的简化版本等。 要解决这个问题,您可以使用“Process Hacker”项目中出色的 NT header 集: https://github.com/processhacker/processhacker header 在“phnt”中。

您将使用:

而不是典型的“windows.h”和“winternl.h”组合
#include <phnt_windows.h>
#include <phnt.h>

然后将特定的 Windows 10 作为目标(默认为 Windows 7),您将遵循:

#undef PHNT_VERSION
#define PHNT_VERSION PHNT_THRESHOLD 

请注意“phnt_windows.h”已经为您包含了“windows.h”。 因此,您应该能够在任何其他 Windows、stdlib、STL 等之后跟随它;与典型的桌面构建环境没有太大区别。

或其他一些使用:
https://github.com/Fyyre/ntdll
还包括库:
https://github.com/x64dbg/ScyllaHide/tree/master/3rdparty/ntdll
还有一个也有 ntdll 库:
https://github.com/odzhan/injection/tree/master/ntlib

关于c - 链接到 ntdll.lib 并调用 ntdll.dll 中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35509388/

相关文章:

copy_from_user 和分割

c - 为什么现在在 mingw 和 2017 中 printf ("%c"、 '\0' ) 存在差异?

c++ - 如何处理 Visual Studio 中的第 3 方 C++ 库 LNK4099 警告

visual-studio - 防止 Visual Studio 从引用的项目中删除输出文件

c# - 如何获取项目引用的版本?

ASP.NET MVC 入口点

c - 如何创建结构数组的数组

c - 为什么我不能递增数组?

c - 为什么 C 头文件 stdio.h 中的 fopen 原型(prototype)中有 (const char * ) 参数

c++ - 在 VC++ Express 中包含和访问二进制数据的最干净的方法是什么?