基本上我有一个c ++服务器,它将使用二进制协议与我的客户端交谈(统一游戏)。作为登录过程的一部分,我想将客户端版本发送到服务器。然后服务器响应说(假设登录凭据是正确的)它们可以连接,或者如果客户端版本已过时,它将返回过时的客户端版本。
我的问题是,如何防止人们使用旧客户端版本和欺骗作为最新版本。因为这可能会导致服务器错误,因为它正在处理一个过时的客户端,认为它是最新的。
答案 0 :(得分:0)
我尝试这样的事情:
除了通过客户端版本之外,我还是通过了一个哈希密码,只是为了更加安全(他们可能会赢得这样的欺骗)。
Eamples:
客户端版本1.00
密码"这是版本1.00" = 4fd6b272e62e04dac52cab22e0643811
所以你收到1.004fd6b272e62e04dac52cab22e0643811
客户端版本1.1a
密码"这是版本1.1a" = a475834cb992bcb649c819ba83267b23
所以你收到1.1aa475834cb992bcb649c819ba83267b23
事实是,你不能阻止一个专注的人。任何钥匙孔都可以打开。你所能做的就是让它变得更复杂,因此它需要足够的时间(或努力)才能放弃,或被权威机构检测到。
我发布的例子有点难以欺骗,因为:
a)他们需要猜测你使用的是MD5而不是SHA1
b)他们需要弄清楚您只是简单地连接<version code>
和<version string>
c)能够将它一直连接起来以便弄明白。如果您通过SSL发送此信息,则电汇将耗尽,并且他们只需使用其他形式的魔法来阅读在登录阶段发送的内容。
所以是的,请使用SSL。
调试器更新:
调试器??不,因为您在服务器上有预期的密码短语检查,并且在不匹配的情况下 - 您放弃了他们的连接。 我希望您在客户端进行调试器检查,如果存在调试器,则运行 NOT ;保存它只是为了你自己的调试版本;这是我们正在讨论的版本。
但无论如何,为了调试(并捅这样的价值),他们需要一些东西:
1)调试符号,
2)反汇编二进制文件
我希望您不要将所有调试符号仍附加的非剥离可执行文件交给他们。因为否则你可能只是将源代码交给他们。
我们所谈论的是用C ++编写的,在制作之前进行混淆,在制作之后进行剥离。这应该花一些时间让反汇编程序获得任何有意义的东西,如果代码仍然构建,调试器不会帮助他们运行剥离的,混淆的反汇编代码。
但是这不在问题范围之内,将版本与哈希硬编码密码连接起来就是你如何在服务器上找出他们的版本。不匹配意味着他们正在尝试做一些时髦的事情,所以你可以放弃它们。
versionString的无效示例:
接收1.1a4fd6b272e62e04dac52cab22e0643811,即:
1.1a
+哈希(&#34;这是版本1.00&#34;)= 4fd6b272e62e04dac52cab22e0643811
并不难实现(前4个字母是你的versionCode,其余的是盐),如果盐是好的,请检查该盐的预期versionCode。此外,通过检查可执行文件的校验和,确保没有完成文件篡改。并且你应该是安全的,没有新手饼干/黑客试图拉你的东西。但是,如果他真的有决心,给他几个月的时间,他会打败它:)或者如果浪费几个星期的时间就可以购买完整的游戏,不要改变主意。