简而言之,我的项目包括:
- 一个安全的 RESTful API Web 服务(托管在 Heroku 上(,处理数据库的请求/响应。它接受并返回JSON数据
- 一个 Unity 桌面应用程序,兼作 Twitch API 聊天机器人,并与 Web 服务通信以更新游戏状态以及数据库状态。
- 重要提示:此游戏旨在由 Twitch 主播运行,并由用户在 Twitch 聊天中玩
所以我的问题是...即使我的 Web 服务是安全的,我能做些什么来确保有人不会简单地对我的 Unity 应用程序进行逆向工程来弄清楚如何与我的 Web 服务器正确通信?
加密的 HTTP 流量会停止数据包嗅探,但如果仍然可以使用应用程序用于与数据交互的相同方法,则是一项没有实际意义的服务。也许我太偏执了,但是有很多工具专门针对Unity和C#项目,所以真的不需要太多的努力。
我的一个想法是使用 Twitch API 来检查用户是否正在积极流式传输游戏,并且只有在 Web 服务在数据库中找不到设置了"isStreaming"标志的重复 IP 地址时才允许他们启动游戏。这在理论上是有效的...但实际上,任何人都可以在他们的机器上设置一个假的Twitch帐户和一个假的或"空白"的流,然后从游戏中运行一些逆向工程代码。
我还能做些什么来最小化黑客与我的数据库交互的能力吗?
简单的答案
- 与 Unity 兼容的代码混淆
多亏了Unity的插件系统,实际上有一些不错的选择。有些是资源商店中存在的付费选项,还有一些与 Unity 无关(但仍可正常工作(的第三方付费/免费选项。一些免费选项,如ConfuserEx,也是开源的,允许你对你的工作进行自定义代码更改。
更复杂的答案
- 我制作了一个简单的 C# 类库,并用一些毫无意义的功能填充了它(用于测试(
- 我编译了该库的发布版本
- 我使用激进设置通过 ConfuserEx 对其进行了混淆(最大设置让 Unity 吐出
Invalid IL code
错误( - 我在 Unity 项目中添加了一个
Assets/Plugins
文件夹,并将编译后的库放在那里 - 我创建了一个新的 C# 脚本来从 Unity 中测试库
。尽管反编译的代码难以理解,但它在 Unity 中仍然按预期工作。我使用 IL/C# 反编译器工具(如 JustDecompile(来比较混淆二进制文件和原始二进制文件之间的差异。
因此,如果我真的愿意,我可以对所有重要的代码(甚至我的大多数客户项目(遵循这些相同的步骤,以及实施任何上述安全措施......所以希望现在对任何人都无法理解我的项目的内部运作来说,这将是一件太麻烦的事情。