无法在自定义 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
属性允许在多个翻译单元中声明和初始化相同的全局变量。
在为 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
属性允许在多个翻译单元中声明和初始化相同的全局变量。