Android反编译的简单总结

准备

安卓apk反编译神器,主要作用于资源文件,清单文件,也可用于jar; 解码\构建 双向全能,用过的都说好.

  • apktool.bat

一段脚本,结合apktool.jar使用

  • Java 7 (JRE 1.7)及以上,使用java -version查看
  • dex2jar

用于android的将classes.dex转换成jar的工具,可结合JD-GUI使用

免安装,非商业用途的java反编译器,如可用于查看jar包中的代码

  • 了解smali语法并且会使用 Android SDK, AAPT

安装

若已安装,可跳过

  • Windows
  1. 复制如下脚本,并另存为apktool.bat
@echo off
if "%PATH_BASE%" == "" set PATH_BASE=%PATH%
set PATH=%CD%;%PATH_BASE%;
chcp 65001 2>nul >nul
java -jar -Duser.language=en -Dfile.encoding=UTF8 "%~dp0\apktool.jar" %*
  1. 下载最新版的apktool
  2. 把下载好的jar重命名为apktool.jar
  3. 把上述两个文件apktool.bat & apktool.jar放到同一个文件夹下,如C:\windows
  4. (可选)如果你愿意,可以把第4步的路径添加到系统的环境变量里(&PATH)
  5. 打开cmd 输入apktool 检查是否输入帮助信息,是否安装成功
  • Linux
  1. 复制如下脚本,并另存为apktool
@echo off
if "%PATH_BASE%" == "" set PATH_BASE=%PATH%
set PATH=%CD%;%PATH_BASE%;
chcp 65001 2>nul >nul
java -jar -Duser.language=en -Dfile.encoding=UTF8 "%~dp0\apktool.jar" %*
  1. 下载最新版的apktool
  2. 把下载好的jar重命名为apktool.jar
  3. 把上述两个文件apktool & apktool.jar放到同一个文件夹下,如/usr/local/bin
  4. 确保上述文件有可执行权限chmod +x
  5. Terminal运行apktool
  • Mac OS X
  1. 复制如下脚本,并另存为apktool
@echo off
if "%PATH_BASE%" == "" set PATH_BASE=%PATH%
set PATH=%CD%;%PATH_BASE%;
chcp 65001 2>nul >nul
java -jar -Duser.language=en -Dfile.encoding=UTF8 "%~dp0\apktool.jar" %*
  1. 下载最新版的apktool
  2. 把下载好的jar重命名为apktool.jar
  3. 把上述两个文件apktool & apktool.jar放到同一个文件夹下,如/usr/local/bin
  4. 确保上述文件有可执行权限chmod +x
  5. Terminal运行apktool
  • 注意

      apktool脚本并不是必须的,它只是帮你省去了`java -jar apktool.jar`这样重复的指令
    

用法

Apktool

首先我们要了解一下apk的结构,apk只是一个包含资源以及java代码的zip文件,可使用任何解压软件直接解压(如7zip),解压后可以得到诸如 classes.dex and resources.arsc这样的文件

$ unzip testapp.apk
Archive:  testapp.apk
 inflating: AndroidManifest.xml
 inflating: classes.dex
 extracting: res/drawable-hdpi/ic_launcher.png
 inflating: res/xml/literals.xml
 inflating: res/xml/references.xml
 extracting: resources.arsc

然而 这个时候只是解压了apk,如果你打开AndroidManifest.xml将会看到下面这些神秘字符

2018-04-22_112450.png

亦或是这些神秘字符,反正看不懂就对了

2018-04-22_112631.png

现在apktool排上用场了

解码

$ apktool.bat  d -f girl.apk -o zsh
I: Using Apktool 2.3.2 on girl.apk
I: Loading resource table...
I: Decoding AndroidManifest.xml with resources...
I: Loading resource table from file: C:\Users\Administrator\AppData\Local\apktool\framework\1.apk
I: Regular manifest package...
I: Decoding file-resources...
I: Decoding values */* XMLs...
I: Baksmaling classes.dex...
I: Copying assets and libs...
I: Copying unknown files...
I: Copying original files...

解释一下上述指令中各参数的定义

girl.apk为要解码的安装包,名字随便起的

d,decode

解码

-f, --force

若目标输出文件夹已经存在,则先强制删除

-o, --output <FILE>

指定目标输出文件夹,若没有则自动创建

其他可选项

-api, --api-level <API>

要生成的smali文件的数字api级别(默认为targetSdkVersion)

-b, --no-debug-info

防止baksmali写出调试信息(.local,.param,.line等),比较不同版本apk的smali文件时使用,行号和调试将在各个版本之间改变,这可能会使阅读DIFF报告变得很痛苦。

--keep-broken-res

当尝试反编译一个非当前标准结构的apk时,会出现类似"Invalid Config Flags Detected. Dropping Resources..."的错误信息,这可能是用于使用了未知新版本的AndroidSDK构建或非已知标准结构的apk,使用上述命名可以允许错误继续decode,但是产生的错误信息需要你手动修复

-m, --match-original

解码时将尽可能保持与原始文件一致,但是这样做可能会影响到重新构建rebuild

--no-assets

解码时如果遇到未知的asset资产文件直接跳过

-p, --frame-path <DIR>

指定本地framework文件的路径,这个后面会讲到,该文件解码时会用到,不指定时,apktool会到默认的路径C:\Users\Administrator\AppData\Local\apktool\framework\中查找,找不到就下载

-r, --no-res

如果只是编辑Java (smali) 文件,则推荐使用,因为它使 resources.arsc保持不变,官方说法是without any decode.,这样解码与重构都会更快

-s, --no-src

和上述命名类似,如果只是编辑资源文件,则推荐使用,因为它使 *.dex保持不变,同样官方说法是without any decode.,这样解码与重构都会更快

-t, --frame-tag <TAG>

解码时,使用指定tag的framework文件,这个用的很少,知道就行了

重新构建

$ apktool.bat  b girl -o newGirl.apk
I: Using Apktool 2.3.2
I: Checking whether sources has changed...
I: Checking whether resources has changed...
I: Building apk file...
I: Copying unknown files/dir...
I: Built apk...

注意若不指定-o newGirl.apk,则默认的输出路径为girl/build/dist

构建时可用的选项

-c, --copy-original

官方表示即将弃用该选项,它表示使用原apk的签名等信息 Copies original AndroidManifest.xml and META-INFfolder into built apk.

-d, --debug

自动在清单文件中添加debuggable="true" ,良心操作

-f, --force-all

在构建过程中覆盖现有文件,重新组合resources.arsc文件和dex文件(s)

--use-aapt2

框架文件的加载位置

补充

Android应用程序一般会依赖或使用系统framework层的的代码和资源,这里简称为'框架资源',Apktool工作时也是需要这些框架资源的;

使用最新版的apktool时,它内部已经包含了当前正式发布的最新的AOSP 框架层数据,所以会较少遇到问题,但是由于android系统毫无节制的开放性,国内各厂商把源码改的乱七八糟,这其中当然包括framework层;当尝试decode这些定制rom中的应用时,则需要先安装各厂商的framework files

下面引入一个官方的例子

如果你想要解码 HtcContacts.apk(HTC系统的通讯录应用),可能会得到下面的错误

$ apktool d HtcContacts.apk
I: Loading resource table...
I: Decoding resources...
I: Loading resource table from file: 1.apk
W: Could not decode attr value, using undecoded value instead: ns=android, name=drawable
W: Could not decode attr value, using undecoded value instead: ns=android, name=icon
Can't find framework resources for package of id: 2. You must install proper framework files, see project website for more info.

所以在解码之前,需要先从HTC设备中pull出框架资源 com.htc.resources.apk并且安装它;

$ apktool if com.htc.resources.apk
I: Framework installed to: 2.apk

$ apktool d HtcContacts.apk 
I: Loading resource table...
I: Decoding resources...
I: Loading resource table from file: /home/brutall/apktool/framework/1.apk
I: Loading resource table from file: /home/brutall/apktool/framework/2.apk
I: Copying assets and libs...

从设备中找到框架资源文件(这一步只能靠猜了):

  • 可能的文件路径

    • /system/framework
    • /data/system-framework
    • /system/app
    • /system/priv-app
  • 可能的文件名

    • resources
    • res
    • framework

apktool在使用这些文件时会自动缓存到默认目录下

  • unix - $HOME/.local/share/apktool
  • windows - %UserProfile%\AppData\Local\apktool
  • mac - $HOME/Library/apktool

如:我的是在C:\Users\Administrator\AppData\Local\apktool\framework

这个选项或许有用

apktool empty-framework-dir

Dex2jar

方式一:

  1. 修改apk扩展名为zip
  2. 解压并拷贝classes.dex文件到dex2jar目录
  3. 右键在dex2jar目录中打开cmd,保证cmd的工作路径是在当前目录,否则就cd进来
  4. cmd中运行d2j-dex2jar.bat classes.dex
  5. 自动生成classes-dex2jar.jar 文件,接下来就可以用JD-GUI打开了查看源码

方式二:

  1. 拷贝test.apk到dex2jar安装目录
  2. 打开cmd,直接运行d2j-dex2jar.bat test.apk
  3. 自动生成test-dex2jar.jar 文件,接下来就可以用JD-GUI打开了查看源码

JD-GUI

用法比较简单,直接把上一步生成的jar包拖到jd-gui.exe打开即可

2018-04-23_175346.png

Google开源的神器ClassyShark

可以可靠地浏览任何Android可执行文件并显示重要信息,例如类接口和成员,dex数量和依赖关系。 ClassyShark支持多种格式,包括库(.dex,.aar,.so),可执行文件(.apk,.jar,.class)和所有Android二进制XML:AndroidManifest,资源,布局等。

  • 直接查看apk结构资源,甚至源码
  • 在一定程度上: ClassyShark = Apktool+dex2jar+JD-DUI

用法:

下载 最新的JAR ,执行 java -jar ClassyShark.jar

2018-04-23_181150.png