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



在为Windows操作系统的应用程序实现我自己的C运行时解决方案时,我面临以下问题:

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

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

GlobalSecurity.c:/strong>

#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不能正常工作?如何解决这个问题?

第页。S.:UPtr与UINT_PTR 相同

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

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

最新更新