安卓系統按應用/進程抓包方法

前言

日常科研生活中有許多抓取安卓手機上特定應用的純淨數據包的需求。目前常見的做法是通過應用設置,關閉其他非目標應用的網絡訪問權限(包括訪問WLAN和流量數據),只把目標應用的訪問網絡權限打開。這種方法具有一定的可行性,但是缺點在於無法去除關閉OS自己產生的流量,這還是會引入一些背景雜流。

本文提供的方法可以實現直接按進程/應用過濾數據包,可以捕獲完全純淨的應用數據。

本方法的技術路線如下:

  1. Android系統在用戶安裝好某個APP會,就會給這個APP分配一個設備內唯一的user id,這個user id的生存週期是從APP成功安裝開始到APP被用戶卸載結束。APP的包名和它的user id直接的映射關係可以在系統的/data/system/packages.xml文件得到,這個文件內容類似於如下,裏面就有package name和userId的映射關係。
    在這裏插入圖片描述

  2. 自Linux 2.6.14 開始,iptables的擴展就已經支持通過出站數據包的擁有者(進程的用戶名或用戶ID)來過濾數據包【1】,並將數據包打上相應的內核過濾標籤。當然只有使用socket api產生的網絡數據包纔有所謂的擁有者。ICMP啥的是沒有應用者一說的。

  3. 爲了將應用的入站數據包捕獲下來,可以通過iptables的connmark給流打上流標籤。

  4. 使用iptables把帶有流標籤的INPUT和OUTPUT的數據包丟到NFLOG的消息池裏面去,並指定消息池的標號。

  5. 使用tcpdump,從NFLOG的消息池中獲取相應的數據包。特定NFLOG消息池的數據包會首先被內容丟到一個名爲“NFLOG:標號”的虛擬網卡上,通過tcpdump –i 參數來指定從這個特定的虛擬網卡上抓包就可以獲取所需數據包了。從“NFLOG:標號”抓取的數據包,鏈路層頭是NFLOG的linux內核網絡過濾器的日誌頭,它和創建的以太網頭不同。網絡層、傳輸層、應用層是正常的,沒有被NFLOG改動。

系統要求

• libpcap 1.2.1 or newer (commit cc8520ff5294900d93509eaf843684c51af102a9)
• Linux Kernel with NFLOG (CONFIG_NETFILTER_XT_TARGET_NFLOG).
• Effective UID 0 (root) or the CAP_NET_ADMIN capability.(需要獲取Android設備的root權限),不想root自己真機的,可以使用模擬器,比如雷電模擬器,這個速度快,而且系統自帶root。

案例解說

  1. 捕獲安卓自帶的瀏覽器(com.android.browser)訪問youtube的流量。
    首先,獲取安卓自帶瀏覽器的用戶ID:10012
    在這裏插入圖片描述
    使用adb獲取帶root的shell:
adb root
adb shell

編寫iptables規則:

iptables -A OUTPUT -m owner --uid-owner 10012 -j CONNMARK --set-mark 10012
#把OUTPUT數據包裏面,用戶ID是10012的流打上10012的流標籤
iptables -A INPUT -m connmark --mark 10012 -j NFLOG --nflog-group 10012
#把入站流中帶有10012標籤的數據包放到nflog消息池中,消息池的標號爲10012
iptables -A OUTPUT -m connmark --mark 10012 -j NFLOG --nflog-group 10012
#把出站流中帶有10012標籤的數據包放到nflog消息池中,消息池的標號爲10012

最後捕獲數據包:

tcpdump -i nflog:10012 -w uid-10012.pcap

附件裏面有兩個pcap文件:browser-only.pcap是從nflog:10012抓取的,broswer-eth0.pcap是同一時刻從以太網卡抓取的。他們都是訪問youtube.com時的流量。

2. 捕獲Spotify登錄時的流量。
Spotify的包名:com.spotify.music,它的userID通過查看packages.xml文件可知是10157.

adb root
adb shell
iptables -A OUTPUT -m owner --uid-owner 10157 -j CONNMARK --set-mark 10157
#把OUTPUT數據包裏面,用戶ID是10157的流打上10157的流標籤
iptables -A INPUT -m connmark --mark 10157 -j NFLOG --nflog-group 10157
#把入站流中帶有10012標籤的數據包放到nflog消息池中,消息池的標號爲10012
iptables -A OUTPUT -m connmark --mark 10157 -j NFLOG --nflog-group 10157
#把出站流中帶有10157標籤的數據包放到nflog消息池中,消息池的標號爲10157
tcpdump -i nflog:10157 -w uid-10157.pcap

附件有兩個pcap: uid-10157.pcap和uid-10157-eth0.pcap。可以對比着看。

資源鏈接

【1】iptables-extensions文檔: http://ipset.netfilter.org/iptables-extensions.man.html

其他

如果tcpdump,頻繁出現 No buffer space avaiable的錯誤,考慮升級tcpdump同時使用-w 把數據包直接寫入文件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章