實戰|安卓上基于透明代理對特定APP抓包技巧
前言
本文結合多篇已有文章,基于iptables + redsocks2 + Charles,最終實現對安卓上特定APP進行抓包,且APP無感知
即APP不能通過檢查系統代理或者VPN來判斷是不是有抓包行為
步驟
首先先保存開機后的iptables,如果已經修改過,請重啟手機
iptables-save > /data/local/tmp/iptables.rules
要恢復iptables為之前的規則,則使用如下命令,或者重啟手機
iptables-restore /data/local/tmp/iptables.rules
使用如下命令,作用是:將uid為10428所請求的在0-65535端口上的tcp流量,轉發到127.0.0.1:16666,但是排除了來自127.0.0.1的請求
iptables -t nat -A OUTPUT -p tcp ! -d 127.0.0.1 -m owner --uid-owner 10428 --dport 0:65535 -j DNAT --to-destination 127.0.0.1:16666
要實現抓包,其中127.0.0.1:16666是一個透明代理的地址
然而根據已有文章可知,如果直接設置為Charles的透明代理地址,對于https將會出現invalid first line in request錯誤,只有http的請求數據會被正常解析
參考:利用 Redsocks 解決透明代理的遠程抓包問題
根據文章可知,借助redsocks進行轉發即可
我這里使用的是redsocks2,編譯參考:靜態交叉編譯 Android 的 redsocks2
這里直接使用編譯好的即可,也可以考慮自己編譯下,下載后解壓壓縮包
- https://fh0.github.io/assets/android-redsocks2.tgz
創建配置文件,名為redsocks.conf,內容如下:
base { log_debug = off; log_info = on; log = stderr; daemon = off; redirector = iptables;}
redsocks { bind = "127.0.0.1:16666"; relay = "192.168.1.14:8889"; type = socks5; autoproxy = 0; timeout = 13;}
其中bind就是透明代理地址,relay就是Charles的代理地址,更多詳細用法請查閱redsocks2的readme
注意配置文件的每一對{}后面都應該有一個空行,否則會提示unclosed section
現在把redsocks.conf和redsocks2_arm64推送到/data/local/tmp
然后在root用戶下運行redsocks2_arm64即可
adb push redsocks2_arm64 /data/local/tmp/redsocksadb shell chmod +x /data/local/tmp/redsocksadb shellsucd /data/local/tmp./redsocks
現在不出意外的話,Charles應該就能看到uid為10428所對應APP的全部tcp數據包了(除去來自127.0.0.1的請求)
如果是只想對特定端口抓包,那么應該使用-m multiport --dports 80,443這樣來限定一個或者多個端口
iptables -t nat -A OUTPUT -p tcp ! -d 127.0.0.1 -m owner --uid-owner 10428 -m multiport --dports 80,443 -j DNAT --to-destination 127.0.0.1:16666
總結
- 使用
iptables將來自特定uid的全部tcp流量轉到指定的透明代理上
iptables -t nat -A OUTPUT -p tcp ! -d 127.0.0.1 -m owner --uid-owner 10428 --dport 0:65535 -j DNAT --to-destination 127.0.0.1:16666
2. 使用redsocks將流量轉發到正向代理,如Charles的socks5代理
redsocks2_arm64下載地址如下
https://fh0.github.io/assets/android-redsocks2.tgz
redsocks.conf內容如下
base { log_debug = off; log_info = on; log = stderr; daemon = off; redirector = iptables;}
redsocks { bind = "127.0.0.1:16666"; relay = "192.168.1.14:8889"; type = socks5; autoproxy = 0; timeout = 13;}
其他補充:
- 安裝Charles證書到系統分區,Charles才能解密https
如果你發現了文章中的錯誤,請指出
效果

