假设我正在制作一个游戏,玩家的生命值存储在一个变量float player_hp
中。在玩游戏时,用户可以打开像作弊引擎这样的内存编辑器,在内存中进行一些巧妙的搜索,找到变量在内存中的位置。然后他们可以将其编辑为他们想要的任何内容,从而有效地允许他们作弊。
有没有一种奇特的方法来存储我的变量,可以有效地阻止用户恶意编辑它们?我应该在内存中移动它们吗?我应该加密它们还是散列它们?
如果重要的话,我主要使用 C++。
假设我正在制作一个游戏,玩家的生命值存储在一个变量float player_hp
中。在玩游戏时,用户可以打开像作弊引擎这样的内存编辑器,在内存中进行一些巧妙的搜索,找到变量在内存中的位置。然后他们可以将其编辑为他们想要的任何内容,从而有效地允许他们作弊。
有没有一种奇特的方法来存储我的变量,可以有效地阻止用户恶意编辑它们?我应该在内存中移动它们吗?我应该加密它们还是散列它们?
如果重要的话,我主要使用 C++。
保护数据的两种方法:
1) 只为用户提供二进制文件。编译的代码。不要给他们源代码。
2)如果您的游戏是在线游戏,请在服务器端存储敏感数据。
您应该研究一种称为“封装”的想法,用于设计 API 以保护敏感数据。
免责声明:我没有编程游戏的经验,只会为他们制作秘籍。
计算所有重要变量,例如健康和弹药服务器端,并将该数据复制到客户端。取件也必须由服务器验证。如果你是服务器端的弹药,如果它是客户端的,我们只会调用 PickUp(ammoCrate)。
你永远不会阻止每个人,但我认为让 90% 的人停止尝试作弊,让它变得足够烦人是很重要的。每个游戏都应该有一些基本的东西,然后是流行游戏必须有的更高级的保护,以避免被作弊者破坏。
使用随时间变化的基本 XOR 算法对经常修改的值(例如健康)进行加密。更改密钥的地址并使用指向它的指针,使指针深度超过 6 层。这将迫使作弊者编写脚本并使用模式扫描而不是仅使用作弊表,这将阻止大多数人。
使用IsDebuggerPresent()检测正在附加的调试器,然后关闭进程。当您在作弊引擎中执行“查找访问权限”时,它将附加一个调试器,并且 IsDebuggerPresent 将检测到是否使用默认选项。
这个可以hook和patch,下一步是手动检查Process Environment Block中的BeingDebugged标志
获取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;
}
如果他们正在挂钩 IsDebuggerPresent() 您可以将磁盘上的字节与函数开头的内存中的字节进行比较并进行比较,或者更容易检查第一个字节并查看它是否是相对 jmp(x86 示例)
检查钩子:
bool IsHooked(char* functionName, char* dllName)
{
BYTE* functionAddress = (BYTE*)GetProcAddress(GetModuleHandle(dllName), functionName);
return (*functionAddress == 0xE9);
}
其他技巧:
挂钩 LoadLibrary() 和 LDRLoadDLL() 并阻止它们加载恶意 dll
通过使用 CreateToolHelp32Snapshot() 将图像名称或图像路径与黑名单进行比较,扫描内存编辑器的运行进程
填充所有调试寄存器,以便无法附加调试器
除了这些技巧,您还可以使用商业反作弊或内核模式驱动程序来保护您的游戏,但上述技巧将阻止普通人。