查找对 的写入以qword_18009FBD0
查看它的初始化位置。
显然,它是一个数组的一部分, __encodedKERNEL32Functions
在与__security_cookie
. 您可以将指向 kernel32 函数名称的指针重命名以更好地了解发生了什么:
;(from initialize_pointers)
lea rdx, aClosethreadpoo ; "CloseThreadpoolTimer"
mov rcx, rbx ; hModule
mov cs:qword_180092498, rax
call cs:__imp_GetProcAddress
xor rax, cs:__security_cookie
lea rdx, aCreatethreadpo_0 ; "CreateThreadpoolWait"
mov rcx, rbx ; hModule
mov cs:pCloseThreadpoolTimer_xored, rax ;<- variable renamed
__crtCloseThreadpoolTimer proc near
sub rsp, 28h
mov rax, cs:pCloseThreadpoolTimer_xored
xor rax, cs:__security_cookie
jz short loc_180036A8A
call cs:__guard_dispatch_icall_fptr ; calls CloseThreadpoolTimer()
loc_180036A8A:
add rsp, 28h
retn
__crtCloseThreadpoolTimer endp
这种缓解措施实际上并不是新的,并且已经在VS2013 CRT 中使用,尽管形式略有不同。它可能旨在减少标准 CRT DLL 中可用 API 指针的数量,以增加利用难度。
尽管__security_cookie
最常用于保护堆栈上的数据(GS 和 EH cookie),但没有什么能阻止程序员将其用作其他目的作为简单的熵源。