mirror of
https://github.com/reactos/reactos.git
synced 2025-03-01 03:45:16 +00:00
[UCRT:VCRUNTIME] Implement __security_init_cookie and __security_check_cookie
This commit is contained in:
parent
055875fbd8
commit
5dcd1d1714
5 changed files with 157 additions and 0 deletions
|
@ -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)
|
||||
|
|
87
sdk/lib/ucrt/vcruntime/__security_init_cookie.c
Normal file
87
sdk/lib/ucrt/vcruntime/__security_init_cookie.c
Normal 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;
|
||||
}
|
27
sdk/lib/ucrt/vcruntime/amd64/__security_check_cookie.s
Normal file
27
sdk/lib/ucrt/vcruntime/amd64/__security_check_cookie.s
Normal 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
|
27
sdk/lib/ucrt/vcruntime/i386/__security_check_cookie.s
Normal file
27
sdk/lib/ucrt/vcruntime/i386/__security_check_cookie.s
Normal 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
|
14
sdk/lib/ucrt/vcruntime/vcruntime.cmake
Normal file
14
sdk/lib/ucrt/vcruntime/vcruntime.cmake
Normal 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()
|
Loading…
Reference in a new issue