使用PKI进行轻量级文件验证

时间:2010-08-14 03:55:07

标签: winapi verification pki

我正在尝试扩展在线游戏的遗留代码,以合理保证与游戏相关的资源文件是最新版本,而不是被篡改。我想在没有DRM的情况下执行此操作,无需进入内核模式,也无需硬件帮助。理想情况下,我最终应该解决的问题与用户空间的安全性一样。如果他们可以解决这些机制,那么我会说他们已经获得了顽皮的权利 - 至少在一段时间内,我们禁止它们。 :)

显而易见的事情是对每个文件进行加密哈希,并将哈希输出与预先计算的哈希值进行比较。但必须注意确保用户不能轻易篡改用于与当前计算的哈希值进行比较的预先计算的哈希值。以下是我在建筑层面上考虑的措施:

  1. 使用操作系统工具锁定进程启动时写入的所有资源文件,因此事后不会有其他进程覆盖文件。
  2. 计算每个资源文件的MD5总和。
  3. 连接到https服务器,要求针对存储在客户端可执行文件中的特定签名证书进行验证。
  4. 通过https下载包含“正确”哈希值的文件,将其存储在RAM(而不是磁盘)中。
  5. 将计算出的哈希值与通过https收到的哈希值进行比较。
  6. 如果哈希值不匹配则退出。
  7. 这比存储哈希客户端更安全,因为只要它们存储在客户端,通常可以由某人修改它们。使用此方案,攻击者必须弄清楚如何以更改嵌入式公共证书的方式修改可执行文件,以便它实际包含攻击者的证书,该证书可以验证攻击者的https Web服务器是否包含与攻击者匹配的中毒哈希值篡改资源文件。这当然是可行的,但是如果程序使用存储在客户端上的预先计算的密钥,那要比它更难:对吧?

    可执行文件是本机代码,因此可以将其包装在打包器中,这使得编辑二进制文件和替换公钥变得更加困难。

    现在,我刚刚在两段前描述了如何潜在地攻击我设计的方案:除了我描述的攻击这个方案之外还有什么方法吗?

    我的第二个问题是,什么是免费(如免费软件或自由)库,可以从Win32 C ++(Visual Studio 2010编译器)调用来完成这些任务?它们可以使用内置的Windows API完成,还是需要第三方解决方案?

    总结一下,问题是: 我建议的方案是否足以阻止大多数脚本小子;和 2.我将使用哪些依赖项或库来实现它?

    由于这只是一个游戏,而不是国家安全甚至货币风险(游戏是100%免费软件,没有游戏内经济),我实施的解决方案应该是相当不错的,但它没有是工业强国。

    如你认为合适,请随意回答我的问题的一个或两个部分,如果你认为我开始提出错误的问题,请纠正我。

    谢谢!

1 个答案:

答案 0 :(得分:2)