可能因为我的水平有限,我所能想到的加密方式似乎都没有实际用处。
比如,某个业务场景是付费用户可以创建无限的素材,而非付费用户只能创建不高于某数量的素材。
虽然我已经用了各种方式来加密这个“某数量”的值,不过不管前面写的多绕,但是最终还是会回归到一个 if 逻辑判断。
比如,针对上述场景,我是这样写的:
val a = "RWM="
val b = a.decodeBase64()?.string(Charset.forName("utf8")) ?: "${Char(0)}${Char(0)}"
val realNum = 10
if (realNum <= b.toCharArray()[1].code - b.toCharArray()[0].code) {
println("pass")
}
else {
println("you need pay first")
}
但是反编译下来是这样的:
(节选)
if (realNum <= var8 - var3) {
var4 = "pass";
System.out.println(var4);
} else {
var4 = "you need pay first";
System.out.println(var4);
}
不管你前面写的有多复杂,最终还是会回归到简单的 if 逻辑判断,别人修改时只需要删除或者直接改一下这个判断就能轻松破解了。
判断是否付费同理,不管前面写的多复杂,最终会回归到简单的逻辑判断。
所以我现在加密完全依赖于加固,但是加固也只能防的住“脚本小子”一键破解,如果是有大牛专门破解的话,也很容易被脱壳。
虽然防住“脚本小子”已经满足我的需求了,但是我还是想知道,应该怎么在不加固的情况下避免被“一键”破解呢?
据我所知,某个业内有名的 APP ,就没有使用加固,但是就是至今没被破解,甚至作者还专门搞了个悬赏,让别人区破解它。据我了解的是,至今没人破解成功。
补充:
- APP 性质决定了没法将需要加密的逻辑放到服务器避免被本地破解
- 上述代码只是做了一个示例,实际使用比这个复杂,而且核心代码也是写在 c++ 中的,不过正如我上述说的,即使写在 c++ 中,最终也是回归到 java 调用 c++的代码,然后做一个简单的逻辑判断
- 我想到的是把加密和业务逻辑混合在一起,但是自己实际测试过,即使这样反编译后效果也不理想。

