一、Jadx
1.1 介绍
GitHub - skylot/jadx: Dex to Java decompiler
jadx是图形化逆向工具,可以直接打开apk、aar、dex、jar等文件,通常用于做java代码静态分析。
1.2 使用
- 1 全局搜索。如果是当前文件搜索:command+f
- 2 前进或后退操作。
- 3 反混淆。 对于开启ProGuard或R8的工程,可以通过点击该按钮自动替换相关混淆的字符串
- 4 设置。打开Show inconsistent code开关,可以查看反编译失败的方法实现,如果不行,配合底部tab的smali、simple来综合看。
- 5 寻找调用者。
- 6 生成frida函数代码并复制。
1.3 常用命令
反编译apk:jadx -d output <可选参数项> xxx.apk
常用的可选参数项:
- --comments-level debug :设置注释级别为debug,以便在反编译的代码中包含详细的调试信息
- --show-bad-code:启用此选项以显示有问题的代码(bad code),并在反编译的代码中标记这些问题区域。
二、apktool
2.1 介绍
GitHub - iBotPeaches/Apktool: A tool for reverse engineering Android apk files
apktool是仅对apk进行逆向的命令行工具,仅支持反编译为smali文件格式,该工具目前通常用于重打包。
2.2 使用
1)反编译为smali工程
apktool d xxx.apk
2)静态smali代码阅读
vscode 插件smalise,支持语法高亮和符号索引,可以比较方便的阅读samli代码。
3)重打包
① 修改完smali代码后,在当前工作目录执行如下命令,会在./dist目录生成对应的apk文件
apktool b .
② 重签名
没有秘钥生成秘钥
keytool -genkeypair -v -keystore <xxx.keystore> -keyalg RSA -keysize 2048 -validity 10000 -alias <name-alias>
输入密钥库口令: xxx
再次输入新口令: xxx
您的名字与姓氏是什么?
[Unknown]: xx
您的组织单位名称是什么?
[Unknown]: xx
您的组织名称是什么?
[Unknown]: xx
您所在的城市或区域名称是什么?
[Unknown]: xx
您所在的省/市/自治区名称是什么?
[Unknown]: xx
该单位的双字母国家/地区代码是什么?
[Unknown]: xx
CN=xxx, OU=xx, O=xx, L=xx ST=xx, C=xx是否正确?
[否]: y (注意:这里是y 不是yes,如果填yes会再重复一遍让你输入)
用秘钥签名:
apksigner sign --ks <xxx.keystore> --ks-key-alias <name-alias> --ks-pass pass:<password> dist/xxx.apk
验证签名:
jarsigner -verify -verbose -certs xxx.apk
三、其他工具
dex2jar:一款命令行工具包,支持dex,smali,jar之间的互相转换。
smali/baksmali: 是dalvik (Android的Java VM实现)使用的索引格式的汇编/反汇编器。通常使用场景是将odex转为dex。