就目前为止的普遍共识而言,不可能阻止任何一心想要“破解”您的 APK 的人这样做。混淆技术只会增加一次“破解”APK 所需的复杂性。当它被上传到无数提供免费托管 APK 的网站后,即使是“最菜鸟”的 Android 菜鸟也只需通过 google 搜索即可。
Also 通过默默无闻实现安全 http://en.wikipedia.org/wiki/Security_through_obscurity will 不会让你走得太远 https://stackoverflow.com/questions/533965/why-is-security-through-obscurity-a-bad-idea.
关于保护您的 APK 免遭黑客攻击,我建议您阅读以下文章,其中讨论了当前的状态Android 上 APK 的许可证验证 http://www.digipom.com/how-the-android-license-verification-library-is-lulling-you-into-a-false-sense-of-security/。其中描述的技术应该让您了解需要防范的常见攻击媒介。
Proguard http://developer.android.com/tools/help/proguard.html是一个很好的起点混淆你的APK http://android-developers.blogspot.tw/2010/09/proguard-android-and-licensing-server.html.
当你成功获得混淆后的APK后,请通过以下工具运行它并观察反编译的源代码。所有这些都是非常流行的免费开源工具,并且肯定是任何像样的“破解者”首先尝试的:
1. baksmali https://code.google.com/p/smali/
2. apktool https://code.google.com/p/android-apktool/
3. Dex2Jar http://code.google.com/p/dex2jar/ + JD-Gui http://java.decompiler.free.fr/?q=jdgui
不断向代码中添加混淆层,直到您确信上述工具的输出相当复杂而无法理解为止。 (再次强调,不要低估一个拿着可乐、披萨和DVM操作码的知识 http://source.android.com/devices/tech/dalvik/dalvik-bytecode.html可以在一个周末完成)。
关于中讨论的技术link http://www.codeproject.com/Articles/18961/Tamper-Aware-and-Self-Healing-Code你分享了,我不知道如何实施它们来保护.dex
在安卓上。如果您最终在单独的中实现验证逻辑.so
那么所有“破解者”需要做的就是将 java 代码中的调用修补到以下代码中的 verify() 函数:.so
.
UPDATE:
额外的混淆步骤以确保.so
.
1. 不要遵循或多或少的线性路径。
在整个地方添加额外的跳转是通过向“破解者”淹没如此多的潜在目标来实现的,这些潜在目标需要单独修改和修补,并验证是否已绕过保护。
2.添加时序检查这主要是为了通过使代码在调试和实际运行时遵循不同的路径来摆脱“破解者”。如果两点之间花费的时间比平常多得多,那么就清楚地表明您的程序正在调试。即是时候跳入计算世界上钢琴数量的垃圾代码部分了。
3.编写自修改代码
这再次阻碍了静态分析。例如,如果您的jump验证函数不存在于二进制文件中,但作为某些 init() 函数的一部分在各处进行了修补.so
.
以下文章中通过示例描述了所有上述技术(以及更多技术)反调试技术 http://thelegendofrandom.com/blog/archives/2100.
更全面的指南是Peter Ferrie 的终极反调试参考 http://pferrie.host22.com/papers/antidebug.pdf.