Android的应用程序Apk文件是一个压缩文件,可以通过解压获得里面的文件内容。我们找来一个Apk文件(这里用的是app-release.apk),然后使用普通解压工具(如WinRAR、360解压等)直接解压app-release.apk,可以得到文件夹app-release,工作目录如下:
进入文件夹app-release,目录如下,可以看到许多熟悉的东西:
但是你会发现资源文件等xml文件基本无法打开,即使能打开也是如下图的乱码,这些乱码就是Android加密过的文件:
既然直接解压Apk文件是无法获得正常的应用程序,那么来看看如何使用正确的方法反编译应用程序。
首先请出三个重量级的工具,如下:
这三个工具分别负责反编译不同的部分。
9.5.3.1 apktool
首先来反编译apk中的XML文件,利用apktool_2.3.3.jar。进入工具目录,执行命令:
java -jar apktool_2.3.3.jar d -f app-release.apk
得到输出文件:
这时候打开res中的xml文件:
此时可以正确地查看这些XML文件而不是之前的乱码了。这个工具在汉化软件的时候非常有用,可以提取资源文件并进行汉化,然后执行如下命令重新打包回去即可:
java -jar apktool_2.3.3.jar b app-release
重新打包的命令与解码的命令相似,只是将d改为b,并选择前面解码生成的文件夹。执行该命令后,在文件夹下就会生成两个新的文件夹,如下图所示dist和build文件夹,重新打包的APK就在dist目录下:
下一步,解决Source Code。
9.5.3.2 Dex2jar、jd-gui
先回到最开始用解压缩工具解压apk后的那个文件夹,文件夹中有一个非常重要的文件,如下图的dex文件:
这个文件就是源代码打包后的文件,将它复制到dex2jar-0.0.9.15的根目录下,然后进入dex2jar-0.0.9.15的目录并执行下面第二张图的代码:
d2j-apk-sign.bat classes.dex
cmd上会开始分析,分析完毕后,在dex2jar-0.0.9.15的目录目录下生成了一个jar文件:
到这里,打开jd-gui,选择file-open file,并选择刚刚生成的classes-dex2jar.jar文件,即可查看相关源代码:
总结思路:
使用apktool将apk反编译成文件夹,
再重新打包生成build和dist目录以及相关文件(包括classes.dex),
使用Dex2jar将classes.dex分析生成jar文件,
对jar文件使用jd-gui即可查看相关的源代码。
9.5.4 Android Apk 加密
由于Java字节码的特殊性,使得它非常容易被反编译。因此,为了能够对编译好的Java Class文件进行一些保护,通常会使用ProGuard来对Apk进行混淆处理,用无意义的字母来重命名类、字段、方法和属性。当然,ProGuard不仅仅可以用来混淆代码,还可以删除无用的类、字段、方法和属性,以及删除没用的注释,最大限度地优化字节码文件。
在Android Studio中,打开app目录下的build.gradle文件:
**这里的minifyEnabled属性就是控制ProGuard的开关,将即设置为true,即可开启混淆功能,在使用AS导出apk时,即可生成混淆。
网友评论