无Root权限下如何拦截Android特定App的请求?
无Root权限下针对指定Android应用的mitmproxy流量拦截方案
以下是几种无需Root权限、类iptables风格的精准拦截方案,适配你已知目标应用包名的场景:
1. Android 10+ 原生应用级代理(最简便)
Android 10及以上版本支持通过ADB直接为单个应用设置专属代理,仅目标应用的流量会发送到mitmproxy,其他应用不受影响:
- 确认mitmproxy所在机器的局域网IP(需保证设备与mitmproxy机器处于同一网络)
- 执行ADB命令设置应用专属代理:
adb shell cmd netstats set proxy com.target.app <mitm-ip>:8080 - 取消代理可执行:
adb shell cmd netstats set proxy com.target.app null
此方案无需额外过滤逻辑,mitmproxy收到的所有请求均来自目标应用。
2. Shizuku + 轻量iptables规则(兼容低版本Android)
若设备为Android 7-9,无法使用原生应用级代理,可借助Shizuku获取临时系统权限,实现类似Root下的iptables流量过滤:
- 安装Shizuku并通过USB调试完成授权(无需Root,仅需开启开发者选项与USB调试)
- 获取目标应用的UID:
adb shell dumpsys package com.target.app | grep -E "userId=[0-9]+" - 通过Shizuku执行iptables规则,将目标UID的HTTP/HTTPS流量重定向到mitmproxy:
shizuku iptables -t nat -A OUTPUT -m owner --uid-owner <目标应用UID> -p tcp --dport 80 -j REDIRECT --to-port 8080 shizuku iptables -t nat -A OUTPUT -m owner --uid-owner <目标应用UID> -p tcp --dport 443 -j REDIRECT --to-port 8080 - 清理规则可执行:
shizuku iptables -t nat -D OUTPUT -m owner --uid-owner <目标应用UID> -p tcp --dport 80 -j REDIRECT --to-port 8080 shizuku iptables -t nat -D OUTPUT -m owner --uid-owner <目标应用UID> -p tcp --dport 443 -j REDIRECT --to-port 8080
3. mitmproxy脚本辅助过滤(配合全局代理)
若必须使用全局代理,可编写mitmproxy脚本,结合ADB获取的应用UID对应的网络特征过滤请求:
- 获取目标应用的UID(同方案2步骤2)
- 编写mitmproxy脚本(
filter_app.py),通过客户端来源IP判断是否为目标应用流量:from mitmproxy import http # 替换为目标应用的UID TARGET_UID = 10123 def request(flow: http.HTTPFlow) -> None: client_ip = flow.client_conn.address[0] # 提前通过adb shell netstat获取目标应用对应的网络IP,此处示例省略IP映射逻辑 if not is_target_app_ip(client_ip): flow.kill() - 启动mitmproxy时加载脚本:
mitmproxy -s filter_app.py
必备前置操作
- 确保目标应用信任mitmproxy的CA证书:将mitmproxy导出的证书(
~/.mitmproxy/mitmproxy-ca-cert.pem)安装到设备的用户证书目录 - 若应用开启SSL Pinning,需用Frida注入脚本绕过(无需Root,仅需USB调试),例如使用通用的
just-trust-me脚本
内容的提问来源于stack exchange,提问作者Lior Pollak
相关产品推荐
相关产品推荐

