比方说,我正在制作一款游戏,玩家的健康状况存储在一个变量float player_hp
中。玩游戏时,用户可以打开像Cheat Engine这样的内存编辑器,对内存进行一些聪明的搜索,并在内存中找到变量的位置。然后,他们可以将其编辑为任何他们想要的内容,从而有效地允许他们作弊。内存中的变量能否免于恶意内存编辑?
是否有一种奇妙的方式来存储我的变量,这将有效地阻止用户恶意编辑它们?我应该在记忆中移动它们吗?我应该加密或散列它们吗?
如果重要,我主要使用C++。
比方说,我正在制作一款游戏,玩家的健康状况存储在一个变量float player_hp
中。玩游戏时,用户可以打开像Cheat Engine这样的内存编辑器,对内存进行一些聪明的搜索,并在内存中找到变量的位置。然后,他们可以将其编辑为任何他们想要的内容,从而有效地允许他们作弊。内存中的变量能否免于恶意内存编辑?
是否有一种奇妙的方式来存储我的变量,这将有效地阻止用户恶意编辑它们?我应该在记忆中移动它们吗?我应该加密或散列它们吗?
如果重要,我主要使用C++。
保护您的数据的两种方法:
1)仅向用户提供二进制文件。编译代码。不要给他们源代码。 2)如果你的游戏是一个在线游戏,存储敏感数据服务器端。
您应该研究一个名为“封装”的想法,以用于设计API,以便敏感数据得到保护。
声明:我没有经验的编程游戏,只为他们作弊。
计算所有重要变量,如健康&弹药服务器端并将该数据复制到客户端。皮卡也必须由服务器验证。如果你在服务器端使用弹药,如果它是客户端的话,我们会调用PickUp(ammoCrate)。
你永远不会阻止所有人,但我认为让90%的人不要再作弊是很烦人的。每款游戏都应该有一些基本的东西,然后再采用更先进的保护措施,让流行的游戏必须避免被作弊者摧毁。
使用基本的异或运算法则(如随时间变化)加密通常修改的值(如健康状况)。更改密钥的地址并使用指针指向它,使指针超过6层深。这将迫使作弊者制作一个脚本,并使用模式扫描,而不仅仅是一张作弊表,这将阻止大多数人。
使用IsDebuggerPresent()来检测被连接的调试器,然后关闭该过程。当您在Cheat Engine中执行“Find What Accesses”时,将附加一个调试器,并且如果使用默认选项将被IsDebuggerPresent检测到。
这可以挂和修补,下一步是手动检查是BeingDebugged国旗在Process Environment Block
获得PEB指针:
PEB* GetPEB()
{
#ifdef _WIN64
return (PEB*)__readgsword(0x60); //64 bit
#else
return (PEB*)__readfsdword(0x30); //32bit
#endif
}
阅读调试标志:
bool IsDebugFlagSet(PEB* peb)
{
if (peb->BeingDebugged == 1) return true;
else return false;
}
如果他们挂钩IsDebuggerPres ent()你可以比较磁盘上的字节与内存中的字节在函数的开始处并进行比较,或者更容易,只需检查第一个字节并查看它是否是相对jmp(x86示例)
检查钩:
bool IsHooked(char* functionName, char* dllName)
{
BYTE* functionAddress = (BYTE*)GetProcAddress(GetModuleHandle(dllName), functionName);
return (*functionAddress == 0xE9);
}
其他招数:
挂钩调用LoadLibrary()& LDRLoadDLL()和加载DLL的流氓为
内存扫描运行进程停止他们通过这样调试器将无法连接
除了这些技巧可以使用商业反作弊或内核模式驱动程序,以保护您的游戏比较使用CreateToolHelp32Snapshot函数()对黑名单
填补所有调试寄存器中的映像名称或图像路径编辑,但上面的提示会阻止普通人。
但即使在用户只有二进制文件且没有源代码的游戏中,仍然可以使用Cheat Engine等实用工具将程序内存编辑为恶意结尾。 –
通常,人们可以在自己的机器上编辑程序。你能做的最好的事情往往是保护其他人的机器。 –