如何使 apk 安全。防止反编译

Posted

技术标签:

【中文标题】如何使 apk 安全。防止反编译【英文标题】:How to make apk Secure. Protecting from Decompile 【发布时间】:2011-09-08 06:46:27 【问题描述】:

我正在开发一个应用程序,它具有 SQLite 数据库来存储必须保护的个人信息。有哪些方法可以保护这些个人数据? APK 可以很容易地被完全反编译,那么我们如何保护 APK?此外,如何保护移动应用程序的数据库?

【问题讨论】:

我想要同样的方法来保护我的代码库? 查看我对类似问题的回答:hiding strings in Obfuscated code 【参考方案1】:

基本上,有 5 种方法可以保护您的 APK 被破解/反转/重新打包:

1。隔离 Java 程序

最简单的方法是让用户无法访问Java Class 程序。这是最基本的方式,它有多种具体的方式来实现。例如,开发者可以将关键的Java Class放在服务器上,客户端通过访问服务器的相关接口来获取服务,而不是直接访问Class文件。所以黑客没有办法反编译Class文件。目前,通过接口提供的标准和协议服务越来越多,如HTTP、Web Service、RPC等,但也有很多应用不适合这种保护。例如,独立程序中的Java程序无法隔离。

2。加密类文件

为了防止Class文件被直接反编译,很多开发者会对一些关键的Class文件进行加密,比如注册号、序列号管理等相关类。在使用这些加密的类之前,程序需要先解密这些类,然后将这些类加载到JVM中。这些类可以通过硬件或软件解密。

开发人员经常通过自定义的 ClassLoader 类加载加密类(Applet 不支持自定义的 ClassLoader,因为安全原因)。 Customed ClassLoader 将首先找到加密类,然后解密它们。最后将解密的类加载到 JVM。自定义类加载器是这个保护方法中非常重要的一个类。因为它本身没有加密,所以它可能是黑客的第一个目标。如果已经攻克了相关的解密密钥和算法,那么加密的类就可以很容易地被解密。

3。转换为本机代码

将程序转换为本机代码也是防止反编译的有效方法。因为本机代码通常很难被反编译。开发人员可以将整个应用程序转换为原生代码,也可以只转换关键模块。如果只是转换模块的关键部分,Java程序在使用这些模块时需要JNI技术调用。在使用这种方法保护Java程序时,它放弃了Java的跨平台特性。对于不同的平台,我们需要维护不同版本的原生代码,这会增加软件支持和维护的工作量。但对于一些关键模块,有时这种方案往往是必要的。为了保证这些原生代码不会被修改或替换,开发人员经常需要对这些代码进行数字签名。在使用这些原生代码之前,开发者往往需要对这些本地代码进行认证,以确保这些代码没有被黑客篡改。如果签名检查通过,则开发者可以调用相关的JNI方法。

4。代码混淆

代码混淆是对Class文件进行重新组织和处理,使处理后的代码与未处理的代码完成相同的功能(语义)。但是混淆后的代码很难反编译,即反编译后的代码很难理解,因此反编译人员很难理解真正的语义。理论上,如果黑客有足够的时间,混淆代码仍有可能被破解。甚至有些人正在开发去混淆工具。但从实际情况来看,由于混淆的多元化发展,混淆理论的成熟,Java代码混淆后可以很好地防止反编译。

5。在线加密

APK Protect 是 APK 的在线加密网站,但显然自 2013 年左右以来活动已停止。提供Java代码和C++代码保护,实现反调试和反编译效果。

我最初建议您使用最后一种方法,因为它可以为您节省更多时间。根据我的经验,操作非常简单,不会花很长时间。

【讨论】:

APKProtect 依赖于 android smali 反编译器中的错误:它在应用程序中发生变化,使反编译器崩溃并且不生成源代码。因此,APKProtect 将一直工作,直到反编译器目标错误得到纠正。在此处查看比较:youtube.com/watch?v=t7M4AK1vZPA 使用 APK Protect 工具加密 apk 后,我无法再在我的设备或模拟器中安装此加密 apk。它给了我 INVALID_CERTIFICATE 之类的错误。如何解决? YouDroid,我在使用 ApkProtect Pc 时遇到了同样的问题。但检查你的安卓版本。 ApkProtect 目前仅适用于 2.1-4.2 android 版本。见:apkprotect.com @YuDroid 你必须重新手动重新调整你的 apk:developer.android.com/tools/publishing/… 您为 APK Protect 提供的链接无效。!!还有其他建议吗?【参考方案2】:

现在有了 Jellybean,这已成为可能。

$ openssl enc -aes-128-cbc -K 000102030405060708090A0B0C0D0E0F 
-iv 000102030405060708090A0B0C0D0E0F -in my-app.apk -out my-app-enc.apk

$ adb install --algo 'AES/CBC/PKCS5Padding' --key 000102030405060708090A0B0C0D0E0F 
--iv 000102030405060708090A0B0C0D0E0F my-app-enc.apk
        pkg: /data/local/tmp/my-app-enc.apk
Success

请阅读以下博客文章以获取更多信息details

【讨论】:

我在我的 Windows 机器上安装了 openssl-0.9.8 并用我的 apk 尝试了上述命令。但它总是说error in enc。可能是什么问题?【参考方案3】:

如果这是不能落入用户手中的机密信息,则您无法保护它。根本不可能将信息(代码或数据)放在设备上,并让您的应用程序访问它,但不允许使用该设备的人访问该信息。

从安全的角度来看,加密信息是没有意义的,因为您的应用程序必须包含解密所需的任何内容才能使用它,并且有充分动机的攻击者总是可以提取并自行解密。

您所能做的就是让访问该信息变得更加烦人和耗时,这只有在没有太多需要保密的情况下才有帮助。这就是使用 proguard 来混淆 .apk 文件可以做到的事情。

【讨论】:

对不起,但有趣的是它使代码更容易理解(proguard):) 我测试它 我很少使用 proguard,然后只是去除了 Scala 或 Mercury 标准库中不必要的部分,因此用 Scala 或 Mercury 编写的程序能够被翻译成 Android。但我相信它确实具有“混淆”选项,可以破坏类/变量名称并去除可能对逆向工程有用的其他信息。如果您发现 proguard 输出比输入源代码更易于阅读,我怀疑您没有打开它们。【参考方案4】:

你考虑过 sqlite 加密吗?看到这个线程 - sqlite encryption for android

至于保护您的 .apk,请尝试使用 proguard 混淆您的代码。见http://developer.android.com/guide/developing/tools/proguard.html

【讨论】:

对不起,但有趣的是它使代码更容易理解(proguard):) 我测试它 Same results.it seams proguard 适用于新手...用于学习解码代码。【参考方案5】:

你可以试试'Anti Decompiler(Android)Trial'

https://play.google.com/store/apps/details?id=com.tth.AntilDecompilerTrial

它做出了 Proguard 没有的东西:

隐藏所有 const 值(字符串、字符),您将永远不会在您的 apk 文件中看到诸如“my key”、“my val”之类的明文 混淆文件名,在AndroidManifest.xml中引用 在您的源代码中添加虚假代码。事件强大的反编译器喜欢:dex2jar,jd-gui,...无法完全反转您的 apk 文件。大多数功能将显示注释“错误”。

=====

转换后,如果您将源项目提供给某人,则几乎无法阅读和理解。 此解决方案不排除 Proguard,您可以将它们组合在一起。 (Proguard 的功能、字段混淆优于本方案的混淆功能)

【讨论】:

【参考方案6】:

您可以阅读我的帖子:http://www.androidpit.com/en/android/forum/thread/567093/An-Analysis-of-Android-APK-Protect-Shell-APKProtect。加上APK Protect的保护壳的APK似乎无法反编译。我的意思是,加密方法非常先进。就算是黑客大师也需要很长时间才能破解。

【讨论】:

APKProtect 依赖于 Android smali 反编译器中的错误:它在应用程序中发生变化,使反编译器崩溃并且不生成源代码。因此,APKProtect 将一直工作,直到反编译器目标错误得到纠正。在此处查看比较:youtube.com/watch?v=t7M4AK1vZPA【参考方案7】:

如果是包含敏感数据的数据库,您可以像其他答案中提到的那样加密几列或整个数据库的值,并确保密码不存储在设备上,但必须由用户输入访问数据。

如果有一些代码需要保护,那么确实没有保护它的好方法。对于有限数量的用例,您所能做的就是创建对在线服务的依赖关系并保护服务器。但是对于很多应用程序来说,这不是一个选择。

【讨论】:

【参考方案8】:

首先,制作一个永远不能修改和使用的apk。我通过服务器的脾气检测来做到这一点。我使用root检查模拟器检查。然后在重要的活动上,它会在每次 oncreate 和 resume 时检查 root 和模拟器,在 onpause 时删除重要数据,太好了。现在加密数据并将许可证放置在服务器上,使用 SSL 服务器。它的应用程序无法修改和运行,一切都永远安全。那么,如何避免反编译器和在线篡改检测。我确实放置了一个巨大的代码来从 apk 文件生成一些示例字符串,并将其与放置在服务器上的 apk 副本进行比较。我已将 apk 文件转换为字符串。尽情享受吧。

【讨论】:

以上是关于如何使 apk 安全。防止反编译的主要内容,如果未能解决你的问题,请参考以下文章

Android如何防止apk程序被反编译

反编译Android APK及防止APK程序被反编译

android app怎么防止反编译

安卓反编译出来的代码如何修改重新生成APK

反编译apk工具,apk反编译工具Jadx的使用

app加固apk文件防止反编译获取dex 原理