(文章分为实战和源码分析,本文为实战篇)
环境和工具准备:
- kali-linux
- python 3.x
- r0capture
- frida / frida-tools
- apkshell
0x01.什么是 Frida
英文原文介绍:
Frida is Greasemonkey for native apps, or, put in more technical terms, it’s a dynamic code instrumentation toolkit. It lets you inject snippets of JavaScript into native apps that run on Windows, Mac, Linux, iOS and Android. Frida is an open source software.
frida是一款轻量级的 Hook 框架,也可以说是一种动态插桩工具,可以插入一些代码到原生 app 的内存空间去,(动态地监视和修改其行为),这些原生平台可以是Win、Mac、Linux、Android或者iOS。
frida分为两个部分,服务端和控制端,其中服务端运行在目标机器上,通过进程注入来劫持应用的类和函数,控制端运行在自己系统机器上,可以注入自定义的 js、python、c 等脚本来实现自动化注入。
无论是针对 Java 层还是 Native 层,frida 均能 Hook,虽然持久化上没有 Xposed 等开发框架强,但是 frida 主要优势就是它的动态性和灵活性。
0x02.安装 Frida
frida 安装特别简单,直接 pip 安装即可
$ pip install frida
如果要指定版本安装,可以这样:
$ pip install frida==12.8.0
下载慢的话是源的问题,可以指定清华源:
-i https://pypi.tuna.tsinghua.edu.cn/simple
另外pip只是下载了一个安装脚本,实际上最后请求去下载的还是默认官方的 pypi 源,这里写死了,所以很多人会卡在这很久.
而有趣的是我看了一下网上很多提问的童鞋,回复中目前还没有人指出关键问题所在,回答的基本都是最开始的指定源之类的,而其实并不是那样:
解决方案也很简单,将 pypi 官网源编辑替换成清华源,再手动构建即可
另外还需要安装一下配套工具,frida-tools
$ pip install frida-tools
最后执行没有问题,环境就安装配置好了
这里安装后的 frida 版本是 14.2.3,然后还要下载服务端,根据安装的 frida 版本和执行服务端的机器的系统架构,去下载对应的 frida-server( https://github.com/frida/frida/releases )
下载后先放着,后面要用
0x03.什么是r0capture
r0capture 是一个 python 脚本,基于 frida_ssl_logger 开发,侧重点不同在于 frida_ssl_logger 是抓 ssl 和跨平台,而 r0capture 旨在抓到所有的包,其中安卓7、8、9、10 测试可用。
优势:
- 无视所有证书校验或绑定,不用考虑任何证书的事情;
- 通杀TCP/IP四层模型中的应用层中的全部协议;
- 通杀协议包括:Http,WebSocket,Ftp,Xmpp,Imap,Smtp,Protobuf 等等、以及它们的SSL版本;
- 通杀所有应用层框架,包括 HttpUrlConnection、Okhttp1/3/4、Retrofit/Volley等等;
0x04.安装 r0capture
$ git clone https://github.com/bin-maker/r0capture
0x05.实战演示
首先将之前下载的对应版本和系统的 frida-server 拷贝到手机上
$ adb push frida-server /data/local/tmp/
手机上运行 frida-server 监听
$ cd /data/local/tmp/
$ chmod +x frida-server
$ ./frida-server
kali 上用 frida-ps 看一下包进程
$ frida-ps -U | grep "com"
手机上运行我们的目标 app,再列一下当前包进程,把目标app的包名复制记录下来,后面要用
r0capture 支持 spawn 模式和 attach 模式,首先用最新的 apkshell 查一下壳(工具地址:https://github.com/bin-maker/apkshell)
发现应用加壳了
所以我们这里使用 attach 模式来抓包,也叫实时 hook,主要用来针对有壳的应用
运行 r0capture.py
python r0capture.py -U 前面记录的目标应用包名 -p xxx.pcap
其中 -p 参数用来保存抓包结果,.pcap 是数据报存储格式,包括 Wireshark 在内的很多主流抓包软件都可以生成或者导入 pcap 数据包并分析
attach 后,我们手机上操作app,终端界面就会实时输出抓到的数据包
如果中途提示 hexdump 名称错误,pip 安装一下即可
pip install hexdump
要想终止抓包,随时按 ctrl + c 终止 r0capture 脚本即可停止抓包
接下来打开 wireshark 等网络数据包分析工具,导入我们通过 r0capture 导出的 pcap 包文件
跟踪一下 http 流,数据非常直观了:
后面该怎么操作想必大家都清楚了,不需要多说了,其实源码层非常有意思,下次有时间来通过源码层讲讲实现。