本文介绍Android反编译过程中,可能会用到的一些工具。仅针对Mac系统,且默认已经安装了HomeBrew包管理工具,以及HomeBrewCask应用管理工具。
下文只列出最常用的基本命令,每个工具的详细命令,大部分可以通过<command> -h
的形式来查看。
解压apk
解压apk,可以用来查看apk中的文件结构。注意,解压后的xml格式资源文件,不是原始文件,内容是经过android编译过的,可读性非常差。
unzip
- 安装。Mac系统自带,无需安装。
- 解压一个apk到指定目录的命令为:
2. unzip <xxx.apk> -d <outputDir>
7z
安装。执行下列命令进行安装:
brew install p7zip
解压一个apk到指定目录的命令为:
7z x <xxx.apk> -o<outputDir>
反编译apk
这里的反编译apk,是指直接对apk进行反编译,包括资源文件,具有很好的可读性。
jadx
jadx除了提供命令行方法,还提供了反编译结果的图形化显示,支持将apk、dex、jar,直接反编译为源码格式的文件。
安装。执行下列命令进行安装:
brew install jadx
启动图形界面命令如下:
jadx-gui
apktool
apktool可以用于将apk进行整体反编译,其中dex被反编译为smali,resources也被反编译为源码格式。
安装。执行下列命令进行安装:
brew install apktool
使用apktool反编译apk的命令如下:
apktool d -o <outputDir> <xxx.apk>
反编译dex
dex文件可以反编译为一种smali格式的文件,可以反应javac编译器对源码的编译优化结果,相对于.class文件具有更好的可读性。因此,对于class、method、field的全局查找和搜索,以及分析定位运行时问题,非常有帮助。
dex2jar
dex2jar提供了一系列命令进行dex、smali、jar文件之间的转换。
安装。执行下列命令进行安装:
brew install dex2jar
dex2jar提供的系列工具,均以
d2j-
开头,其中两个比较常用的工具为dex转为smali、dex转为jar:dex转smali: d2j-dex2smali <xxx.dex> [-o <outputDir>]
dex转jar: d2j-dex2jar <xxx.dex> [-o <outputDir>]
反编译jar
下列工具可以将jar反编译为源码形式,对于查看类依赖及类方法的调用关系,非常方便。
jd-gui
jd-gui是一个应用,操作非常直观。
安装。执行下列命令进行安装,安装完成后会直接放到Mac的Applications中:
brew cask install jd-gui
打开程序后,加载jar文件即可。
so文件逆向
不同于java的反编译,native代码经过编译后转为机器码,对阅读带来比较大的困难,可以利用部分工具来辅助分析。
greadelf
此工具用来读取elf格式文件的相关结构信息
- 安装
brew install binutils
- 读取so信息
//读取so文件头
greadelf -h xxxx.so
//读取program header
greadelf -l xxxx.so
//读取elf重定向表
greadelf -r xxxx.so -W
//读取全部相关信息
greadelf -a xxxx.s0
gobjdump
这是一个反汇编工具,可以把机器码转为汇编
- 安装
//和readelf 在同一个工具链下
brew install binutils
- 对所有section进行反汇编
gobjdump -S xxxx.so [--target={对应的文件格式, 比如elf32-littlearm}]
- 对.text段进行反汇编
gobjdump -S -j .text xxx.so [--target={对应的文件格式, 比如elf32-littlearm}]
- 打印.dynstr段
gobjdump -s -j .dynstr xxx.so [--target={对应的文件格式, 比如elf32-littlearm}]
查看ResourceTable
上面介绍的apktool工具可以反编译资源文件,下面介绍的Android自带工具aapt,可以用于查看资源索引表resources.arsc
文件的内容。
aapt
安装。aapt工具是android sdk中自带的,设置了环境变量后,可以直接使用。aapt工具路径如下:
android-sdk-path/build-tools/your build tools version/aapt
如果希望相应的工具都保持在最新的build版本,可以通过brew安装gfind工具:
brew install findutils
然后在你的.bashrc或者.zshrc等配置文件中加入
export PATH=$PATH$( gfind [你的android-sdk路径]/build-tools -maxdepth 1 -printf ":%p\n" | sort -r | head -1 )
打印资源索引表命令如下:
aapt dump resources <xxx.apk>
Atlas框架app反编译
由架构组提供的atlas框架下,反编译app小工具。主要优势在于,对bundle对应的.so文件也进行了处理。利用这些工具,可以很方便的查找和定位问题。
**特别需要注意的是,由于存在远程bundle的问题,在使用下面任何一个工具时,请单独构建出一个没有远程bundle的apk,方法参考文档:构建参数-远程Bundle直接放在apk中。
apk-atlas-decompiler[@谦风(terry.lty) ]
通过对上述反编译工具链的组合使用,将atlas框架下的apk进行反编译,bundle文件对应的.so也按照正常的apk结构,进行了处理。其中,dex反编译为smali,资源文件被反编译成可读文本,资源索引表dump到文本文件resources-table.res。
使用ruby脚本进行编写,和apk_scan工具的解压部分功能类似。
- 下载安装。到apk-atlas-decompiler页面,把文件下载到本地。赋予可执行权限:
chmod a+x apk-atlas-decompiler.rb
- 反编译apk命令如下,解压后的文件夹与apk文件位于同一目录下,名称相同:```markup
./apk-atlas-decompiler.rb -a
3. 直接查看反编译的各种类型文件,或者使用[Ag](https://yuque.antfin-inc.com/youku_android_arch/dev-specification/text-tools)对指定文件类型进行搜索。
<a name="3e7ffeb5"></a>
### apk_code_scanner[[@亦坤(fangmao.cfm) ](/fangmao.cfm) ]
通过把apk以及bundle文件的.so反编译成smali文件来进行全局搜索,可以用来搜索资源在xml中的引用,或者类和方法在代码中的引用
下载脚本[apk_code_scanner](http://gitlab.alibaba-inc.com/youku-android-arch/internal-docs/blob/master/attachments/scripts/code/apk_code_scanner.sh)
```shell
//设置权限
chmod a+x apk_code_scanner.sh
初次运行如果相关的工具没有安装会尝试安装对应的工具,包括:
HomeBrew
dex2jar
unzip
the_silver_searcher
apktool
coreutils
findutils
并尝试把Android sdk下的build-tools添加到PATH, 默认的路径为~/Library/Android/sdk, 如果android sdk不在这个路径下请参考上面aapt的使用方法来添加。
全局代码搜索:
//搜索类的引用
./apk_code_scanner.sh xxxxx.apk -t code -i "Youku"
//搜索方法的引用
./apk_code_scanner.sh xxxxx.apk -t code -i "Youku->onCreate"
//全包名搜索
./apk_code_scanner.sh xxxxx.apk -t code -i "com.youku.phone.Youku"
//搜索成员变量
./apk_code_scanner.sh xxxxx.apk -t code -i "YoukuTmp->mContext"
//合并搜索
./apk_code_scanner.sh xxxxx.apk -t code -i "Youku->onCreate|Youku->attachBaseContext"
资源搜索:
//搜索资源在xml中的引用
./apk_code_scanner.sh xxxxx.apk -t res -i "@string/app_name"
//搜索资源在代码中的引用
./apk_code_scanner.sh xxxxx.apk -t res -i "R\$string->app_name"
native层代码搜索:
//搜索symbol调用
./apk_code_scanner.sh xxxxx.apk -t native -i "memcpy"
纯文本搜索:
./apk_code_scanner.sh xxxxx.apk -t string -i "aabbccdd"
所有option:
-t/--type 指定搜索类型 [code/res/string/native]
-i/--input 需要搜索的内容, 支持合并搜索
-I/--install 安装(把脚本复制到/usr/local/bin文件夹下)
-h/--help 显示帮助
-V/--verbose 显示更多详细信息
-p/--progress 显示进度条
-v/--version 显示版本号
-u/--update 从maven拉取最新脚本并安装