c++ - __RTC_CheckEsp 是如何实现的?

标签 c++ windows assembly

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

相关文章:

c++ - 在重载操作期间出错

.net - In-Proc SxS 打开托管代码中的 shell 扩展?

windows - 在 Windows 上编译 GTK+ 应用程序?

performance - 即使设置了 PCE,用户模式下的 rdpmc 也不起作用

c - mac安装AVR开发平台出现错误

c++ - 在创建动态二维数组时,A[i * c+ j]中的c有什么用,即c代表什么?

c++ - getline c++ 没有匹配函数

c++ - 自动功能必须在使用前定义

无需 CLI 即可运行的 Python 脚本不采用命令行参数

c++ - 如何在 x86 程序集中递增数组?