Androidapk反编译查看源码、反编译资源⽂件
反编译代码
要想将APK⽂件中的代码反编译出来,我们需要⽤到以下两款⼯具:dex2jar 和 jd-gui,可以在⽹上⾃⾏下载,这⾥分享下⽹盘下载链接:和
dex2jar 这个⼯具⽤于将dex⽂件转换成jar⽂件
jd-gui 这个⼯具⽤于将jar⽂件转换成java代码
将这两个⼯具都下载好并解压,然后我们就开始对Demo程序进⾏反编译。解压dex2jar压缩包后,你会发现有很多个⽂件,如下图所⽰:
其中我们要⽤到的是d2j-dex2jar.bat这个⽂件,当然如果你是linux或mac系统的话就要⽤d2j-dex2jar.sh这个⽂件。
然后我们将Demo.apk⽂件也进⾏解压,如果不知道怎么直接解压的可以先将⽂件重命名成Demo.zip,然后⽤解压软件打开。解压之后你会发现⾥⾯有⼀个classes.dex⽂件,如下图所⽰:
这个classes.dex⽂件就是存放所有java代码的地⽅了,我们将它拷贝到dex2jar解压后的⽬录下,打开cmd命令窗⼝,切换到解压后
的dex2jar下,输⼊命令:d2j-dex2jar classes.dex
执⾏结果如下图所⽰:
没有报任何错误,这就说明我们已经转换成功了。现在观察dex2jar⽬录,你会发现多了⼀个⽂件,如下图所⽰:
可以看到,classes-dex2jar.jar这个⽂件就是我们借助⼯具之后成功转换出来的jar⽂件了。但是对于我们⽽⾔,jar⽂件也不是可读的,因此这⾥还需要再借助⼀下jd-gui这个⼯具来将jar⽂件转换成java代码。
打开解压后的jd-gui-windows-1.4.0⽂件,双击打开程序,如图
把刚才⽣成的classes-dex2jar.jar这个⽂件直接拖过来,结果如下图所⽰:
OK,由此可见,我们的代码反编译⼯作已经成功了,MainActivity中的代码⾮常清晰,基本已经做到了90%以上的还原⼯作。但是如果想要做到100%的代码还原还是⾮常有难度的,因为像setContentVi
ew()⽅法传⼊的参数,其实就是⼀个资源的id值⽽已,那么这⾥反编译也就只能将相应的id值进⾏还原,⽽⽆法变成像R.layout.activity_main这样直观的代码展⽰。
另外,除了MainActivity之外,还有很多其它的代码也被反编译出来了,因为当前项⽬有引⽤support-v4和support-v7的包,这些引⽤的library也会作为代码的⼀部分被打包到classes.dex⽂件当中,因此反编译的时候这些代码也会⼀起被还原。
好的,学完了反编译代码,接下来我们看⼀下如何反编译资源。
反编译资源
其实细⼼的朋友可能已经观察到了,刚才Demo.apk的解压⽬录当中不是已经有资源⽂件了吗,有l⽂件,也有res⽬录。进⼊res⽬录当中,内容如下图所⽰:
这不是所有资源⽂件都在这⾥了么?其实这些资源⽂件都是在打包的时候被编译过了,我们直接打开的话是看不到明⽂的,不信的话我们打开l⽂件来瞧⼀瞧,内容如下图所⽰:
可以看到,这代码是完全没法阅读的。当然如果你去打开l看看,结果也不会好到哪⼉去:
由此可见,直接对APK包进⾏解压是⽆法得到它的原始资源⽂件的,因此我们还需要对资源进⾏反编译才⾏。
要想将APK⽂件中的资源反编译出来,⼜要⽤到另外⼀个⼯具了:
apktool 这个⼯具⽤于最⼤幅度地还原APK⽂件中的9-patch图⽚、布局、字符串等等⼀系列的资源。
关于这个⼯具的下载我还要再补充⼏句,我们需要的就是apktool.bat和apktool.jar这两个⽂件。⽬前apktool.jar的最新版本是2.3.1,这⾥我就下载最新的了,然后将apktool_2.3.1.jar重命名成apktool.jar,并将它们放到同⼀个⽂件夹下就可以了,如下图所⽰:
接下来的⼯作就很简单了,我们将Demo.apk拷贝到和这两个⽂件同样的⽬录当中,然后cmd也进⼊到这个⽬录下,并在cmd中执⾏如下命令:apktool d Demo.apk
其中d是decode的意思,表⽰我们要对Demo.apk这个⽂件进⾏解码。那除了这个基本⽤法之外,我们还可以再加上⼀些附加参数来控制decode的更多⾏为:
-f 如果⽬标⽂件夹已存在,则强制删除现有⽂件夹(默认如果⽬标⽂件夹已存在,则解码失败)。
-o 指定解码⽬标⽂件夹的名称(默认使⽤APK⽂件的名字来命名⽬标⽂件夹)。
-s 不反编译dex⽂件,也就是说classes.dex⽂件会被保留(默认会将dex⽂件解码成smali⽂件)。
xml文件怎么打开-r 不反编译资源⽂件,也就是说resources.arsc⽂件会被保留(默认会将resources.arsc解码成具体的资源⽂件)。
常⽤⽤法就这么多了,那么上述命令的执⾏结果如下图所⽰:
这就说明反编译资源已经成功了。
当然即使你在和我执⾏⼀模⼀样的操作,也有可能会在这⾥反编译失败,⽐如说会报如下错误:
出现这个错误的原因很有可能是你之前使⽤过apktool的⽼版本进⾏过反编译操作,然后apktool就会在你系统
的C:\Users\Administrator\apktool\framework这个⽬录下⽣成⼀个名字为1.apk的缓存⽂件,将这个缓存⽂件删除掉,然后再重新执⾏反编译命令应该就可以成功了。
现在你会发现在当前⽬录下多了⼀个Demo⽂件夹,这个⽂件夹中存放的就是反编译的结果了。我们可以打开l来瞧⼀瞧,如下图所⽰:
怎么样?这样就完全能看得懂了吧,然后可以再到res/layout中看⼀下l⽂件,如下图所⽰:
可以看到,l中的内容基本和源代码中的内容是⼀致的,外层是⼀个RelativeLayout,⾥⾯则是⼀个Button。你可以再到其它⽬录中去看⼀看别的资源,基本上都是可以正常还原的,这样我们就把反编译资源的⽅法也已经掌握了。
如果你觉得对你有⽤,就点个赞⽀持⼀下吧~ 谢谢啦~