8

我正在尝试制作一个安全的 android 应用程序。我在我的应用程序中启用了proguard。但它在反编译时不会隐藏任何 xml 文件或清单。它只会更改 .java 文件。

我尝试使用apktool从 Play 商店反编译另一个应用程序的 apk 。然后我得到了以下异常

Exception in thread "main" brut.androlib.AndrolibException: brut.directory.Direc
toryException: java.util.zip.ZipException: error in opening zip file
        at brut.androlib.ApkDecoder.hasSources(ApkDecoder.java:199)
        at brut.androlib.ApkDecoder.decode(ApkDecoder.java:83)
        at brut.apktool.Main.cmdDecode(Main.java:146)
        at brut.apktool.Main.main(Main.java:77)
Caused by: brut.directory.DirectoryException: java.util.zip.ZipException: error
in opening zip file
        at brut.directory.ZipRODirectory.<init>(ZipRODirectory.java:55)
        at brut.directory.ZipRODirectory.<init>(ZipRODirectory.java:38)
        at brut.androlib.res.util.ExtFile.getDirectory(ExtFile.java:55)
        at brut.androlib.ApkDecoder.hasSources(ApkDecoder.java:197)
        ... 3 more
Caused by: java.util.zip.ZipException: error in opening zip file
        at java.util.zip.ZipFile.open(Native Method)
        at java.util.zip.ZipFile.<init>(Unknown Source)
        at java.util.zip.ZipFile.<init>(Unknown Source)
        at brut.directory.ZipRODirectory.<init>(ZipRODirectory.java:53)
        ... 6 more

然后没有显示xml文件和清单。我也想像这样保护我的应用程序。这怎么可能?

4

1 回答 1

1

要回答您的问题,根本不可能使您的 APK 完全安全。无需 apktool即可轻松解析 XML 文件。

我问过 Ben Gruver/JesusFreke(开发 smali 的人),他说完全保护 APK 文件是不可能的,但你可以让其他人更难反编译。只要Android可以读取您项目中的资源/代码..那么工具也可以。

您在尝试反编译 Gmail 时看到的异常是因为需要为 Lollipop 更新 apktool(正在积极开发中)。

@classc_abc的答案是我发现的最好的答案,它使反编译 APK 变得更加困难:

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

  1. 隔离 Java 程序

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

  1. 加密类文件

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

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

  1. 转换为本机代码

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

  1. 代码混淆

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

  1. 在线加密

APK Protect 是 APK 的在线加密网站。提供Java代码和C++代码保护,达到反调试和反编译效果。操作过程简单易行。

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

于 2014-12-18T23:21:38.393 回答