我会尝试这样的事情:
通过客户端版本,我传递一个哈希密码只是为了更安全(他们可能不会那么容易欺骗)。
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发送的,那么wireharking会消耗掉它们,他们只需要使用其他形式的魔法来读取登录阶段发送的内容。
<version code>
<version string>
所以是的,请使用SSL。
调试器更新:
调试器?不,因为您在服务器上有预期的密码短语检查,并且在不匹配的情况下 - 您放弃了他们的连接。 我希望你的客户端有一个调试器检查,并且 的 不 强> 如果存在调试器则运行;保存它只是为了你自己的调试版本;这是我们正在讨论的版本构建。
但无论如何,要调试(并捅这样的值),他们需要做一些事情: 1)调试符号, 2)反汇编二进制
我希望你不要给它们一个非剥离的可执行文件,所有调试符号仍然附加。因为否则你可能只是将源代码交给他们。
我们谈论的是C ++,在制作之前是混淆的,在制作之后是剥离的。这应该花费他们一段时间来获得反汇编程序的任何有意义的东西,如果代码仍然构建,调试器将无法帮助他们运行剥离的,混淆的反汇编代码。
但这超出了问题的范围,使用哈希硬编码密码连接版本就是如何在服务器上找出他们的版本。不匹配意味着他们正在尝试做一些时髦的事情,所以你可以放弃它们。
无效versionString的示例:
收到1.1a4fd6b272e62e04dac52cab22e0643811,这是: 1.1a + hash(“这是版本1.00”)= 4fd6b272e62e04dac52cab22e0643811
1.1a
并不难实现(前4个字母是你的versionCode,其余的是盐),如果盐是好的,请检查该盐的预期versionCode。此外,通过检查可执行文件的校验和,确保没有完成文件篡改。并且你应该是安全的,没有新手饼干/黑客试图拉你的东西。但是,如果他真的有决心,给他几个月,他会打败它:)或购买完整的游戏,如果浪费几个星期,这不会改变他的想法。