6、抓包与网络分析:Charles/Fiddler配置HTTPS抓包、Burp Suite设置、TCP/UDP流量分析基础
说到移动App逆向,抓包分析是绕不开的一关。我个人习惯把抓包比作「给App装个窃听器」——你监听它跟服务器说了什么悄悄话,就能摸清它的通信逻辑。今天咱们就聊聊主流的抓包工具怎么配,以及TCP/UDP流量分析的基础思路。
6.1 为什么需要HTTPS抓包?
现在大部分App都强制走HTTPS,明文HTTP基本绝迹了。你想想看,如果App直接发明文,那攻击者随便在WiFi上嗅探一下就能拿到你的登录凭证,这谁受得了?所以苹果和谷歌都强制要求开发者用HTTPS。
但对我们逆向工程师来说,HTTPS加密了,我们就得想办法「解密」。说白了就是中间人攻击——让客户端信任我们的假证书,这样流量就能被截获并解密。嗯,这里要注意:你只能在你自己控制的设备上做这件事,别乱来。
6.2 Charles配置HTTPS抓包
Charles是我用得最多的工具,没有之一。它的界面清爽,功能也够用。配置步骤其实不复杂,但有几个坑我踩过,得跟你说道说道。
6.2.1 基础设置
- 打开Charles,点击菜单栏
Proxy → Proxy Settings,勾选HTTP Proxy,端口默认8888。 - 勾选
SSL Proxying Settings,添加*.*表示抓取所有HTTPS流量。 - 手机连上同一WiFi,设置代理为电脑IP + 端口8888。
6.2.2 安装证书
这一步最容易出问题。我在项目中遇到过好几次,证书装上了但Charles还是抓不到包,后来发现是没在系统设置里「信任」这个证书。
# 电脑端操作
1. 点击 Help → SSL Proxying → Install Charles Root Certificate
2. 钥匙串访问中找到证书,设为「始终信任」
# 手机端操作(以iOS为例)
1. 浏览器访问 http://chls.pro/ssl
2. 下载并安装描述文件
3. 设置 → 通用 → 关于本机 → 证书信任设置 → 开启Charles证书开关
network_security_config.xml 改成信任用户证书,或者用VirtualXposed等工具绕过。我当年调试一个银行App时卡在这步整整两天。
6.3 Fiddler配置HTTPS抓包
Fiddler跟Charles思路差不多,但它的脚本扩展能力更强。我个人习惯在需要写复杂规则时用Fiddler,平时还是Charles顺手。
6.3.1 开启HTTPS解密
- 打开Fiddler,点击
Tools → Options → HTTPS。 - 勾选
Capture HTTPS CONNECTs和Decrypt HTTPS traffic。 - 选择
...from remote clients only(只解密远程客户端流量)。
6.3.2 手机端配置
手机浏览器访问 http://你的电脑IP:8888,下载Fiddler根证书并安装。注意:Fiddler默认端口也是8888,跟Charles冲突,如果你两个都装,记得改一个端口。
| 对比项 | Charles | Fiddler |
|---|---|---|
| 界面风格 | macOS原生风格,简洁 | Windows风格,功能按钮多 |
| 脚本扩展 | 弱,需用外部工具 | 强,内置FiddlerScript |
| 证书管理 | 自动生成,一键安装 | 需手动导出安装 |
| 重放请求 | 支持,但操作略繁琐 | 支持,且可批量重放 |
6.4 Burp Suite设置
Burp Suite是安全测试的标配,抓包只是它的基础功能。我一般在做渗透测试时才用它,日常逆向还是Charles更轻量。
6.4.1 代理配置
1. 打开Burp,点击 Proxy → Proxy Settings
2. 添加监听端口(默认8080),勾选「支持HTTP/1和HTTPS」
3. 手机设置代理为电脑IP:8080
4. 浏览器访问 http://burp,下载CA证书
5. 安装并信任证书(步骤同Charles)
6.4.2 拦截与修改
Burp的强项在于可以拦截请求并实时修改。比如你想改一个请求参数看服务器怎么响应,直接在Intercept页面改完再放行就行。我经常用它来测试App的接口安全性——改个user_id看看能不能越权访问别人的数据。
6.5 TCP/UDP流量分析基础
HTTP/HTTPS抓包只能覆盖应用层流量。如果App用了自定义协议,或者走的是TCP/UDP裸连接,那Charles和Burp就抓瞎了。这时候得用Wireshark或者tcpdump。
6.5.1 什么时候需要分析TCP/UDP?
- App用了WebSocket或Socket.io(底层是TCP)
- 游戏App用了UDP协议(比如王者荣耀的实时对战)
- 自定义二进制协议,不走HTTP
- DNS查询、NTP时间同步等系统级流量
6.5.2 Wireshark基础操作
Wireshark的界面乍一看很吓人,全是十六进制和乱七八糟的包。但你只要掌握几个过滤表达式,就能快速定位目标流量。
# 常用过滤表达式
ip.addr == 192.168.1.100 # 只看某个IP的流量
tcp.port == 443 # 只看443端口的TCP流量
udp.port == 53 # 只看DNS查询(UDP 53)
http.request.method == GET # 只看HTTP GET请求
tcp contains "login" # 查找TCP负载中包含"login"的包
6.5.3 实战:分析一个自定义协议
我记得有一次逆向一个IoT App,它跟设备通信用的是自定义TCP协议。Charles完全抓不到,因为不走HTTP。我只好用Wireshark抓包,发现数据包前4个字节是魔数(0xAA55),后面跟着长度字段和加密负载。
怎么分析的?
- 先过滤出目标IP和端口:
ip.addr == 设备IP && tcp.port == 12345 - 看数据包长度分布,发现大部分包长度在64-128字节之间
- 用「Follow TCP Stream」功能看完整会话
- 发现魔数后,写个Python脚本解析后续字节
6.6 知识体系总览
下面这张图总结了本章的核心逻辑,你一看就明白各个工具在什么场景下用。
6.7 避坑指南
最后分享几个我踩过的坑,你遇到了能少走弯路。
- 证书装了对但抓不到包? 检查一下App有没有做SSL Pinning(证书绑定)。很多金融类App会校验服务器证书指纹,Charles的假证书会被拒绝。解决办法是用Frida hook掉证书校验函数,或者用JustTrustMe模块。
- Wireshark抓了一堆包找不到目标? 先关掉所有无关App,只跑目标App。然后用
ip.addr == 目标IP过滤,如果不知道IP,先抓个DNS包看看它解析了哪个域名。 - UDP包全是乱码? 大概率是加密了。这时候别在流量分析上死磕,回去反编译App找加密算法和密钥。我遇到过用AES-ECB加密的UDP协议,密钥就硬编码在so文件里。
- 模拟器抓包总断连? 模拟器的网络栈跟真机不一样,有些App会检测模拟器环境。我建议用真机+USB共享网络的方式抓包,稳定很多。
公众号:蓝海资料掘金营,微信deep3321