我正在尝试制作一个安全的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文件和清单。我也希望像这样保护我的应用程序。这怎么可能?
答案 0 :(得分:1)
要回答您的问题,根本不可能让您的APK完全安全。 XML文件是easily parsed without apktool。
我问Ben Gruver / JesusFreke(开发smali的人),他说完全保护APK文件是不可能的,但是你可以让其他人更难反编译。只要Android可以读取项目中的资源/代码,那么工具也可以。
您在尝试反编译Gmail时遇到的异常是因为需要为Lollipop(which is actively being working on)更新apktool。
answer by @classc_abc是我发现的最好的反编译APK:
基本上,有5种方法可以保护您的APK正在破解/ 倒车/重新包装:
- 隔离Java程序
醇>最简单的方法是让用户无法访问Java类 程序。这是最基本的方式,它有各种各样的方式 实现这一目标的具体方法。例如,开发人员可以放置 服务器上的密钥Java类,客户端通过访问获取服务 服务器的相关接口,而不是访问类文件 直。因此,黑客无法反编译类文件。 目前,有越来越多的标准和协议服务 通过接口提供,如HTTP,Web服务,RPC等。但是 有很多应用程序不适合这种保护。 例如,独立程序中的Java程序无法执行 隔离。
- 加密类文件
醇>为防止类文件被直接反编译,许多开发人员 将加密一些关键的Class文件,如注册号,序列号 号码管理和其他相关课程。在使用这些之前 加密类,程序需要先解密这些类, 然后将这些类加载到JVM中。这些类可以解密 硬件或软件。
开发人员经常通过自定义加载加密类 ClassLoader类(Applet不支持自定义的ClassLoader 因为安全)。 Customed ClassLoader将找到加密 首先是类,然后解密它们。最后加载解密 JVM的类。 Customed ClassLoader是一个非常重要的类 保护方法。因为它本身没有加密,所以它可能是 黑客的第一个目标。如果是相关的解密密钥和算法 已经克服,然后加密类很容易 解密。
- 转换为本机代码
醇>将程序转换为本机代码也是一种有效的预防方法 反编译。因为本机代码通常很难 反编译。开发人员可以将整个应用程序转换为本机 代码,或者它们也可以仅转换关键模块。如果只是转换键 部分模块,Java需要JNI技术才能调用 程序正在使用这些模块。它放弃了Java的跨平台 使用此方法保护Java程序时的功能。对于不同的 平台,我们需要维护不同版本的本机代码, 这将增加软件支持和维护工作量。但对于 一些关键模块,有时这种解决方案通常是必要的。为了 保证不会修改或替换这些本机代码, 开发人员通常需要对这些代码进行数字签名。使用前 这些本机代码,开发人员通常需要对这些本地代码进 代码,以确保黑客不会改变这些代码。如果 签名检查通过,然后开发人员可以调用相关的JNI 方法
- 代码混淆
醇>代码混淆是重新组织和处理类文件,使得 处理过的代码与...完成相同的功能(语义) 未经处理的代码。但是混淆的代码很难 反编译的,即反编译的代码非常难以实现 了解,因此反编译人员很难理解 真的是语义学。从理论上讲,如果黑客有足够的时间, 混淆的代码可能仍然被破解。甚至有些人正在发展 去混淆工具。但从实际情况来看,自此以来 混淆的多样化发展,混淆的成熟 理论上,混淆的Java代码可以很好地防止反编译。
- 在线加密
醇>APK Protect是APK的在线加密网站。它提供Java 代码和C ++代码保护实现反调试和反编译 效果。操作过程简单易行。
我建议您使用最后一种方法,因为它可以为您节省更多时间。我&#39;已经 试过。操作非常简单,不会花很长时间。