1. andriod
Android逆向流程图
1.1 adb
adb是google官方提供的命令行工具,用于连接真机和模拟器,只需要打开USB调试,就可以使用adb连接手机,adb主要的功能是查看连接的手机,打开一个shell,查看日志,上传和下载等
常见命令:
adb devices # 查看连接的手机或模拟器
adb install <APK路径> #安装APK
adb uninstall <package> # 卸载APP
adb shell # 打开shell
adb logcat #查看日志
adb push xxx/xxx/tmp # 上传文件
1.2 APK文件格式
.
|——AndroidManifest.xml #APK的文件属性
|——META_INF #编译过程自动生成的文件夹
|——assets #原封不动的打包到APK里,例如解密密钥, 加密后的密文
|——classes.dex #存放Dalvik字节码的DEX文件,用编辑器打开则会乱码
|——libs # 包含Native层所需的Lib库,一般为libxxx.so,类似Linux库文件
|——res #存放与资源相关的文件,如位图
|——resources.arsc #存放APK所使用的资源的名字,ID,类型等信息,打开则乱码
2. Dalvik层逆向分析
目前主流的DEX文件反编译工具为BakSmali和Dedexer,两种在语法上很类似
2.1 使用BakSmalli工具反编译
BakSmali使用p命名法,简洁明了
2.2 寄存器
- 每个寄存器都是32位的,支持任何类型,最多使用65536和寄存器(2^16)
- Dalvik虚拟机中的寄存器有两种表示方法-v命名法和p命名法
- .locals描述该函数使用的局部变量个数
- .param描述函数参数变量
2.3 类型
语法 | 含义 | 语法 | 含义 |
---|---|---|---|
V | void,只用于返回值类型 | J | long |
Z | boolean | F | float |
B | byte | D | double |
S | short | L | Java类型 |
C | char | [ | 数组类型 |
I | int | - | - |
2.4 方法
2.5 指令特点
- 返回指令
- 方法调用指令
- 跳转指令
- ...
2.6 静态分析
逆向APK第一步就是对APK文件进行反编译,生成BakSmali格式的代码或者直接生成Java代码,随后才能读懂程序逻辑,分析攻击面
使用apktool反编译APK
apktool是一款优秀的apk文件反编译工具,能够将apk解压缩,将其中的DEX文件转化为BakSmali代码,将resources.arsc文件转为XML等可阅读格式等,是反编译的首选工具,此外apktool还整合了Smali,BakSmaliApktool工具,支持对修改之后bakSmali代码重新打包,并签名
反编译
apktool d 6176cfc5-d473-4453-a000-29e480ace634.apk
可以看到当前文件夹多了一个6176cfc5-d473-4453-a000-29e480ace634
文件夹
编译后的结果都在这个文件夹里面
文件结构
.
|——AndroidManifest.xml
|——apktool.yml
|——original
|——res
|——smali
public.xml文件在res/values文件夹中
重新打包
apktool b dbug_smali