在 c++ 中获取调用方的地址

Getting address of caller in c++

本文关键字:地址 调用 获取 c++      更新时间:2023-10-16

目前我正在研究一个反作弊。我添加了一种检测与 directx 函数的任何挂钩的方法,因为大多数作弊者都会这样做。

当许多程序(例如 OBS、Fraps 和许多其他钩住 directx 的程序)也被检测到钩子时,问题就出现了。

因此,为了能够挂接directx,您很可能必须调用VirtualProtect。如果我能确定从哪个地址调用它,那么我可以遍历内存中的所有 dll,然后找到它被调用的模块,然后将信息发送到服务器,甚至可能采用 md5 哈希并将其发送到服务器进行验证。

我还可以挂上作弊钩住的 DirectX 函数,并检查这些函数从哪里调用(因为它们中的大多数都使用 ms 绕道)。

查了一下,显然你可以检查调用堆栈,但我找到的每个示例似乎都没有帮助我。

这 -

获取调用方的地址 - 在标准C++中是不可能的。许多C++编译器可能会优化一些调用(例如,通过内联它们,即使您没有指定inline,或者因为不再有任何帧指针,例如编译器选项-fomit-frame-pointer用于 x86 32 位与 GCC 的,或通过优化尾部调用......

对于一些实现和一些 C 或 C++ 标准库和一些(但不是全部)编译器选项(特别是,不要要求编译器优化太多*),您可能会得到它,例如(在 Linux 上)使用 GNU glibc 或 I.Taylor libbacktrace(来自 GCC 实现内部)或内置 GCC 返回地址的backtrace

我不知道将这些移植到Windows有多困难(也许Cygwin做到了)。如果您不进行太多优化,GCC 内置可能会以某种方式工作。

另请阅读有关延续的信息。另请参阅相关问题的答案。

注意*:在Linux上,最好编译所有代码(包括外部库!),最多g++ -Wall -g -O1:你不需要太多的优化,你想要调试信息(特别是对于libbacktrace

Ray Chen的博客"旧的新事物"涵盖了使用退货地址"来做出安全决策以及为什么这是一件毫无意义的事情

https://devblogs.microsoft.com/oldnewthing/20060203-00/?p=32403

https://devblogs.microsoft.com/oldnewthing/20040101-00/?p=41223

基本上它很容易伪造(通过注入代码或使用手动构建的假堆栈来欺骗您)。它以窗口为中心,但基本概念通常适用。