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

10-11 19:17