在 c++ 中获取调用方的地址
Getting address of caller in c++
目前我正在研究一个反作弊。我添加了一种检测与 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
基本上它很容易伪造(通过注入代码或使用手动构建的假堆栈来欺骗您)。它以窗口为中心,但基本概念通常适用。
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 调用 lua 函数的地址为 C/C++?
- 在 Microsoft Access SQL 中调用自定义 DLL 函数时传递的内存地址无效
- 为什么使用存储在虚拟方法表中的地址调用虚拟函数的函数会返回垃圾?
- 指针在函数调用后更改其地址
- 获取要在C++中动态调用的回调函数的地址
- 地址处的 C++ 值与函数调用后的预期值不同
- NRVO不应该保证局部命名变量和调用站点变量采用相同的地址吗?
- 使用来自 Dll 的偏移地址调用成员函数
- 如何使用函数指针从其内存地址调用成员函数
- 通过已知地址调用函数?C++
- C++ 尝试通过内存中的地址调用函数时程序崩溃(如何修复?
- 从地址调用函数时,C 程序崩溃
- 如何通过dll中的地址调用函数
- 如何从成员的地址调用成员函数
- 在c/c++中通过函数在内存中的地址调用函数
- 显示 new() 在 malloc 返回的地址调用对象的构造函数的源代码
- 通过函数地址调用另一个类的函数
- 按地址调用函数
- 按地址调用函数失败