无法在自定义 CRT 中为 __security_cookie 生成随机值

Cannot generate random value for __security_cookie in custom CRT

在为 Windows OS 的应用程序实施我自己的 C 运行时解决方案时,我遇到了以下问题:

每个执行时间__security_cookie应该得到一个带有selectany属性的随机值(使用__declspec(selectany))。但它并没有……因此,每次它在 64 位版本的应用程序中都具有默认值 0x00002B992DDFA232。它会导致错误(全局安全检查失败)。

我使用 Clang 版本 14 来编译我的代码。

GlobalSecurity.c:

#if defined (_WIN64)
    #define DEFAULT_SECURITY_COOKIE 0x00002B992DDFA232
#else
    #define DEFAULT_SECURITY_COOKIE 0xBB40E64E
#endif

// Global security cookie
__declspec(selectany) UPtr __security_cookie = (UPtr)DEFAULT_SECURITY_COOKIE;
__declspec(selectany) UPtr __security_cookie_complement = ~((UPtr)DEFAULT_SECURITY_COOKIE);

GlobalSecurity.h

...
// Global security cookie
extern UPtr __security_cookie;
extern UPtr __security_cookie_complement;


typedef union
{
    unsigned __int64 ft_scalar;
    FILETIME ft_struct;
} FT;

// Initializes global security cookie
void CDECL __security_init_cookie()
{
    if (__security_cookie != DEFAULT_SECURITY_COOKIE
#if defined (_M_IX86)
        && (__security_cookie & 0xFFFF0000) != 0
#endif
        )
    {
        __security_cookie_complement = ~__security_cookie;
        return;
    }
...

为什么 __security_cookie 不能正常工作?以及如何解决这个问题?

P.S.: UPtr 等同于UINT_PTR

selectany 不会给你一个随机数,即使它的目的是避免“使用未初始化的变量”警告,你的代码正在分配给变量!

selectany 属性允许在多个翻译单元中声明和初始化相同的全局变量。