# 1.7.4 Android 常用工具

这里先介绍一些好用的小工具，后面会介绍大杀器 JEB、IDA Pro 和 Radare2。

## 常用工具

### smali/baksmali

地址：<https://github.com/JesusFreke/smali>

smali/baksmali 分别用于汇编和反汇编 dex 格式文件。

使用方法：

```
$ smali assemble app -o classes.dex

$ baksmali disassemble app.apk -o app
```

当然你也可以汇编和反汇编单个的文件，如汇编单个 smali 文件，反汇编单个 classes.dex 等，使用命令 `baksmali help input` 查看更多信息。

baksmali 还支持查看 dex/apk/oat 文件里的信息：

```
$ baksmali list classes app.apk
$ baksmali list methods app.apk | wc -l
```

### Apktool

地址：<https://github.com/iBotPeaches/Apktool>

Apktool 可以将资源文件解码为几乎原始的形式，并在进行一些修改后重新构建它们，甚至可以一步一步地对局部代码进行调试。

* 解码：

  ```
  $ apktool d app.apk -o app
  ```
* 重打包：

  ```
  $ apktool b app -o app.apk
  ```

### dex2jar

地址：<https://github.com/pxb1988/dex2jar>

dex2jar 可以实现 dex 和 jar 文件的互相转换，同时兼有 smali/baksmali 的功能。

使用方法：

```
$ ./d2j-jar2dex.sh classes.dex -o app.jar

$ ./d2j-jar2dex.sh app.jar -o classes.dex
```

### enjarify

地址：<https://github.com/Storyyeller/enjarify>

enjarify 与 dex2jar 差不多，它可以将 Dalvik 字节码转换成相对应的 Java 字节码。

使用方法：

```
$ python3 -O -m enjarify.main app.apk
```

### JD-GUI

地址：<https://github.com/java-decompiler/jd-gui>

JD-GUI 是一个图形界面工具，可以直接导入 .class 文件，然后查看反编译后的 Java 代码。

### CFR

地址：<http://www.benf.org/other/cfr/>

一个 Java 反编译器。

### Krakatau

地址：<https://github.com/Storyyeller/Krakatau>

用于 Java 反编译、汇编和反汇编。

* 反编译

  ```
  $ python2 Krakatau\decompile.py [-nauto] [-path PATH] [-out OUT] [-r] [-skip] target
  ```
* 汇编

  ```
  $ python2 Krakatau\assemble.py [-out OUT] [-r] [-q] target
  ```
* 反汇编

  ```
  $ python2 Krakatau\disassemble.py [-out OUT] [-r] [-roundtrip] target
  ```

### Simplify

地址：<https://github.com/CalebFenton/simplify>

通过执行一个 app 来解读其行为，然后尝试优化代码，使人更容易理解。

### Androguard

地址：<https://github.com/androguard/androguard>

Androguard 是使用 Python 编写的一系列工具，常用于逆向工程、病毒分析等。

输入 `androlyze.py -s` 可以打开一个 IPython shell，然后就可以在该 shell 里进行所有操作了。

```python
a, d, dx = AnalyzeAPK("app.apk")
```

* `a` 表示一个 `APK` 对象
  * 关于 APK 的所有信息，如包名、权限、AndroidManifest.xml和资源文件等。
* `d` 表示一个 `DalvikVMFormat` 对象
  * dex 文件的所有信息，如类、方法、字符串等。
* `dx` 表示一个 `Analysis` 对象。
  * 包含一些特殊的类，classes.dex 的所有信息。

Androguard 还有一些命令行工具：

* androarsc：解析资源文件
* androauto：自动分析
* androaxml：解析xml文件
* androdd：反编译工具
* androdis：反汇编工具
* androgui：图形界面
