应用安全 --- apk加固 之 抓包
移动端流量抓包全景图与分析指南
抓包的本质是成为客户端(App)与服务器之间的“中间人”(Man-in-the-Middle, MITM)。所有抓包方法都围绕如何实现这个MITM角色展开。面临的核心挑战是:1) 如何让流量流经你的代理;2) 如何解密HTTPS流量;3) 如何对抗App的各种反抓包措施。
一、抓包核心原理与基础方法
1. 标准HTTP/HTTPS代理抓包 (Charles/Fiddler/BurpSuite)
这是最常用、最基础的方法。
-
原理:在电脑上运行代理软件,手机网络设置手动代理,指向电脑的IP和代理端口。所有HTTP(S)流量会先发往代理软件,再由其转发。
-
配置步骤:
-
电脑代理软件开启HTTP代理(如
:8888
)。 -
手机连接同一Wi-Fi,设置代理为
<电脑IP>:8888
。 -
手机浏览器访问
chls.pro/ssl
,安装并信任Charles/Fiddler的CA证书。 -
在代理软件中配置SSL Proxying,将目标域名(如
*.example.com
)加入列表。
-
-
能抓到什么:配置成功后,所有未做抵抗的App的HTTP和HTTPS流量明文。
-
失败场景与原因:
-
现象:无数据、连接错误。
-
原因:App使用了
Proxy.NO_PROXY
或自定义OkHttpClient
绕过了系统代理。 -
现象:HTTPS请求显示为
CONNECT
隧道或乱码。 -
原因:证书未正确安装或SSL Proxying设置错误。
-
二、对抗进阶反抓包措施的方法
当基础方法失效时,就需要以下进阶方法。
2. VPN抓包 (Packet Capture/HttpCanary等)
-
原理:在手机本地安装一个VPN抓包App。该App创建一个本地VPN,将所有手机流量重定向到自身,完成抓包和解密后再通过真正的网络接口发出。它相当于一个在手机内部的代理。
-
优点:可绕过
Proxy.NO_PROXY
,因为VPN的层级比App的网络栈更底层。 -
缺点:
-
需要信任并安装其CA证书。
-
解密能力可能不如Charles/Fiddler强。
-
在高版本Android上,其他App可能检测到VPN连接而触发保护。
-
-
适用场景:对抗简单的代理检测,且不方便使用电脑代理的场景。
3. 路由镜像/端口镜像
-
原理:在网络路由器或交换机上做配置,将指定设备(手机)的所有网络流量复制一份发送到抓包电脑。这是最底层、最隐蔽的方法。
-
优点:完全无法被App检测,因为抓包行为发生在外部网络设备上,手机本身无任何感知。
-
缺点:
-
需要企业级路由器支持该功能。
-
抓到的HTTPS流量是加密的(TLS层),无法直接解密,除非同时拥有服务器的私钥或成功降级协议。
-
-
适用场景:企业内网安全监控、分析无法破解的强加密通信(尽管看不到明文,但可以分析流量大小、时序等元数据)。
三、高级对抗:SocksDroid + Charles SOCKS5
这正是您提到的场景,它是解决特定强对抗的利器。
1. 核心原理
-
SocksDroid:它是一个在Android上运行的VPN应用。但它的目的不是抓包,而是将手机的所有TCP流量透明地转发到另一个SOCKS5代理服务器(比如你的Charles)。
-
Charles:Charles不仅是一个HTTP代理,也内置了一个SOCKS5代理服务器。
-
工作流程:
App -> (绕过系统代理) -> 系统网络栈 -> SocksDroid VPN -> SOCKS5协议封装 -> Charles的SOCKS5端口 -> Charles解密、显示 -> 转发至目标服务器
-
为何能绕过:App代码只能控制是否使用HTTP代理,但它无法控制或感知一个VPN将它所有的原始TCP流量转发到哪里。
Proxy.NO_PROXY
对此方案完全无效。
2. 使用场景
当且仅当你确认App使用了强代理检测(如Proxy.NO_PROXY
)导致基础代理方法完全抓不到任何包时,使用此方案。它是专门用来对付这类情况的“杀手锏”。
3. 详细配置步骤
-
电脑端(Charles):
-
打开Charles,确保SOCKS5代理开启。
-
Proxy -> Proxy Settings... -> SOCKS Proxy
-
勾选
Enable SOCKS proxy
,记住端口号(默认1080
)。 -
关键:关闭之前的HTTP代理或使用其他端口,避免冲突。
-
-
手机端(SocksDroid):
-
安装SocksDroid。
-
打开App,在
SOCKS5 Server
中填写:-
Host
: 你电脑的IP地址。 -
Port
: Charles中设置的SOCKS5端口(如1080
)。
-
-
点击
START
按钮启动VPN服务。
-
-
手机端(网络设置):
-
必须移除之前在Wi-Fi设置中配置的手动HTTP代理!让网络恢复自动获取。
-
此时,手机的网络流量路径是:App -> SocksDroid VPN -> Charles SOCKS5 -> Internet。
-
-
证书:
-
Charles的CA证书仍需在手机上安装并信任(对于HTTPS解密)。
-
4. 可能遇到的问题
-
Charles看不到流量:检查电脑防火墙是否放行了SOCKS5端口(
1080
);检查IP地址是否正确。 -
流量仍是加密的:检查Charles的SSL Proxying设置是否正确;检查手机是否已完全信任Charles的CA证书。
-
App仍检测到代理:极少数超级App可能会有VPN检测逻辑。此时可能需要结合Frida等手段绕过VPN检测。
四、总结与决策流程图
面对一个无法抓包的App,建议遵循以下排查路径:
flowchart TD
A[开始抓包] --> B{配置基础HTTP代理<br>及CA证书};
B -- 成功 --> C[抓包成功🎉];
B -- 失败 --> D{问题现象?};
D -- 无任何流量<br>连接错误 --> E[疑似代理检测<br>如Proxy.NO_PROXY];
E --> F[启用SocksDroid<br>+ Charles SOCKS5方案];
F --> G{SocksDroid方案成功?};
G -- 是 --> C;
G -- 否 --> H[可能存在VPN检测等更强对抗];
D -- 有流量但HTTPS是乱码 --> I[HTTPS解密失败];
I --> J[检查手机CA证书<br>是否已授予VPN/app?<br>检查Charles SSL Proxying设置];
J --> C;
H & I -- 最终手段 --> K[使用Frida/Xposed等Hook手段<br>禁用证书锁定、代理检测等逻辑];
K --> C;
最后,正如您敏锐指出的,“实际上是不需要逆向的”。这句话是金科玉律。绝大多数抓包问题通过正确的工具配置(尤其是证书)即可解决。只有当App使用了代码级的强化保护(SSL Pinning、自定义加密、代理检测)时,才需要祭出Frida等逆向工具进行对抗。始终遵循从简到繁的原则,避免把工具配置问题复杂化成逆向工程问题。