目前我正在做一个反热的工作。我添加了一种方法来检测对directx函数的任何挂钩,因为这些是大多数作弊者所做的。
当许多程序(例如OBS,Fraps和许多其他挂钩directx的程序也检测到它们的钩子时)出现问题。
因此,为了能够挂钩directx,你最有可能必须调用VirtualProtect。如果我可以确定从哪个地址调用,那么我可以循环遍历内存中的所有dll,然后找到它从哪个模块调用,然后将信息发送到服务器,甚至可能采取一个md5哈希并将其发送到服务器进行验证。
我还可以挂钩作弊钩子的DirectX函数并检查调用它们的位置(因为大多数都使用ms绕道)。
我查了一下,显然你可以查看调用堆栈,但我发现的每个例子似乎都没有帮助我。
答案 0 :(得分:1)
这个 - 获取呼叫者的地址 - 在标准C ++中是不可能的。许多C ++编译器可能会优化一些调用(例如,通过内联它们,即使您没有指定inline
,或者因为没有任何帧指针,例如x86 32位的编译器选项-fomit-frame-pointer
{ {3}},或通过优化GCC ....)到问题可能没有任何意义。
使用一些实现和一些C或C ++标准库和一些(但不是全部)编译器选项(特别是,不要求编译器优化太多 * ),你可能会得到它,例如(在Linux上)使用tail-call或backtrace
from GNU glibc或GCC I.Taylor's libbacktrace
(from inside GCC implementation)。
我不知道将这些移植到Windows有多困难(也许是Cygwin做到了)。如果不进行太多优化,GCC内置函数可能会以某种方式工作。
另请阅读return address builtins。另请参阅continuations相关问题。
注意*:在Linux上,最好用最多g++ -Wall -g -O1
编译所有代码(包括外部库!):你不需要太多的优化,并且你想要调试信息(特别是{{ 1}})
答案 1 :(得分:0)
http://blogs.msdn.com/b/oldnewthing/archive/2006/02/03/524071.aspx
http://blogs.msdn.com/b/oldnewthing/archive/2004/01/01/47042.aspx
基本上它很容易伪造(通过注入代码或使用手动构造的假堆栈来欺骗你)。它以Windows为中心,但基本概念通常适用。