反编译apk时出现异常

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文件和清单没有被公开。我也希望像这样保护我的应用程序。这有可能吗?


你尝试反编译哪个应用程序导致了这个异常? - Jared Rummler
可能是重复问题:https://dev59.com/9G025IYBdhLWcg3wEhjr 值得一看。 - Jared Rummler
@JaredRummler 我已经使用 Gmail apk 进行了测试。 - Deepzz
所以,我刚刚尝试使用最新版本的apktool反编译最新的Gmail APK,并得到了一个不同的异常。看起来他们正在努力修复:https://code.google.com/p/android-apktool/issues/detail?id=635。这对于使APK文件无法/更难被反编译看起来很有前途:http://www.apkprotect.com/ - Jared Rummler
1个回答

1
为了回答您的问题,完全保护您的APK是不可能的。XML文件可以轻松地使用apktool解析
我问过Ben Gruver / JesusFreke(开发smali的人),他说要完全保护APK文件是不可能的,但是您可以使其更难反编译。只要Android能够读取项目中的资源/代码,那么工具也能读取。
尝试反编译Gmail时出现的异常是因为apktool需要更新以支持Lollipop(正在积极进行中)。 @classc_abc给出的答案是我找到的最好的方法,用于使APK更难被反编译。
基本上,保护 APK 免受破解/反编译/重新打包的方法有 5 种:
1. 隔离 Java 程序
最简单的方法是使用户无法访问 Java 类程序。这是最基本的方法,有多种具体方法可以实现。例如,开发人员可以将关键 Java 类放在服务器上,客户端通过访问服务器相关接口而不是直接访问类文件来获取服务。因此,黑客无法反编译类文件。目前,越来越多的标准和协议服务通过接口提供,例如 HTTP、Web Service、RPC 等等。但是,很多应用程序不适合这种保护方式。例如,独立程序中的 Java 程序无法隔离。
2. 加密类文件
为了防止类文件被直接反编译,许多开发人员会加密一些关键的类文件,例如注册号、序列号管理和其他相关类。在使用这些加密类之前,程序需要先解密这些类,然后将这些类加载到 JVM 中。这些类可以通过硬件或软件进行解密。
开发人员通常通过自定义的 ClassLoader 类(Applet 不支持自定义的 ClassLoader,因为涉及安全问题)加载加密类。自定义的 ClassLoader 将首先查找加密类,然后对其进行解密。最后将解密后的类加载到 JVM 中。自定义的 ClassLoader 是此保护方法中非常重要的类。因为它本身没有被加密,所以可能成为黑客的第一个目标。如果相关的解密密钥和算法已经被攻破,那么加密的类可以很容易地被解密。
3. 转换为本地代码
将程序转换为本地代码也是一种有效的防止反编译的方法。因为本地代码通常很难被反编译。开发人员可以将整个应用程序转换为本地代码,也可以只转换关键模块。如果只转换了部分关键模块,则在 Java 程序使用这些模块时需要使用 JNI 技术进行调用。当使用此方法保护 Java 程序时,放弃了 Java 的跨平台特性。对于不同的平台,我们需要维护不同版本的本地代码,这将增加软件支持和维护工作量。但是对于某些关键模块,有时候这种解决方案是必要的。为了保证这些本地代码不会被修改或替换,开发人员通常需要对这些代码进行数字签名。在使用这些本地代码之前,开发人员通常需要验证这些本地代码,以确保这些代码没有被黑客更改。如果签名检查通过,则开发人员可以调用相关的 JNI 方法。
4. 代码混淆
代码混淆是重新组织和处理类文件,使经过处理的代码实现与未经处理的代码相同的功能(语义)。但是,混淆的代码很难被反编译,即反编译的代码很难理解,因此反编译人员很难理解真正的语义。从理论上讲,如果黑客有足够的时间,混淆的代码仍然可能被破解。甚至有些人正在开发去混淆工具。但从实际情况来看,由于混淆的多样化和混淆理论的成熟,混淆的 Java 代码可以很好地防止反编译。
5. 在线加密
APK Protect 是一个针对 APK

你能提供任何示例应用程序/代码片段来完成这个吗?我已经在各处看到了这个理论。 - Deepzz
基本上,该答案告诉您要创建一个REST API,混淆您的代码(使用Proguard),并使用名为ApkProtect的在线工具,该工具利用了已经或可能被修复的apktool中的错误。没有办法使您的APK可反编译。 - Jared Rummler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接