以微信安装包为例讲解:
右击APK文件,以压缩包方式打开,截图如下:
源码存放在classes.dex文件中。我们可以直接查看res下面的图片文件,但对于源代码无法查看,AndroidManifest.xml清单等xml文件打开也是乱码。
需要用到的工具包dex2jar、jd-gui、apktool。
1、 查看源码
(1) 修改安装包文件.apk为.zip后缀解压,记录classes.dex的路径。
(2)cmd定位至工具包中的dex2jar,在命令行运行如下:
结果会在classes.dex所在目录下生成classes_dex2jar.jar,用jd-gui.exe打开此文件,如下:
从中我们可以大致了解代码结构,虽然源码经过proguard混淆后可读性很差,但还是可以通过关键字(不可混淆的类名等)查找获取到一定的信息。不过jd-gui无法通过源码查找,只支持查找类型、构造函数、常量、属性、方法。
2、查看资源文件和xml文件
(1)下载apktool及对应平台的依赖包,解压后将平台依赖包中的apktool.jar复制到apktool目录下),在命令行运行 命令行:
apktool
.
bat
d
-
f
xxx
.
apk
xxx
其中d表示解包,xxx.apk为待反编译apk路径,xxx为目标文件夹名,(apktool不支持中文目录),如下:
结果会在apktool.bat所在目录下生成weixin文件夹,现在就可以正确的查看xml资源(包括res下的所有资源,如点9图片、drawable、layout、value、menu等等)了,比如AndroidManifest.xml
3、修改后重新打包成APK
依然使用步骤2中的apktool,命令如下 :
apktool
.
bat
b
xxx
其中b表示build,xxx表示步骤2中解包出来的文件夹,我们可以对某一文件进行修改,重新打包
打包完成后会在xxx目录下生成build和dist两个文件夹,dist存放重新生成的APK,build存放该APK的具体组成信息。
小Tips
1. 利用图片的名称对apk破解后的资源文件进行整体搜索。通过Apktool可以得到一堆资源文件。然后Copy到Eclipse的某个工程中。进行搜索,最最有效率的方式(还记得快捷键吧Ctr+H)。
2. 利用R.java文件中的id号, 将得到的源文件进行搜索. 这个时候, 基本上所使用的元素的位置基本上清楚了。
3. 当无法定位Activity对应的Layout在哪里时, 这个时候需要用到hierarchyViewer去查看布局。然后结合1和2的信息做交叉理解。(很有必要提及的问题, hierarchyViewer里面涉及的布局, 并非跟Layout的xml完全一致, 在hierarchyViewer中,很容易看到GridView中居然可以包含一个LinearLayout, 这个实际上在XML中,是不允许这样描述的。一般Android是在源码中实现一个GridView包含一个LinearLayout的, 这个时候,不得不利用到上文1和2描述的方法交叉定位).