__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/