【笔记】Android逆向 学习笔记
前言
Android逆向工程学习笔记
APK 文件结构
assets
- 不经过aapt编译的资源文件
lib
- 动态链接库,存放
.so文件
META-INF
- 文件摘要,摘要加密和签名证书文件目录
CERT.RSA
- 公钥和加密算法描述
CERT.SF
- 加密文件,它是使用私钥对摘要铭文加密后得到的密文信息,只有使用私钥配对的公钥才能解密该文件
MANIFEST.MF
- 程序清单文件,它包含包中所有文件的摘要明文
res
- 资源文件目录,二进制格式
drawable
- 图片资源
layout
- 布局资源
menu
- 菜单资源
resources.arsc
- 经过aapt编译过的资源文件
classes.dex
- 可执行文件
AndroidManifest.xml
- 配置文件
APK 打包流程
- 打包资源文件,生成
R.java和resources.ap_文件 - 处理AIDL文件,生成对应的
.java文件 - 编译Java文件,生成对应的
.class文件 - 把
.class文件转化成Cavik VM支持的.dex文件 - 打包生成未签名的
.apk文件 - 对未签名的
.apk文件进行签名 - 对签名后的
.apk文件进行对齐处理
APK 安装流程
安装方式
系统程序
- 系统程序安装
用户程序
安装包手动安装
通过应用市场安装
通过ADB安装
安装过程
- 复制APK安装包到
/data/app目录下,解压并扫描安装包 - 把
dex文件保存到/data/dalvik-cache目录 - 在
/data/data目录下创建对应的应用数据目录
目录结构
/system/app
- 系统自带的应用程序,需要
root权限才能删除
/data/app
- 用户程序安装的目录,安装时把apk文件复制到此目录
/data/data
- 存放应用程序的数据
/data/dalvik-cache
- 将
apk中的dex安装到dalvik-cache目录下
卸载过程
- 删除安装过程中在上述三个目录下创建的文件及目录
APK 反编译与回编译
- 先查壳,再反编译看验证
.dex文件转化为.smali文件,反编译工具apktool- 去除广告和弹窗,撇开不存在于
smali的这种情况,容易的就是可以XML中找到Activity,难得就是找不到,发生这种情况时,就要分析代码,程序逻辑,抓住关键信息、界面和函数
MacOS 下的反编译
准备工作
- Apktool
1 | brew install apktool |
- dex2jar
1 | brew install dex2jar |
- JD-GUI
1 | brew cask install jd-gui |
反编译 apk 文件
- 使用
apktool命令反编译.apk文件
<name>:.apk文件
1 | apktool d <name> |
反编译 dex 文件
- 直接解压缩
.apk文件,或者使用apktool命令回编译刚刚反编译的目录
<directory>:反编译的目录
1 | apktool b <directory> |
- 使用
d2j-dex2jar命令,反编译.dex文件
1 | d2j-dex2jar classes.dex |
- 使用
JD-GUI软件打开.jar文件