__RTC_CheckEsp
是一个验证esp
、堆栈、寄存器正确性的调用。调用它是为了确保 esp
的值在函数调用中被保存。
有人知道它是如何实现的吗?
最佳答案
好吧,对汇编器的一点点检查就暴露了它
0044EE35 mov esi,esp
0044EE37 push 3039h
0044EE3C mov ecx,dword ptr [ebp-18h]
0044EE3F add ecx,70h
0044EE42 mov eax,dword ptr [ebp-18h]
0044EE45 mov edx,dword ptr [eax+70h]
0044EE48 mov eax,dword ptr [edx+0Ch]
0044EE4B call eax
0044EE4D cmp esi,esp
0044EE4F call @ILT+6745(__RTC_CheckEsp) (42BA5Eh)
这里有两行需要注意。首先注意在 0x44ee35 它将 esp 的当前值存储到 esi。
然后在函数调用完成后,它在 esp 和 esi 之间执行 cmp。他们现在应该是一样的。如果不是,那么有人要么将堆栈展开两次,要么没有将其展开。
_RTC_CheckEsp 函数如下所示:
_RTC_CheckEsp:
00475A60 jne esperror (475A63h)
00475A62 ret
esperror:
00475A63 push ebp
00475A64 mov ebp,esp
00475A66 sub esp,0
00475A69 push eax
00475A6A push edx
00475A6B push ebx
00475A6C push esi
00475A6D push edi
00475A6E mov eax,dword ptr [ebp+4]
00475A71 push 0
00475A73 push eax
00475A74 call _RTC_Failure (42C34Bh)
00475A79 add esp,8
00475A7C pop edi
00475A7D pop esi
00475A7E pop ebx
00475A7F pop edx
00475A80 pop eax
00475A81 mov esp,ebp
00475A83 pop ebp
00475A84 ret
如您所见,它首先检查的是先前比较的结果是否“不相等”,即 esi != esp。如果是这样,那么它会跳转到故障代码。如果它们相同,则函数简单地返回。
关于c++ - __RTC_CheckEsp 是如何实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3914750/