本文介绍Android反编译过程中,可能会用到的一些工具。仅针对Mac系统,且默认已经安装了HomeBrew包管理工具,以及HomeBrewCask应用管理工具。

下文只列出最常用的基本命令,每个工具的详细命令,大部分可以通过<command> -h的形式来查看。

解压apk

解压apk,可以用来查看apk中的文件结构。注意,解压后的xml格式资源文件,不是原始文件,内容是经过android编译过的,可读性非常差。

unzip

  1. 安装。Mac系统自带,无需安装。
  2. 解压一个apk到指定目录的命令为:
  1. 2. unzip <xxx.apk> -d <outputDir>

7z

  1. 安装。执行下列命令进行安装:

    1. brew install p7zip
  2. 解压一个apk到指定目录的命令为:

    1. 7z x <xxx.apk> -o<outputDir>

反编译apk

这里的反编译apk,是指直接对apk进行反编译,包括资源文件,具有很好的可读性。

jadx

jadx除了提供命令行方法,还提供了反编译结果的图形化显示,支持将apk、dex、jar,直接反编译为源码格式的文件。

  1. 安装。执行下列命令进行安装:

    1. brew install jadx
  2. 启动图形界面命令如下:

    1. jadx-gui

apktool

apktool可以用于将apk进行整体反编译,其中dex被反编译为smali,resources也被反编译为源码格式。

  1. 安装。执行下列命令进行安装:

    1. brew install apktool
  2. 使用apktool反编译apk的命令如下:

    1. apktool d -o <outputDir> <xxx.apk>

反编译dex

dex文件可以反编译为一种smali格式的文件,可以反应javac编译器对源码的编译优化结果,相对于.class文件具有更好的可读性。因此,对于class、method、field的全局查找和搜索,以及分析定位运行时问题,非常有帮助。

dex2jar

dex2jar提供了一系列命令进行dex、smali、jar文件之间的转换。

  1. 安装。执行下列命令进行安装:

    1. brew install dex2jar
  2. dex2jar提供的系列工具,均以d2j-开头,其中两个比较常用的工具为dex转为smali、dex转为jar:

    1. dexsmali: d2j-dex2smali <xxx.dex> [-o <outputDir>]
    2. dexjar: d2j-dex2jar <xxx.dex> [-o <outputDir>]

反编译jar

下列工具可以将jar反编译为源码形式,对于查看类依赖及类方法的调用关系,非常方便。

jd-gui

jd-gui是一个应用,操作非常直观。

  1. 安装。执行下列命令进行安装,安装完成后会直接放到Mac的Applications中:

    1. brew cask install jd-gui
  2. 打开程序后,加载jar文件即可。

so文件逆向

不同于java的反编译,native代码经过编译后转为机器码,对阅读带来比较大的困难,可以利用部分工具来辅助分析。

greadelf

此工具用来读取elf格式文件的相关结构信息

  1. 安装
  1. brew install binutils
  1. 读取so信息
  1. //读取so文件头
  2. greadelf -h xxxx.so
  3. //读取program header
  4. greadelf -l xxxx.so
  5. //读取elf重定向表
  6. greadelf -r xxxx.so -W
  7. //读取全部相关信息
  8. greadelf -a xxxx.s0

gobjdump

这是一个反汇编工具,可以把机器码转为汇编

  1. 安装
  1. //和readelf 在同一个工具链下
  2. brew install binutils
  1. 对所有section进行反汇编
  1. gobjdump -S xxxx.so [--target={对应的文件格式, 比如elf32-littlearm}]
  1. 对.text段进行反汇编
  1. gobjdump -S -j .text xxx.so [--target={对应的文件格式, 比如elf32-littlearm}]
  1. 打印.dynstr段
  1. gobjdump -s -j .dynstr xxx.so [--target={对应的文件格式, 比如elf32-littlearm}]

查看ResourceTable

上面介绍的apktool工具可以反编译资源文件,下面介绍的Android自带工具aapt,可以用于查看资源索引表resources.arsc文件的内容。

aapt

  1. 安装。aapt工具是android sdk中自带的,设置了环境变量后,可以直接使用。aapt工具路径如下:

    1. android-sdk-path/build-tools/your build tools version/aapt
  2. 如果希望相应的工具都保持在最新的build版本,可以通过brew安装gfind工具:

    1. brew install findutils
  3. 然后在你的.bashrc或者.zshrc等配置文件中加入

    1. export PATH=$PATH$( gfind [你的android-sdk路径]/build-tools -maxdepth 1 -printf ":%p\n" | sort -r | head -1 )
  4. 打印资源索引表命令如下:

    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工具的解压部分功能类似。

  1. 下载安装。到apk-atlas-decompiler页面,把文件下载到本地。赋予可执行权限:
  1. chmod a+x apk-atlas-decompiler.rb
  1. 反编译apk命令如下,解压后的文件夹与apk文件位于同一目录下,名称相同:```markup
    ./apk-atlas-decompiler.rb -a
  1. 3. 直接查看反编译的各种类型文件,或者使用[Ag](https://yuque.antfin-inc.com/youku_android_arch/dev-specification/text-tools)对指定文件类型进行搜索。
  2. <a name="3e7ffeb5"></a>
  3. ### apk_code_scanner[[@亦坤(fangmao.cfm) ](/fangmao.cfm) ]
  4. 通过把apk以及bundle文件的.so反编译成smali文件来进行全局搜索,可以用来搜索资源在xml中的引用,或者类和方法在代码中的引用
  5. 下载脚本[apk_code_scanner](http://gitlab.alibaba-inc.com/youku-android-arch/internal-docs/blob/master/attachments/scripts/code/apk_code_scanner.sh)
  6. ```shell
  7. //设置权限
  8. chmod a+x apk_code_scanner.sh

初次运行如果相关的工具没有安装会尝试安装对应的工具,包括:

  1. HomeBrew
  2. dex2jar
  3. unzip
  4. the_silver_searcher
  5. apktool
  6. coreutils
  7. findutils

并尝试把Android sdk下的build-tools添加到PATH, 默认的路径为~/Library/Android/sdk, 如果android sdk不在这个路径下请参考上面aapt的使用方法来添加。

全局代码搜索:

  1. //搜索类的引用
  2. ./apk_code_scanner.sh xxxxx.apk -t code -i "Youku"
  3. //搜索方法的引用
  4. ./apk_code_scanner.sh xxxxx.apk -t code -i "Youku->onCreate"
  5. //全包名搜索
  6. ./apk_code_scanner.sh xxxxx.apk -t code -i "com.youku.phone.Youku"
  7. //搜索成员变量
  8. ./apk_code_scanner.sh xxxxx.apk -t code -i "YoukuTmp->mContext"
  9. //合并搜索
  10. ./apk_code_scanner.sh xxxxx.apk -t code -i "Youku->onCreate|Youku->attachBaseContext"

资源搜索:

  1. //搜索资源在xml中的引用
  2. ./apk_code_scanner.sh xxxxx.apk -t res -i "@string/app_name"
  3. //搜索资源在代码中的引用
  4. ./apk_code_scanner.sh xxxxx.apk -t res -i "R\$string->app_name"

native层代码搜索:

  1. //搜索symbol调用
  2. ./apk_code_scanner.sh xxxxx.apk -t native -i "memcpy"

纯文本搜索:

  1. ./apk_code_scanner.sh xxxxx.apk -t string -i "aabbccdd"

所有option:

  1. -t/--type 指定搜索类型 [code/res/string/native]
  2. -i/--input 需要搜索的内容, 支持合并搜索
  3. -I/--install 安装(把脚本复制到/usr/local/bin文件夹下)
  4. -h/--help 显示帮助
  5. -V/--verbose 显示更多详细信息
  6. -p/--progress 显示进度条
  7. -v/--version 显示版本号
  8. -u/--update maven拉取最新脚本并安装