【问题标题】:How to prevent game-client version spoofing?如何防止游戏客户端版本欺骗?
【发布时间】:2016-10-03 13:55:47
【问题描述】:

基本上,我有一个 c++ 服务器,它将使用二进制协议与我的客户端对话(统一游戏)。作为登录过程的一部分,我想将客户端版本发送到服务器。然后服务器响应说(假设登录凭据正确)他们可以连接,或者如果客户端版本过时,它会返回客户端版本过时。

我的问题是,如何防止人们使用旧客户端版本并欺骗最新版本。因为这可能会导致服务器错误,因为它正在处理一个认为它是最新的过时客户端。

【问题讨论】:

  • 您无能为力 - 任何专门的攻击者都可以将任何客户端数据伪装成他们想要的任何东西。验证通信服务器端,如果他们发送过时/无效的东西,只需断开它们
  • 使用“关键字”或简单地使用客户端的哈希作为与密码一起发送的“神奇关键字”。这样他们就需要欺骗哈希和版本。

标签: security networking binary protocols


【解决方案1】:

我会尝试这样的:

在传递客户端版本时,我会传递一个散列密码短语,以增加安全性(他们可能不会那么容易欺骗)。

示例:

客户端版本 1.00
密码“这是 1.00 版”= 4fd6b272e62e04dac52cab22e0643811
所以你会收到 1.004fd6b272e62e04dac52cab22e0643811

客户端版本 1.1a
密码“这是版本 1.1a”= a475834cb992bcb649c819ba83267b23
所以你会收到 1.1aa475834cb992bcb649c819ba83267b23

事实是,你无法阻止一个敬业的人。任何钥匙孔都可以打开。你所能做的就是让它变得更复杂一点,这样他们就需要足够的时间(或努力)才能放弃,或者被权威发现。

我发布的示例有点难以欺骗,因为:
a) 他们需要猜测您使用的是 MD5 而不是 SHA1。
b) 他们需要弄清楚你只是在连接 <version code><version string>
c)能够一直对其进行wireshark以找出答案。如果您通过 SSL 发送此信息,则使用wiresharking 会付诸东流,他们只需要使用其他形式的魔法来读取登录阶段发送的内容。

所以,是的,为此使用 SSL。

调试器更新:

调试器??不,因为您在服务器上进行了预期的密码检查,并且在不匹配的情况下 - 您断开了他们的连接。 我希望您的客户端中有调试器检查,如果存在调试器,请运行;将其保存为您自己的调试版本;这是我们正在讨论的发布版本。

但无论如何,要调试(并像这样戳值),他们需要做一些事情:
1) 调试符号,
2) 反汇编二进制

我希望您不会将所有调试符号仍然附加的未剥离的可执行文件交给他们。因为否则你可能也只是把源代码交给他们。

我们谈论的是在 C++ 中,制作前混淆,制作后剥离。这应该需要他们一段时间才能让反汇编程序获得任何有意义的东西,如果代码仍然可以构建,调试器将无法帮助他们运行剥离、混淆的反汇编代码。

但这超出了问题的范围,将版本与散列硬编码密码连接起来是您在服务器上找出它们的版本的方法。不匹配意味着他们正在尝试做一些时髦的事情,所以你可以放弃他们。

无效版本字符串示例:

接收 1.1a4fd6b272e62e04dac52cab22e0643811 即:
1.1a + hash("This is version 1.00") = 4fd6b272e62e04dac52cab22e0643811

实现起来并不难(前 4 个字母是您的 versionCode,其余的是 salt),如果 salt 很好,请对照该 salt 的预期 versionCode 检查它。此外,通过检查可执行文件的校验和确保没有文件篡改。而且你应该是安全的,没有新手破解者/黑客试图在你身上做点什么。但如果他真的下定决心,给他几个月的时间,他会打败它的 :) 或者购买完整的游戏,如果在这上面浪费了几个星期,不要改变他的想法。

【讨论】:

  • 难道他们不能只使用调试器并在散列之前更改密码吗?即他们可以将 1.0 和“这是 1.00 版”替换为 1.1a “这是 1.1a 版”?如果这是一个愚蠢的问题,请原谅我。
  • 调试器? ?不,因为您在服务器上进行了预期的密码检查,并且在不匹配的情况下 - 您断开了他们的连接。即使他们只是将 1.00 更改为 1.1a,散列部分也不会匹配,你就会知道他没有做好。
  • 我做了一个调试器相关的更新;但我有点忘记我们在这里试图反击和阻止的事情。人们在调试器环境中运行您的客户端并连接到您的服务器比他们欺骗他们的客户端版本恕我直言。
  • 我的意思是汇编级调试器。他们不能同时更改密码短语值和版本号吗?但我想你的答案的重点是,由于使用 SSL,他们无法首先嗅探数据包以反转散列并找出它是如何分配的(通过在调试器中搜索它的散列)?
  • 是的。汇编级调试器真的不能那么容易地嗅出密码。代码必须先反汇编。在 ASM 领域,它可能必须将哈希的有效地址加载到寄存器中,然后再将其连接到易于更改的版本号。那是他可以放置一个断点来改变两者的地方。但是,如果密码短语是硬编码在二进制文件中,他将无法在不对文件进行十六进制编辑的情况下更改它,对吧?然后客户端的文件大小和/或校验和将不匹配,因此您也可以删除他。
猜你喜欢
  • 2021-09-18
  • 2023-03-15
  • 2011-06-23
  • 2017-01-12
  • 1970-01-01
  • 1970-01-01
  • 2017-05-14
  • 2017-01-08
  • 1970-01-01
相关资源
最近更新 更多