我会尝试这样的:
在传递客户端版本时,我会传递一个散列密码短语,以增加安全性(他们可能不会那么容易欺骗)。
示例:
客户端版本 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 检查它。此外,通过检查可执行文件的校验和确保没有文件篡改。而且你应该是安全的,没有新手破解者/黑客试图在你身上做点什么。但如果他真的下定决心,给他几个月的时间,他会打败它的 :) 或者购买完整的游戏,如果在这上面浪费了几个星期,不要改变他的想法。