到目前为止,普遍的共识是,不可能阻止任何人一心想“破解”您的 APK 这样做。混淆技术只会增加一次“破解”APK 所需的复杂性。在它被上传到无数提供免费托管 APK 的网站后,它只是一个谷歌搜索,甚至远离 Android 新手的“noob-est”。
此外,通过默默无闻的安全性不会让你走得太远。
关于保护您的 APK 免受黑客攻击,我建议您阅读以下文章,讨论Android 上 APK 的许可证验证的当前状态。其中描述的技术应该让您了解需要防范的常见攻击向量。
Proguard是开始混淆 APK的好地方。
在您设法获得混淆后的 APK 后,请通过以下工具运行它并观察反编译的源代码。所有这些都是非常流行的免费和开源工具,并且肯定是任何体面的“破解者”都会尝试的第一件事:
1. baksmali
2. apktool
3. Dex2Jar + JD-Gui
继续为您的代码添加混淆层,直到您对上述工具的输出相当复杂而有意义为止感到满意。(同样不要低估一个拥有可乐、披萨和DVM 操作码知识的大学毕业生在一个周末可以完成的工作)。
关于您共享的链接中讨论的技术,我看不到如何实施它们来保护.dex
Android 上的。如果你最终在一个单独的地方实现了验证逻辑,.so
那么所有“破解者”需要做的就是将你的 java 代码中的调用修补到.so
.
更新:
额外的混淆步骤来保护.so
.
1. 不要遵循或多或少的线性路径。
在整个地方添加额外的跳转可以通过将大量潜在目标淹没“破解器”来工作,如果保护已被绕过,则需要单独修改、修补和验证这些目标。
2. 添加时序检查
这主要是通过使代码在调试和实际运行时遵循不同的路径来摆脱“破解者”。如果两点之间花费的时间比平时多得多,那么它清楚地表明您的程序正在调试。即是时候跳入计算世界上钢琴数量的那部分垃圾代码了。
3. 编写自修改代码
这再次阻碍了静态分析。例如,如果您跳转到验证函数在二进制文件中不存在,但作为.so
.
所有上述技术(以及更多)都在以下关于反调试技术的文章中通过示例进行了描述。
更全面的指南是Peter Ferrie 的 Ultimate Anti Debugging Reference。