我正在尝试制作一个安全的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文件和清单就没有显示出来。我也想像这样保护我的应用程序。这怎麽可能?
发布于 2014-12-18 23:21:38
要回答您的问题,根本不可能使您的APK完全安全。XML文件是很容易被解析而没有apktool。
我问了Ben /JesusFreke(开发smali的人),他说要完全保护APK文件是不可能的,但是你可以让其他人更难解压缩。只要Android能够读取项目中的资源/代码。那么工具也可以。
在对Gmail进行反编译时,您看到的例外情况是,apktool需要为Lollipop (正在积极地研究)进行更新。
abc是我发现的使APK更难解压缩的最佳方法:
基本上,有5种方法可以保护您的APK破解/逆转/重新打包:
最简单的方法是使用户无法访问Java程序。这是最基本的方式,它有多种具体的方式来实现这一点。例如,开发人员可以将关键的Java类放在服务器上,客户端通过访问服务器的相关接口来获取服务,而不是直接访问Class文件。因此,黑客无法对类文件进行反编译。目前,通过HTTP、Web服务、RPC等接口提供的标准和协议服务越来越多,但也有很多应用程序不适合这种保护。例如,独立程序中的Java程序无法隔离.
为了防止类文件被直接解压缩,许多开发人员会对一些关键的类文件进行加密,如注册号、序列号管理和其他相关类。在使用这些加密类之前,程序需要先解密这些类,然后将这些类加载到JVM中。这些类可以通过硬件或软件解密。
开发人员通常通过定制的ClassLoader类加载加密类(Applet由于安全性原因不支持定制的ClassLoader )。自定义的ClassLoader将首先找到加密类,然后解密它们。最后,将解密的类加载到JVM中。自定义ClassLoader是此保护方法中一个非常重要的类。因为它本身没有加密,所以它可能是黑客的第一个目标。如果克服了相关的解密密钥和算法,那么加密的类就可以很容易地解密。
将程序转换为本机代码也是防止反编译的有效方法。因为本地代码通常很难被解压缩。开发人员可以将整个应用程序转换为本机代码,也可以只转换关键模块。如果只是转换模块的关键部分,当Java程序使用这些模块时,就需要JNI技术来调用。在使用这种方法保护Java程序时,它放弃了Java的跨平台特性。对于不同的平台,我们需要维护不同版本的本机代码,这将增加软件支持和维护工作量。但是对于一些关键模块,有时这种解决方案是必要的。为了保证这些本机代码不会被修改或替换,开发人员通常需要对这些代码进行数字签名。在使用这些本地代码之前,开发人员通常需要对这些本地代码进行身份验证,以确保这些代码不会被黑客更改。如果通过了签名检查,那么开发人员就可以调用相关的JNI方法。
代码混淆是对类文件进行重新组织和处理,使处理后的代码与未处理的代码完成相同的功能(语义)。但是模糊码很难被分解,即反编译码很难理解,因此反编译人员很难理解真正的语义。理论上,如果黑客有足够的时间,混淆的代码可能仍然会被破解。甚至有些人也在开发去模糊化工具。但从实际情况来看,由于混淆理论的多样化发展,混淆理论的成熟,混淆Java代码可以很好地防止反编译。
APK保护是一个用于APK的在线加密网站。它提供了Java代码和C++代码的保护,实现了抗调试和反编译的效果.操作简单,操作简便。
我建议你使用最后一种方法,因为它可以节省你更多的时间。我试过了。这是非常简单的操作,它不会花很长的时间。
https://stackoverflow.com/questions/27541166
复制相似问题