我试图了解这个 GS cookie 实现是如何工作的。从我读到的关于这个主题的内容来看,在序言期间设置了一个 cookie,然后在尾声中再次检查。好吧,我可以看到正在设置的 cookie,但这与我在网上看到的示例不同。
序幕:
push ebp
mov ebp,esp
push FFFFFFFF
push sdk.FAB99E9 ; New Exception handler
mov eax,dword ptr fs:[0] ; Old Exception handler
push eax
sub esp,14 ; Allocate 5 DWORDs
push ebx
push esi
push edi
mov eax,dword ptr ds:[FAC635C] ; The GS cookie (.data section)
xor eax,ebp
push eax ; The GS Cookie
lea eax,dword ptr ss:[ebp-C]
mov dword ptr fs:[0],eax ; Set new Exception Handler
mov edi,ecx ; Address of a vector passed as arg1
mov dword ptr ss:[ebp-20],edi ; local variable
mov dword ptr ss:[ebp-1C],0 ; local variable
mov dword ptr ds:[edi],0 ; zero the vector
mov dword ptr ds:[edi+4],0
mov dword ptr ds:[edi+8],0
mov dword ptr ss:[ebp-4],0 ; sets the 0xFFFFFFFF above to 0x0
mov dword ptr ss:[ebp-1C],1
mov byte ptr ss:[ebp-D],0
结语:
mov eax,edi
mov ecx,dword ptr ss:[ebp-C] ; Old Exception handler
mov dword ptr fs:[0],ecx ; Restore Exception handler
pop ecx ; Pop the GS Cookie
pop edi
pop esi
pop ebx
mov esp,ebp
pop ebp
ret
注释为“新异常处理程序”的函数确实包含 Cookie 检查。但我一直无法踏入其中。
任何人都可以解释它是如何工作的以及它在 C++ 中的样子吗?或者,更具体到我的需求,这是原始代码中的 try/catch 块还是由编译器添加的?