【问题标题】:Link Error when Compile c program without kernel32.lib编译没有 kernel32.lib 的 c 程序时出现链接错误
【发布时间】:2021-02-12 11:00:17
【问题描述】:

我想创建只使用 ntdll 并对其使用安全检查的应用程序。但是当我删除 kernel32.lib 或取消选中“从父级或项目默认值继承”时,我在构建项目时会出现链接错误。 Link Errors

#include <Windows.h>
#include <processthreadsapi.h>
#include <vcruntime.h>
ULONG WINAPI NtGetCurrentProcessorNumber(void);
void main()
{
    int a = 2;
    int b = 5;
    int sum = a + b;
    int Number = NtGetCurrentProcessorNumber();
    while (1)
    {

    }
}

void NtProcessStartup(PVOID DriverObject, PVOID RegistryPath)
{
    __security_init_cookie();
    //__security_check_cookie();
    main();
}

这是一个本机项目,当我在编译器设置中删除“安全检查”开关并删除“__security_init_cookie”功能时工作正常。这个项目链接到 ntdll.lib

谁能帮帮我?

【问题讨论】:

    标签: windows linker crt kernel32 usermode


    【解决方案1】:

    当您使用安全检查时,__security_xx 函数将链接到您的模块。链接器错误是说gs_support.obj__security_xx 函数所在的位置)需要QueryPerformanceCounter 和 其他列出的功能。 QueryPerformanceCounterresides in kernel32,所以在使用安全检查的时候需要链接。

    【讨论】:

    • 感谢您的回答。但是某些进程(如 smss.exe 或 csrss.exe 和...)使用 __security_xx 函数而不链接到 kernel32.dll。我想创建一个这样的流程。
    • 我已经反汇编了 Windows 7 和 Windows 10 的 csrss.exe,但没有发现它们使用金丝雀(没有 __security_xx 函数,也没有 xor esp/rsp,函数序言中的 x)。你在哪里找到了一个使用金丝雀的 csrss?
    • 我在 x86 和 x64 的最新 Windows 10 更新中找到了它们。
    • 是的,最新的win10 csrss包含__security_xx函数。除了 __security_init_cookie_ex 之外,这些函数与常用函数类似。此函数使用不同于常见的 cookie 初始化算法 - 它不使用 QueryPerformanceCounter 和其他 kernel32 函数。您可以使用这些函数的代码构建自己的静态库,导出这些代码并将其链接到您的二进制文件。您还应该找到一种方法来删除 msvcrt.lib 依赖项 - 将其添加到忽略的库中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-02
    • 1970-01-01
    相关资源
    最近更新 更多