我正在尝试扩展在线游戏的遗留代码,以合理保证与游戏相关的资源文件是最新版本,并且没有被篡改。我想在没有 DRM、不进入内核模式和没有硬件帮助的情况下执行此操作。理想情况下,我最终决定的应该是与用户空间一样安全。如果他们能绕过这些机制,那么我会说他们已经获得了调皮的权利——至少在一段时间内,然后我们禁止他们。:)
显而易见的做法是获取每个文件的加密哈希,并将哈希输出与预先计算的哈希进行比较。但必须注意确保用户不能轻易篡改用于与当前计算的哈希进行比较的预先计算的哈希。以下是我在架构层面考虑的措施:
- 使用操作系统工具在进程启动时锁定所有资源文件以进行写入,因此没有其他进程可以在事后覆盖这些文件。
- 计算每个资源文件的 MD5 和。
- 连接到 https 服务器,需要针对存储在客户端可执行文件中的特定签名证书进行验证。
- 通过 https 下载包含“正确”哈希的文件,将其存储在 RAM 中(而不是磁盘)。
- 将计算的哈希值与通过 https 接收的哈希值进行比较。
- 如果哈希不匹配则退出。
这比在客户端存储哈希值更安全,因为只要它们存储在客户端,通常有人可以修改它们。使用此方案,攻击者必须弄清楚如何以更改嵌入式公共证书的方式修改可执行文件,以便它实际上包含攻击者的证书,该证书会针对攻击者的 https Web 服务器进行验证,该服务器包含与攻击者匹配的中毒散列篡改的资源文件。这当然是可行的,但比程序使用存储在客户端上的预计算密钥要困难得多,对吧?
可执行文件是本机代码,因此可以将其包装在打包程序中,这使得编辑二进制文件和替换公钥变得更加困难。
现在,尽管我刚刚在两段前描述了如何潜在地攻击我设计的方案:除了我所描述的之外,还有其他方法可以攻击这个方案吗?
我的第二个问题是,什么是可以从 Win32 C++(Visual Studio 2010 编译器)调用以完成这些任务的免费(如免费软件或自由)库?它们可以通过内置的 Windows API 完成还是需要第三方解决方案?
总而言之,问题是: 1. 我建议的方案是否足够强大,足以让大多数脚本小子感到困惑?和 2. 我将使用哪些依赖项或库来实现它?
由于这只是一个游戏,而不是国家安全甚至金钱风险的问题(游戏是 100% 免费软件,没有游戏内经济),我实施的解决方案应该是相当不错的,但它不一定是工业的-力量。
如果您认为合适,请随意回答我的问题的一个或两个部分,如果您认为我一开始就问错了问题,请纠正我。
谢谢!