[UCRT:VCRUNTIME] Implement __security_init_cookie and __security_check_cookie

This commit is contained in:
Timo Kreuzer 2024-10-22 09:05:04 +03:00
parent 055875fbd8
commit 5dcd1d1714
5 changed files with 157 additions and 0 deletions

View file

@ -101,6 +101,7 @@ include(stdio/stdio.cmake)
include(stdlib/stdlib.cmake)
include(string/string.cmake)
include(time/time.cmake)
include(vcruntime/vcruntime.cmake)
add_library(ucrt OBJECT
${UCRT_CONIO_SOURCES}
@ -122,6 +123,7 @@ add_library(ucrt OBJECT
${UCRT_STDLIB_SOURCES}
${UCRT_STRING_SOURCES}
${UCRT_TIME_SOURCES}
${UCRT_VCRUNTIME_SOURCES}
)
#target_link_libraries(ucrt pseh)

View file

@ -0,0 +1,87 @@
//
// __security_init_cookie.c
//
// Copyright (c) 2024 Timo Kreuzer
//
// Implementation of __security_init_cookie.
//
// SPDX-License-Identifier: MIT
//
#include <stdlib.h>
#include <intrin.h>
#include <corecrt_internal.h>
#ifdef _WIN64
#define DEFAULT_SECURITY_COOKIE 0x00002B992DDFA232ull
#define _rotlptr _rotl64
#else
#define DEFAULT_SECURITY_COOKIE 0xBB40E64E
#define _rotlptr _rotl
#endif
uintptr_t __security_cookie = DEFAULT_SECURITY_COOKIE;
uintptr_t __security_cookie_complement = ~DEFAULT_SECURITY_COOKIE;
void __security_init_cookie(void)
{
LARGE_INTEGER performanceCounter;
FILETIME fileTime;
uintptr_t randomValue = (uintptr_t)0x27E30B2C16B07297ull;
#if defined(_M_IX86) || defined(_M_X64)
if (IsProcessorFeaturePresent(PF_RDRAND_INSTRUCTION_AVAILABLE))
{
#ifdef _M_X64
while (!_rdrand64_step(&randomValue))
_mm_pause();
#else
while (!_rdrand32_step(&randomValue))
_mm_pause();
#endif
}
if (IsProcessorFeaturePresent(PF_RDTSC_INSTRUCTION_AVAILABLE))
{
randomValue += __rdtsc();
}
#endif
randomValue += (uintptr_t)&randomValue;
randomValue ^= GetTickCount();
QueryPerformanceCounter(&performanceCounter);
#ifdef _WIN64
randomValue ^= performanceCounter.QuadPart;
#else
randomValue ^= performanceCounter.LowPart;
randomValue ^= performanceCounter.HighPart;
#endif
randomValue += GetCurrentThreadId();
randomValue = _rotlptr(randomValue, GetCurrentThreadId() >> 2);
#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8)
GetSystemTimePreciseAsFileTime(&fileTime);
#else
GetSystemTimeAsFileTime(&fileTime);
#endif
randomValue += fileTime.dwLowDateTime;
randomValue += fileTime.dwHighDateTime;
randomValue += GetCurrentProcessId();
randomValue = _rotlptr(randomValue, GetCurrentProcessId() >> 2);
if (randomValue == DEFAULT_SECURITY_COOKIE)
{
randomValue++;
}
#ifdef _WIN64
/* Zero out highest 16 bits */
randomValue &= 0x0000FFFFFFFFFFFFull;
#endif
__security_cookie = randomValue;
__security_cookie_complement = ~randomValue;
}

View file

@ -0,0 +1,27 @@
//
// __security_check_cookie.asm
//
// Copyright (c) 2024 Timo Kreuzer
//
// Implementation of __security_check_cookie for x64.
//
// SPDX-License-Identifier: MIT
//
#include <asm.inc>
EXTERN __security_cookie:QWORD
EXTERN __report_gsfailure:PROC
.code64
// This function must not clobber any registers!
PUBLIC __security_check_cookie
__security_check_cookie:
cmp rcx, qword ptr __security_cookie[rip]
jne __security_check_cookie_fail
ret
__security_check_cookie_fail:
jmp __report_gsfailure
END

View file

@ -0,0 +1,27 @@
//
// __security_check_cookie.asm
//
// Copyright (c) 2024 Timo Kreuzer
//
// Implementation of __security_check_cookie for x86.
//
// SPDX-License-Identifier: MIT
//
#include <asm.inc>
EXTERN ___security_cookie:QWORD
EXTERN ___report_gsfailure:PROC
.code
// This function must not clobber any registers!
PUBLIC ___security_check_cookie
___security_check_cookie:
cmp ecx, dword ptr [___security_cookie]
jne ___security_check_cookie_fail
ret
___security_check_cookie_fail:
jmp ___report_gsfailure
END

View file

@ -0,0 +1,14 @@
list(APPEND UCRT_VCRUNTIME_SOURCES
vcruntime/__security_init_cookie.c
)
if(${ARCH} STREQUAL "i386")
list(APPEND UCRT_VCRUNTIME_SOURCES
vcruntime/i386/__security_check_cookie.s
)
elseif(${ARCH} STREQUAL "amd64")
list(APPEND UCRT_VCRUNTIME_SOURCES
vcruntime/amd64/__security_check_cookie.s
)
endif()