我正在制作一个C ++ 11游戏,其中分数被发送到服务器。我将分数存储为一个简单的浮点数,因此使用Cheat Engine等软件的人可以在将分数值发送到服务器之前轻松更改分数值。
如何保护我的游戏免受此类攻击?
答案 0 :(得分:8)
您可以做很多选择,但最好是不接受来自客户的任何重要值。让服务器完成所有计算,然后将值发送给客户端。
答案 1 :(得分:3)
确实没有办法确保价值不会被篡改。您可以做的是向服务器发送足够的信息,它可以确定“这是可能的” - 例如,如果您的游戏是“吃豆人”风格的游戏,您还可以提供Pac-的所有“Blob”男人吃了,或每个级别的数量和完成每个级别所花费的时间等等。骗子可以重现所需的所有额外数据并不是不可能的,但如果你要发送更多数据,那么这样做会更加困难。
但是,软件中随时可用的任何数据都可能被“调试器”类型的应用程序修改。你无能为力。
答案 2 :(得分:2)
如果您必须首先在客户端执行任何操作,请加密您关心的所有数据(如果可能,请加密所有数据)。
让服务器计算任何重要的东西会更好。例如,在使命召唤中,您希望服务器决定谁被射击以便各个玩家的计算机/等待时间等。不介入。
如果您正在进行仅限本地PC的游戏并且只想在结束时上传分数,则无法进行服务器计算。在这种情况下,你真的必须坚持加密并首先模糊重要的值。你可以做的只有那么多;如果它是100%的客户端计算,它可能永远不会是防弹。
答案 3 :(得分:2)
总会有一种绕过您的保护的方法。不管它有多好。但是,您可以更难。有一个例子:https://github.com/jgk2Th/anti-wpm。
基本上,关键是要创建两个具有相同值的变量,并将其中一个变量移动到RAM中的不同位置(简而言之),以使查找困难得多。然后,比较差异值。
这是该想法的简化代码。
int VariableToProtect = 0;
int pVar[ 1000 ] = { 0 };
int Pos = 0; // 'pseudo-position' of the element (with same value as VariableToProtect) in pVar
while( !GetAsyncKeyState( VK_SPACE ) )
{
if( pVar[ Pos ] != VariableToProtect )
printf( "detected!" );
++VariableToProtect;
Pos = rand( ) % 1000;
pVar[ Pos ] = VariableToProtect;
Sleep( 10 );
}
答案 4 :(得分:1)
如果它是大型多人游戏,那么理论上,您可以使用某种算法,服务器请求来自随机用户组的特定问题的答案。如果没有一些重大的勾结,骗子会得到不同的答案。
如果在像“使命召唤”这样的游戏中,你可以拥有30名玩家并且需要超级多数才能同意是否发生了杀戮。这样,没有任何一个团队可以通过勾结方法作弊。你仍然需要注意用于攀登排行榜的替代账户。