内存中的变量可以免受恶意内存编辑的影响吗?

问题描述 投票:0回答:2

假设我正在制作游戏,玩家的健康状况存储在变量float player_hp中。在玩游戏时,用户可以打开像Cheat Engine这样的内存编辑器,通过内存进行一些巧妙的搜索,并在内存中找到变量的位置。然后他们可以将其编辑为他们想要的任何东西,从而有效地让他们作弊。

是否有一种奇特的方式来存储我的变量,这些变量将有效阻止用户恶意编辑它们?我应该在记忆中移动它们吗?我应该加密它们还是哈希它们?

如果重要,我主要使用C ++。

variables memory anti-cheat
2个回答
0
投票

保护数据的两种方法:

1)仅向用户提供二进制文件。编译代码。不要给他们源代码。

2)如果您的游戏是在线游戏,请存储敏感数据服务器端。

您应该研究一种名为“封装”的想法,用于设计API,以保护敏感数据。


0
投票

免责声明:我没有编程游戏的经验,只为他们制作作弊。

计算所有重要变量,例如health和ammo服务器端,并将该数据复制到客户端。皮卡也必须由服务器验证。如果您使用amoe,我们只需调用PickUp(ammoCrate),如果它是客户端的话。

你永远不会阻止所有人,但我认为让90%的人停止尝试作弊是非常重要的。每个游戏应该有一些基本的东西,然后更流行的保护,流行的游戏必须避免被欺骗者摧毁。

使用随时间变化的基本XOR算法加密常用修改后的值(如运行状况)。也改变键的地址并使用指向它的指针,使指针深6层以上。这将迫使作弊者制作剧本并使用模式扫描而不仅仅是作弊表,这将阻止大多数人。

使用IsDebuggerPresent()检测附加的调试器,然后关闭该过程。当您在Cheat Engine中执行“查找访问内容”时将附加调试器,并且IsDebuggerPresent将检测使用默认选项。

这可以挂钩和打补丁,下一步是手动检查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);
}

其他技巧:

Hook LoadLibrary()和LDRLoadDLL()并阻止他们加载恶意dll

通过使用CreateToolHelp32Snapshot()将图像名称或图像路径与黑名单进行比较,扫描内存编辑器的运行进程

填写所有调试寄存器,以便无法附加调试器

除了这些技巧,您可以使用商业反热或内核模式驱动程序来保护您的游戏,但上述提示将阻止普通人。

© www.soinside.com 2019 - 2024. All rights reserved.