反编译apk时出现异常

时间:2014-12-18 07:20:54

标签: android exception decompiling apktool

我正在尝试制作一个安全的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文件和清单。我也希望像这样保护我的应用程序。这怎么可能?

1 个答案:

答案 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正在破解/   倒车/重新包装:

     
      
  1. 隔离Java程序
  2.         

    最简单的方法是让用户无法访问Java类   程序。这是最基本的方式,它有各种各样的方式   实现这一目标的具体方法。例如,开发人员可以放置   服务器上的密钥Java类,客户端通过访问获取服务   服务器的相关接口,而不是访问类文件   直。因此,黑客无法反编译类文件。   目前,有越来越多的标准和协议服务   通过接口提供,如HTTP,Web服务,RPC等。但是   有很多应用程序不适合这种保护。   例如,独立程序中的Java程序无法执行   隔离。

         
        
    1. 加密类文件
    2.         

      为防止类文件被直接反编译,许多开发人员   将加密一些关键的Class文件,如注册号,序列号   号码管理和其他相关课程。在使用这些之前   加密类,程序需要先解密这些类,   然后将这些类加载到JVM中。这些类可以解密   硬件或软件。

           

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

           
          
      1. 转换为本机代码
      2.         

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

             
            
        1. 代码混淆
        2.         

          代码混淆是重新组织和处理类文件,使得   处理过的代码与...完成相同的功能(语义)   未经处理的代码。但是混淆的代码很难   反编译的,即反编译的代码非常难以实现   了解,因此反编译人员很难理解   真的是语义学。从理论上讲,如果黑客有足够的时间,   混淆的代码可能仍然被破解。甚至有些人正在发展   去混淆工具。但从实际情况来看,自此以来   混淆的多样化发展,混淆的成熟   理论上,混淆的Java代码可以很好地防止反编译。

               
              
          1. 在线加密
          2.         

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

                 

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