Introduction
本文简单介绍了如果使用dex2jar和jd-gui来反编译apk,查看其源码。
补充了jadx工具的使用
1. 工具和环境
本文的环境为Debian 9 x86_64,使用的工具:
dex2jar 作用:将apk反编译成java源码(classes.dex转化成jar文件)
JD GUI 作用:查看APK中classes.dex转化成出的jar文件,即源码文件
jadx:综合上面两个工具的作用,可以直接拖进apk,然后查看其源码,但是功能不如jdgui完善。
2. apk分析
apk文件的本质是压缩文件,可直接用解压缩软件以zip的形式解压。
文件、文件夹 | 内容 |
---|---|
assets文件夹 | 原始资源文件夹,对应着Android工程的assets文件夹,一般用于存放原始的图片、txt、css等资源文件。 |
lib | 存放应用需要的引用第三方SDK的so库。比如一些底层实现的图片处理、音视频处理、数据加密的库等。而该文件夹下有时会多一个层级,这是根据不同CPU 型号而划分的,如 ARM,ARM-v7a,x86等。 |
META-INF | 保存apk签名信息,保证apk的完整性和安全性。 |
res | 资源文件夹,其中的资源文件包括了布局(layout),常量值(values),颜色值(colors),尺寸值(dimens),字符串(strings),自定义样式(styles)等。 |
AndroidManifest.xml文件 | 全局配置文件,里面包含了版本信息、activity、broadcasts等基本配置。不过这里的是二进制的xml文件,无法直接查看,需要反编译后才能查看。 |
classes.dex文件 | 这是安卓代码的核心部分,,dex是在Dalvik虚拟机上可以执行的文件。这里有classes.dex和classes2.dex两个文件,说明工程的方法数较多,进行了dex拆分。 |
resources.arsc文件 | 记录资源文件和资源id的映射关系。 |
3. 将dex文件转换成jar包
下载的dex工具包直接解压即可,处理上一步解压出来的classes.dex
文件
./dex2jar-2.1-SNAPSHOT/d2j-dex2jar.sh ./classes.dex
将生成一个classes-dex2jar.jar
文件,用java -jar jd-gui.jar classes-dex2jar.jar
打开jar包,即可看到反编译后的源码:
这里会看到大量的a.a,b.b等无意义命名,代码及其难懂。。不过好在jdgui可以点击类名进行跳转,一定程度上减少了工作量。
4. jd gui的使用
jdgui可用的功能比较简单,但都很实用。
search里可以对整个项目的代码进行搜索,但是他搜索的功能有限,最好搜索单词,不要搜索net.findhao等带标点符号的关键词,如要搜索带标点符号的关键词,先用jd导出源码,会生成源码文件夹,然后用vscode or sublime等打开文件夹进行搜索。
5. jadx
https://github.com/skylot/jadx
直接将apk拖入即可自动打开并完成前面的dex2jar和jdgui的功能。
但是一些小功能不如jdgui完善。
Comments