反编译
android的反编译工具:apktool,JEB等。
- Apk 文件的结构,如下:
- META-INF:签名文件
- res:资源文件,里面的 xml 格式文件在编译过程中由文本格式转化为二进制的 AXML 文件格式
- AndroidManifest.xml:android 配置文件,编译过程依然被转换为 AXML 格式
- classes.dex:java 代码编译后产生的类似字节码的文件(dalvik 字节码,核心逻辑)
- resources.arsc:具有 id 值资源的索引表(asserts 文件夹中的资源不会生成索引)
- 其他文件:可由开发者自己添加,诸如 assets 等,或者 lib(native so 代码)等目录
-
一般APK破解过程:
-
逆向破解Android小技巧
- 信息反馈:通过界面的一些弹出信息,界面特点寻找突破点。
- 特征函数:比如搜Toast,Log,getSignature等。
- 代码注入:把toast或者log函数注入到程序中,跟踪位置。
- 打印堆栈:插入new Exception(“定位”).printStackTrace()。
- 网络抓包:通过抓包得到的关键字段,在代码中定位。
- 推荐资料书
- Android软件安全与逆向分析
- Android Security Internals
配套装备
- Apktool
- signapk.jar【apk签名工具】
java -jar signapk.jar testkey.x509.pem testkey.pk8 old.apk new.apk
- dex2jar
- jd-gui
- JEB
Apktool+dex2jar+jd-gui
apktool安装(MacOS)
- 点击下载地址,在看雪学院网站下载相应的apktool包;
- 解压,将包中的三个文件复制到/usr/local/bin下;
- 执行apktool,查看安装情况。
dex2jar安装
- 点击下载地址
jd-gui安装(MacOS)
- 点击下载地址
反编译apk包
- 进入存放apk目录;
- apktool d XX.apk;【编译apk:apktool b app文件】
- 在同级目录中出现与包名一样的文件,生成的文件如下:
各文件简单介绍如下:
AndroidManifest.xml:清单文件,非二进制。
apktool.yml:apk属性。
original:原始数据,应用的二进制清单和签名。
res:资源文件。
smali:dex解析的代码。smali是dex虚拟机的解析格式,在dex2jar中也包含smali格式的转换。
反编译classes.dex文件
- 将需要反编译的apk重命名后缀为zip,解压,解压后的文件夹中有个classes.dex文件,获取该文件的路径 ;
- 输入命令cd xxx/xxx/dex2jar,进入下载的dex2jar文件夹中 ;
- 输入命令sh dextool.sh xxx/xxx/xxx/classes.dex,进行反编译classes.dex文件;
- 操作完成后,会在dex2jar文件夹中生成一个classes-dex2jar.jar文件 ;
- 打开jd-gui工具,将classes-dex2jar.jar拖入jd-gui界面上,就能够看到Java文件。
踩过的坑
- 反编译apk包报错
执行反编译apk包时,提示Could not decode arsc file;
产生原因:apktool.apk版本太低,下载最新的版本,将旧的apktool.jar替换。
JEB
安装
- 下载地址
- 解压,将JEB根目录配置到环境变量中;
- 运行jeb_macos.sh,启动JEB窗口;
- File->open,选择*.apk。
踩过的坑
- mac下运行jeb_macos.sh报错
报错原因:jeb包中的swt是win版本
解决办法:下载mac版本的swt,swt-3.6.1-cocoa-macosx-x86_64.jar.zip,存放到Jeb/bin下,将swt-3.6.1-cocoa-macosx-x86_64.jar修改成swt.jar。