一:apk是啥?
在我的理解来看,apk文件更像是一个zip包。在windows上面可以直接将后缀名.apk改为.zip。然后解压出来,目录结构大概是这样子的:
不过可能不同的apk,里面的目录不尽相同。当然了,不用我说大家应该也都知道,这文件直接打开肯定是看不懂,所以我这里就不把打开后的文件截图贴出来了。
二:这解压出来的这些又是什么鬼?
AndroidManifest.xml:应用的全局配置文件
assets:原始资源文件夹,对应着Android工程的assets文件夹,一般用于存放原始的网页、音频等等,与res文件夹的区别这里不再赘述,可以参考上面介绍的两篇文章。
classes.dex:源代码编译成class后,转成jar,再压缩成dex文件,dex是可以直接在Android虚拟机上运行的文件。
lib:引用的第三方sdk的so文件。
META-INF:Apk签名文件。
res:资源文件,包括了布局、图片等等。
resources.arsc:记录资源文件和资源id的映射关系。
当然了,这个肯定不是我自己瞎蒙的。是从别人那里“借鉴”来的。如果想进一步理解apk到底是个啥,可能需要去了解一下apk的具体构建过程。因为自己对这一块理解也不深刻,这里找到一篇文章,大家有兴趣可以看一看:Android构建过程分析
三:反编译三件套
现在发编译的工具有很多,比如android-classyshark,AndroidGuard,Android-Crack-Tool(Mac专属)。但是我权衡了一下,最终还是决定采用比较常规的三件套的方式。因为毕竟是一个学习的过程,首选肯定是流行并且常用的工具。
工具介绍:
1.apktool
作用:资源文件获取,可以提取出图片文件和布局文件进行使用查看
2.dex2jar
作用:将apk反编译成java源码(classes.dex转化成jar文件)
3.jd-gui
作用:查看apk中classes.dex转化成出的jar文件,即源码文件
四:反编译流程
1.apk反编译得到程序的源代码、图片、XML配置、语言资源等文件
使用apktool,至于下载链接,CSDN上面就有,然后将需要反编译的apk和apktool放到同一个文件夹里面,就像这样:
然后再当前文件夹命令行执行:
你的apk名字是啥,这里就应该写啥。然后就会出现一个以你apk名字命名的文件夹。里面打开我这里是这样子的:
有些对这个有了解过的朋友,对smali肯定比较眼熟,上图里面的smali文件夹直接打开,里面的文件结构和目录跟原始的java文件目录是一致的。不过里面的文件并不是我们熟悉的java代码,这里我对smali做一些简单的解释。
Android虚拟机Dalvik并不是执行java虚拟机JVM编译后生成的class文件,而是执行再重新整合打包后生成的dex文件,dex文件反编译之后就是smali代码,可以说,smali语言是Dalvik的反汇编语言,他也是有自己的语言格式和一整套语言体系,但是我并没有较多的了解,所以这里不打算展开来讲。
(tip:Smali是冰岛语中编译器的叫法,也许你会问为什么是冰岛语,因为Dalvik是一个冰岛渔村名字。看了阿根廷对冰岛之后对冰岛也是比较感兴趣,所以这里插一句......)
然后现在得清单文件打开显示是这样子的(很清晰明了的格式):
有一部分我打码了,但是其实这些打码的地方也都是可以看到的。
现在的res里面的布局显示是这样的,也是可以直接看到的(这里我是直接用notepad打开的,没有格式化):
2.apk反编译得到Java源代码
(tip:这一步步骤比较繁琐,如果不是自己想要去反编译的话,可以跳过这里,直接结果)
将下载好的dex2jar和jd-gui,解压。将要反编译的apk,后缀改成.zip。然后解压打开,上面展示过这个目录,里面会有一个classes.dex。然后将这个classes.dex文件放到刚刚解压出来的dex2jar-2文件夹里面,就是这个文件夹(dex2jar-2.0.zip解压出来之后的文件夹):
里面会有一大堆的命令文件,然后把classes.dex文件放到这个文件夹里面。就像这样:
然后在当前文件夹打开命令行,执行:
然后会生成一个classes-dex2jar.jar的文件夹:
然后你以为在这里就结束了吗。哈哈,其实并没有,刚刚我们介绍的三件套只用了两个,最后还有一个jd-gui没用到
3.使用jd-gui打开classes-dex2jar.jar查看源码
解压jd-gui文件之后里面会有一个jd-gui.exe。直接然后用这个东西打开上一步拿到的classes-dex2jar.jar。
这里也是比较清晰的能看到,但是有些地方并不是那么合情合理,可能是因为一些混淆的原因。至于混淆和反混淆的,这一部分内容也比较繁多,所以打算到下一篇博客再去详述。
五:总结
最后总结一下,apktool主要是负责获取manifest清单文件,以及res里面的xml配置文件。dex2jar根据名字就可以看出来,就是将dex文件转成jar文件。jd-gui从名字其实也可以猜到,GUI--->Graphical User Interface,图形用户接口,用来打开上一步得到的jar文件(图形化界面)。
但是其实还是有很多小问题的,比如怎么样才能够完美的得到源码,而不是掺杂一些混淆之后的东西。比如jd-gui获取到的class文件能否一键导出或者能不能直接转成java文件运行起来?比如目前这个apk其实很明显主要的功能代码并不在我通过上述步骤得到的可视化的界面里面显示(也许是使用jar和aar的原因?如何解决?总不能一个个去拆解吧)等等,这个也算是给自己留几个坑吧。边学习边思考。
本来之前是打算写一些技术类的文章,但是鉴于我司大佬实在太牛*了,不敢班门弄斧。所以就做了这个反编译公司软件的总结和分享吧。算是自己第一次做反编译apk,做起来还是碰到了很多问题,但是也都解决的七七八八,最后也算是勉强完成了。如果上述的问题各位大佬有答案,不吝赐教。谢谢阅读。