Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 确定游戏是否已反编译/更改_C#_Unity3d - Fatal编程技术网

C# 确定游戏是否已反编译/更改

C# 确定游戏是否已反编译/更改,c#,unity3d,C#,Unity3d,我正在寻找Unity函数,以确定我的游戏是否以任何方式被反编译/重新编译或修改。是的,有一个Unity函数用于此,但它仍然可以绕过 当应用程序在构建后以任何方式更改时,可以使用返回false的方法来完成此操作 if (Application.genuineCheckAvailable) { if (Application.genuine) { Debug.Log("Not tempered"); } } 问题是,如果这个人足够聪明,可以反编译、修改和编译

我正在寻找Unity函数,以确定我的游戏是否以任何方式被反编译/重新编译或修改。

是的,有一个Unity函数用于此,但它仍然可以绕过

当应用程序在构建后以任何方式更改时,可以使用返回false的方法来完成此操作

if (Application.genuineCheckAvailable)
{
    if (Application.genuine)
    {
        Debug.Log("Not tempered");
    }
}
问题是,如果这个人足够聪明,可以反编译、修改和编译游戏,他/她也可以删除上面的检查,这样上面的检查就没有用了。只要在玩家的机器上运行,任何类型的程序真实性或真实性检查都可以删除


编辑

您可以通过执行以下操作使其更难规避:

1。转到文件-->生成设置。。。然后选择您的平台

2。单击播放器设置-->其他设置,然后将脚本后端从Mono更改为IL2CPP(C++)


这将使其更难规避,但仍有可能规避。

TL;医生:坦白说,这是不可能的

您永远无法确定您的程序是否已反编译,因为不存在确定是否已反编译的度量。而且,即使您对数据进行了混乱和破坏,每个可执行文件至少都可以分解为汇编程序。您可以通过使用模糊软件使您的源代码难以理解。最终的混淆器将是,它将所有汇编程序命令更改为mov指令,这使得理解任何东西都很痛苦。但是它也很慢,可能不是你想要的(顺便说一句,这是因为mov指令在x86指令集中已经完成了,有很多关于它的讨论)。当您遵循这一趋势时,您还可以使用完全相同的汇编代码(大约10-20ish指令)来创建所有可能的程序,这将使您不可能通过简单地分解代码来获取源代码

不过,要保持在可能的范围内:不,您不能阻止人们对您的代码进行反编译或反编译。但是你可以让它更难(不是不可能)理解

不过,检测可执行文件中的更改是可能的。虽然对你来说可能不可行

主要的问题是,你在应用程序中构建的任何用于检测更改的代码都可能被修补掉。所以你需要防止这种情况。但是没有办法阻止

如果您尝试使用原始签名检测应用程序中的更改,并将其与实际签名进行比较,例如,您可以在重新编译的版本中排除该检查。您可以尝试针对服务器验证签名,但仍然可以通过删除服务器检查来避免这种情况。你可以强制对多人游戏进行服务器检查,但我们只会使用假签名。如果您希望计算服务器上的签名以防止篡改,我们将只提供原始文件并运行重新编译的文件

有一种方法(尽管如上所述不可行)可以真正绝对地保护部分代码不被反编译。该机制被称为“”并由德国KIT公司开发。由于我似乎找不到一个合适的文档作为参考,下面是它如何归档的

该机制使用一根带有加密存储器的棍子和一个微控制器进行加密。您将要保护的代码部分(定期调用的东西,是必要的,但不是时间关键的东西)放入加密存储中。由于无法检索键[需要引用],因此无法访问代码。然后,微控制器从程序中获取命令,用给定参数调用存储器中的一个加密函数并返回结果。因为无法读取代码,所以需要分析其行为。盒子的“模糊”部分来了。存储的每个函数都需要有一组小的、定义良好的允许参数。其他每一组参数都会导致一个陷阱,杀死你的设备。由于攻击者不知道有效参数是什么,因此此方法为您提供了可提供的安全性,以防篡改代码(如它们所述)。但是,当我从记忆中写下这段话时,可能会有一些错误


你可以试着用你控制的服务器模仿这种行为(服务器上的代码和试图理解代码的IP禁令)

@Liam:很可能,OP希望自己的游戏检查是否被修改。如果有人能够反编译/重新编译,他们也应该能够完全删除该检查(或者更改您将其与之进行比较的包含的校验和)@Liam当然,哈希确实会有所不同,但这将是无关紧要的,因为检查哈希且在错误时不运行程序的代码不会运行,所以散列是错误的这一事实并不重要。@Liam:那么散列存储在哪里呢?如果游戏需要能够检查当前散列是否与定义的散列匹配,这意味着定义的散列存储在某个地方,其值可以更改(请记住,我们谈论的是那些已经能够对游戏本身进行反编译/重新编译的人)。@Liam:我的第一个评论是:“很可能,OP希望自己的游戏检查是否被修改。”他不是检查两个版本的游戏,而是试图让游戏自我检查(我认为这是一项反盗版措施)@Liam:。@Liam考虑到这两个都被删除了,不,不是真的。它们同样可以被颠覆。@Servy:为了扩展你的观点,需要在某个地方存储一个自定义校验和,这使得存储该校验和的安全性成为另一个弱点。如果他们可以篡改存储,他们可以更改你正在比较的校验和。Th非常感谢你的帮助