Android 反编译 Apk
环境安装
- apktool:解析 apk 包、获取资源文件和 smail 代码
- dex2jar:逆向 class.dex 文件、得到 jar 包
- jd-gui:查看 jar 包文件里的 java 代码
安装 apktool
Homebrew安装apktool
|
|
下载 dex2jar
dex2jar 主要用于将解压后的 Apk 包中 classes.dex 转换为 classesdex.jar 包便于 jd_gui 查看
- dex2jar 下载地址
dex2jar 使用说明
mac上使用 dex2jar 遇到的权限问题的解决
|
|
或者
|
|
权限提升
|
|
提示 ./d2j_invoke.sh 该文件没有权限
|
|
可以看到 d2j_invoke.sh 这个文件的权限变成了 rwx
|
|
可以看到 原 .dex 文件转换成了 .jar 文件、生成的 classes-dex2jar.jar 在当前目录下
采用
./d2j-dex2jar.sh直接把 apk 文件输出成.jar文件
|
|
下载JD-GUI
jd-gui主要是为了方便查看dex2jar转换的jar文件结构和部分代码
- 解决 macOS JD-GUI 意外退出
Homebrew 安装 jd-gui
|
|
中途需要输入密码、多尝试几次就好了
- 解决
jd-gui不能直接打开.jar文件
|
|
采用 unzip 命令来解压文件、解压出来的就是 .class 文件了、就可以用 jd-gui 来查看了
工具使用
Apktool 反编译和二次打包
- apktool d -f demo.apk -o 存放反编译文件路径
|
|
- apktool b -f 二次打包文件路径 -o demo.apk
|
|
MultiDex 使用
MultiDex 是什么
MultiDex 就是分包、解决项目中 65535 问题
什么是 .dex 文件
Dalvik VM executes : Android Dalvik 虚拟机执行文件
什么是 art
Android Runtime :Android 运行时、Android 4.4 引入
直接对 .apk 文件解压会保留 META-INF 签名信息文件
|
|
采用 ApkTool 工具反编译的文件没有 META-INF 签名信息文件
|
|
apk 解压后的项目结构
- AndroidManifest.xml 配置信息
- META-INF 签名信息
- classes.dex Java 字节码文件
- res 资源文件
- resources.arsc 二进制资源文件
Java 中常见的类加载器
- BootstrapClassLoader:纯 C++ 实现的、没有对应的 Java 类、主要加载 jre/lib/目录下的核心库
- ExtClassLoader:主要加载 jre/lib/ext/ 目录下的扩展包
- AppClassLoader:主要加载 ClassPath 路径下的包
Android 中常见的类加载器
- ClassLoader:加载器 是父委托加载机制
- PathClassLoader:加载 /data/app 目录下的 apk 文件、从这个目录可以看出、PathClassLoader 主要用来加载已经安装过的 apk
- DexClassLoader:加载路径需要在创建 DexClassLoader 时传入、也就是说可以加载任何路径下的 apk/dex/jar
两种分包方案
- Ant:Eclipse 工具
- Gradle:Android Studio 工具
Android Studio 集成 MultiDex
引入依赖和开启multiDex
|
|
重写 attachBaseContext() 方法并调用 MultiDex.install(this) 来启用 Dalvik 可执行文件分包
|
|
配置 manifest 文件
|
|
动态加载分 Dex 思路
- 将 DexClassLoader 插入到 PathClassLoader 和 BootClassLoader 中间
- DexClassLoader 中的 dex 追加到 PathClassLoader 中
| old | 2.0 | 字段说明 |
|---|---|---|
accessToken |token|登录token
organizationCode|orgId|公司ID
organizationName|orgName|公司名称
mobile|userMobile|用户手机
参考文献