我用 Unity Engine 编写了一个 Android 游戏。正如您在 Unity 中所知道的,脚本编译成一个名为“Assembly-CSharp.dll”的文件。我用 C# 编写了我的脚本。
将整个游戏编译成 .apk 后,我将其重命名为 .zip 并将 Assembly-CSharp.dll 拖入 ILSpy 之类的工具中,而整个程序已完全反编译,包含我的 RSA 公钥或 AES 密码等所有详细信息,IV ,盐...
我的应用程序的逻辑是客户端(Android)和服务器(Java)。
当玩家完成一个关卡时,通过这个 URL: http://www.example.com:8080/MyApp/SaveScores.do?hash=labla....labla,我们给他分数。真正的参数是用户名、分数、时间戳。我们的加密算法是 RSA 1024 位。
当作弊者/攻击者嗅探 HTTP 流量以使用重放攻击时,我们使用 RSA 和时间戳参数检查解密的哈希值,我们将他踢出去。
但是当他使用工具 (ILSpy) 完美地反编译代码时,他只需找到我的公钥并发现我使用该公钥加密了用户分数和时间戳。然后,他将编写一个 Unity 或 C# 程序,用新的时间戳简单地加密他操纵的消息,并且他将在我的服务器端应用程序中受到信任,因为任何事情都是真实的。
他将通过在不玩游戏的情况下向服务器发送 HTTP 请求来提高分数。他可以简单地作弊。
我能做什么?
- 我不能使用 SSL。
- 通过混淆,只会增加破解时间。
- 通过在运行时从服务器到客户端提供公钥,内存检查器或流量嗅探器可以简单地看到公钥。