安卓APP-HTTPS抓包Frida Hook教程
本机环境
- windows 11
- bluestacks 5.11.56.1003 p64
- adb 31.0.2
- Root Checker 6.5.3
- wireshark 4.0.5
- frida 16.5.9
- jadx-gui 1.4.7
环境搭建
bluestacks 环境搭建
目前Android模拟器竞品很多,选择Bluestacks 5是因为它能和windows的hyper-v完美兼容,root过程也相对简单。
下载地址:https://www.bluestacks.com/download.html
首先需要root Bluestacks环境。
下载安装Bluestacks。
运行Bluestacks Multi-instance Manager,发现默认安装的版本为Android Pie 64bit版本,即Android 9.0。此时退出bluestack所有程序。
- 关闭bluestack后编辑bluestacks配置文件,
%programdata%\BlueStacks_nxt\bluestacks.conf
在配置文件中查找root关键词,对应值修改为1,共两处。
bst.feature.rooting="1" bst.instance.Pie64.enable_root_access="1"
启动bluestack模拟器,安装
Root Checker
APP,点击验证root,即可发现root已成功。
打开 adb调试
1.bluestack设置-高级中打开Adb调试,并记录下端口
2.打开主机命令行,运行 adb connect localhost:6652
,端口号修改为上一步的端口号,即可连接。再运行adb devices
,如有对应设备则连接成功。
3.进入adb shell
,执行su进入root权限,命令行标识由$
变为#
,即表示adb 进入root权限成功。
frida环境搭建
frida是大名鼎鼎的动态分析的hook神器,用它可以直接访问修改二进制的内存、函数和对象,非常方便。它对于Android的支持也是很完美。
frida的运行采用C/S架构,客户端为电脑端的开发环境,服务器端为Android,均需对应部署搭建。
客户端环境搭建(Windows)
firda客户端基于python3开发,因此首先需要配置好python3的运行环境,然后执行 pip install frida-tools
即可完成安装。运行 frida --version
可验证frida版本。
(py3) PS E:\TEMP\damai> frida --version
16.5.9
服务器 环境搭建(Android)
环境搭建第二步是在Android模拟器中运行frida-server。这样可以让Frida通过ADB/USB调试与我们的Android模拟器连接。
1.下载frida-server
最新的frida-server可以从 https://github.com/frida/frida/releases 下载。请注意下载与设备匹配的架构。如果您的模拟器是x86_64,请下载相应版本的frida-server。本文使用的版本为 frida-server-16.5.9-android-x86_64.xz
2.传入Android模拟器。
将下载后的.xz文件解压重新命名为frida-server
,将frida-server
传入Android模拟器
adb push frida-server /data/local/tmp/
3.运行 frida-server
使用adb root以root模式重新启动ADB,并通过adb shell重新进入shell的访问。进入shell后,进入我们放置frida-server的目录并为其授予执行权限:
cd /data/local/tmp/frida-server
chmod +x frida-server-16.5.9-android-x86_64
执行:./frida-server-16.5.9-android-x86_64
,运行frida-server,并保持本shell窗口开启。
4.测试是否连接成功
在window端运行frida-ps命令
看到一堆熟悉的Android进程,表示连接成功。
5.转发frida-server端口 (可选)
frida-server跑在Android端,frida需要通过连接frida-server。上一步使用adb的方式连接,frida认为是USB模式,需要-U
命令。frida也支持依赖端口的远程连接模式,在某些场景下更加灵活。可以通过端口转发的方式实现此功能。
adb forward tcp:27042 tcp:27042
adb forward tcp:27043 tcp:27043
27042是用于与frida-server通信的默认端口号,之后的每个端口对应每个注入的进程,检查27042端口可检测 Frida 是否存在。
抓包流程
本章节将介绍用tcpdump+frida+wireshark实现Android的全流量抓包,能实现https解密。
惯用的Android抓包手段是用fiddler/burpsuite/mitmproxy搭建代理服务器,设置Android代理服务器并用中间人劫持的方式获取http协议流量的内容,上述的抓包方式只能抓到http协议层以上的流量,这次我们来点不一样的,用tcpdump+frida+wireshark实现Android的全流量抓包,能实现https解密。
抓包及https解密方法
1. 搞定tcpdump
本文基于termux安装使用tcpdump,首先安装termux apk。打开termux运行
下载地址:https://f-droid.org/en/packages/com.termux/
挂载存储
termux-setup-storage ## 会弹出授权框,点允许 ls ~/storage/ ## 如果出现dcim, downloads等目录,即表示成功
安装tcpdump
pkg install root-repo pkg install sudo tcpdump
运行抓包
sudo tcpdump -i any -s 0 -w ~/storage/downloads/capture.pcap
tcpdump 成功截图
之后就可以把downloads目录下的抓包文件拷贝到电脑上,用wireshark打开做进一步分析。
2. 解密https流量
wireshark解密技术的重点在于拿到客户端通信的密钥日志文件(ssl key log),像下面这种:
在Android中实现抓取ssl key log需要hook系统的SSL相关函数,可以用frida实现。
首先将下面的hook代码保存为
sslkeyfilelog.js
// sslkeyfilelog.js function startTLSKeyLogger(SSL_CTX_new, SSL_CTX_set_keylog_callback) { console.log("start----") function keyLogger(ssl, line) { console.log(new NativePointer(line).readCString()); } const keyLogCallback = new NativeCallback(keyLogger, 'void', ['pointer', 'pointer']); Interceptor.attach(SSL_CTX_new, { onLeave: function(retval) { const ssl = new NativePointer(retval); const SSL_CTX_set_keylog_callbackFn = new NativeFunction(SSL_CTX_set_keylog_callback, 'void', ['pointer', 'pointer']); SSL_CTX_set_keylog_callbackFn(ssl, keyLogCallback); } }); } startTLSKeyLogger( Module.findExportByName('libssl.so', 'SSL_CTX_new'), Module.findExportByName('libssl.so', 'SSL_CTX_set_keylog_callback')
然后用frida加载运行hook
frida -U -l .\sslkeyfilelog.js -f 包名
- 在运行Frida Hook获取sslkey的同时,运行tcpdump抓包.开始在模拟器端执行各种APP中的操作,例如登录、搜索等,这些数据包都会被抓取,操作完毕后,在adb shell中按Ctrl c关闭tcpdump抓包.最后,抓包结束后将得到的key保存到sslkey.txt,格式是下面这样的,不要掺杂别的。把抓到的capture.pcap导出来
CLIENT_RANDOM 557e6dc49faec93dddd41d8c55d3a0084c44031f14d66f68e3b7fb53d3f9586d 886de4677511305bfeaee5ffb072652cbfba626af1465d09dc1f29103fd947c997f6f28962189ee809944887413d8a20
CLIENT_RANDOM e66fb5d6735f0b803426fa88c3692e8b9a1f4dca37956187b22de11f1797e875 65a07797c144ecc86026a44bbc85b5c57873218ce5684dc22d4d4ee9b754eb1961a0789e2086601f5b0441c35d76c448
流量分析
wireshark下载地址:https://www.wireshark.org/download.html
抓包完成后,用wireshark打开tcpdump抓包获得的pcap文件,在wireshark首选项-protocols-TLS中,设置 (Pre)-Master-Secret log filename为上述sslkey.txt。
即可实现https流量的解密。
在上述步骤中拿到了解密后的流量,我们就能对XX的流量做进一步分析了。可以看到大量向服务器请求的数据包,但其中有很多干扰的图片请求,因为修改过滤器把图片过滤一下。过滤器:http && tcp.dstport==443 and !(http.request.uri contains ".webp" or http.request.uri contains ".jpg" or http.request.uri contains ".png")
结果清爽了很多。
查看包名
1、查看将要启动或退出app的包名
adb shell am monitor(只有在启动或退出的时候才会打印)
2、查看安装的第三方app的包名
adb shell pm list packages -3
3、查看当前界面的app的包名
adb shell dumpsys window windows | findstr mFocusedApp
4、查看启动的app的包名
adb shell dumpsys activity top | find "ACTIVITY"
5、查看所有启动的应用的包名
adb shell dumpsys activity activities | findstr "Run"
6、查看当前启动应用的包名
adb shell dumpsys window w |findstr \/ |findstr name=
7、通过应用查看包名
aapt dump badging D:\test\xxx.apk(APK的全名)