天天看點

關于fi dd ler 手機抓包 網卡位址位址_一篇不錯的網絡資料抓包

關于fi dd ler 手機抓包 網卡位址位址_一篇不錯的網絡資料抓包
關于fi dd ler 手機抓包 網卡位址位址_一篇不錯的網絡資料抓包

一 ,網絡抓包

Android 手機抓包 

adb shell tcpdump -p -vv -s 0 -w /sdcard/capture.pcap

adb pull /sdcard/capture.pcap

電腦模式:方法一

1.手機必須 ROOT 然後連接配接電腦 確定已經安裝驅動

2.下載下傳 tcpdump 

(tcpdump:http://www.strazzere.com/android/tcpdump)

3.然後将 tcpdump 複制到手機 /data/local/目錄裡

-a.直接在手機裡複制進去 然後修改 tcpdump 權限為讀寫

-b.使用 adb 指令 直接在電腦裡複制進去

-b.1 adb devices 擷取手機 ID

-b.2 adb root (如果提示 adbd cannot run as root in production builds) 提權

 解決方法:

 -b.2.1 使用 superuser 提權

 -b.2.2 如果 superuser 無法提權成功 表示手機 ROM 包原版已鎖 ROOT 必須手動在手機裡複制進去

-b.3 adb push [電腦裡 tcpdump 位置] [手機裡/data/local/目錄] (eg. adb push c:/tcpdump /data/local/tcpdump)

-b.4 adb shell 進入手機目錄

-b.5 su 提權 成功符号是# -b.6 chmod 777 /data/local/tcpdump 修改 tcpdump 權限

4.開始抓包

修改 tcpdump 權限全選上

打開電腦的 DOS 視窗

-adb shell

-su

-[tcpdump 路徑] -p -vv -s 0 -w [輸出位置] (eg. /data/local/tcpdump -p -vv -s 0 -w /sdcard/capture.pcap)

5.成功後 可以在手機裡開始操作要抓包的遊戲或軟體

6.抓完包後按 ctrl+c 停止

7.将手機裡的封封包件傳送到電腦上檢視

-adb pull[手機裡封包位置] [電腦上要存放的位置] (eg. adb pull /sdcard/capture.pcap c:/ok.pcap)

8.然後使用 WIRESHARK 開始分析封封包件

方法二

1.下載下傳 Fiddler 免 ROOT 然後手機連接配接電腦

(Fiddler:http://www.telerik.com/docs/default-source/fiddler/fiddler4setup.exe?sfvrsn=2 (NET.Framework 4))

2.打開 Fiddler 進行配置

-Tools 頁籤->Fiddler Options

-在 HTTPS 頁籤裡 選中"Decrypt https traffic" 和 "Ignore server certificate errors" (允許 Fidder 截取 HTTPS 包) -在 Connection 頁籤裡 選中 "Allow remote computers to connect" (允許截取到的封包網電腦上接收)

3.進行完配置後 點 OK 然後重新開機 Fiddler

4.确認電腦的 IP 位址 可以在 DOS 下使用 IPCONFIG 檢視或網絡連接配接裡檢視 (eg. 我的是 192.168.1.4)

5.手機打開 WIFI 連接配接清單 長按已經連接配接的 WIFI 會彈窗選項 選擇"修改網絡"

6.選中顯示進階選項 然後按 “代理設定” 選擇手動

7."代理伺服器主機名" 寫上電腦的 IP 位址 (eg. 192.168.1.4) 端口 預設為 8888 設定完畢點儲存

8.在手機裡打開遊覽器 輸入 192.168.1.4:8888 如果通路成功會看到"Fiddler Echo Service"

9.然後往下些會看到 FiddlerRoot certificate (這是證書) 點選下載下傳到 SDCARD 根目錄

10.然後在手機的 設定-> 安全 裡面有個證書安裝 點一下 如果沒設定過密碼 在安裝的時候會提示要先設定一個密碼 如果已設定過密碼 必須輸入密

碼才能進入

11.設定玩密碼後可以開始安裝 安裝成功後就可以收到 HTTPS 包 如果沒安裝證書 隻能手到 HTTP 包

12.現在可以開始運作要抓包的遊戲或軟體了 Fiddler 會截取 

手機模式:

1.到 Google 商店下載下傳 Shark 和 Shark Reader 手機必須 ROOT 

(shark root:https://play.google.com/store/apps/details?id=lv.n3o.shark)

(shark reader:https://play.google.com/store/apps/details?id=lv.n3o.sharkreader)

2.安裝完畢後打開 運作軟體獲得 ROOT 權限

3.點 START 就可以開始抓包了

4.抓完包後點 "open capture file"即可檢視

tcpdump 的使用,包括 http 抓包 

簡介

用簡單的話來定義 tcpdump,就是:dump the traffic on a network,根據使用者的定義對網絡上的資料包進行截獲的包分析工具。tcpdump 可以将網絡中傳送的資料包的“頭”完全截獲下來提供分析。它支 持針對網絡層、協定、主機、網絡或端口的過

濾,并提供 and、or、not 等邏輯語句來幫助你去掉無用的資訊。

實用指令執行個體tcpdump tcp -i eth0 -t -s 0 and port 8080 -w ./bb.cap ,然後下載下傳到 windows ,wireshak 打開即可【本人測試,OK】預設啟動tcpdump普通情況下,直接啟動 tcpdump 将監視第一個網絡接口上所有流過的資料包。

監視指定網絡接口的資料包

tcpdump -i eth1

如果不指定網卡,預設 tcpdump 隻會監視第一個網絡接口,一般是 eth0,下面的例子都沒有指定網絡接口。

監視指定主機的資料包

列印所有進入或離開 sundown 的資料包.

tcpdump host sundown

也可以指定 ip,例如截獲所有 210.27.48.1 的主機收到的和發出的所有的資料包tcpdump host 210.27.48.1

列印 helios 與 hot 或者與 ace 之間通信的資料包

tcpdump host helios and \( hot or ace \)

截獲主機 210.27.48.1 和主機 210.27.48.2 或 210.27.48.3 的通信tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \) 

列印 ace 與任何其他主機之間通信的 IP 資料包, 但不包括與 helios 之間的資料包.

tcpdump ip host ace and not helios

如果想要擷取主機 210.27.48.1 除了和主機 210.27.48.2 之外所有主機通信的 ip 包,使用指令:

tcpdump ip host 210.27.48.1 and ! 210.27.48.2

截獲主機 hostname 發送的所有資料

tcpdump -i eth0 src host hostname

監視所有送到主機 hostname 的資料包

tcpdump -i eth0 dst host hostname

監視指定主機和端口的資料包

如果想要擷取主機 210.27.48.1 接收或發出的 telnet 包,使用如下指令

tcpdump tcp port 23 host 210.27.48.1

對本機的 udp 123 端口進行監視 123 為 ntp 的服務端口

tcpdump udp port 123 

監視指定網絡的資料包

列印本地主機與 Berkeley 網絡上的主機之間的所有通信資料包(nt: ucb-ether, 此處可了解為'Berkeley 網絡'的網絡位址,此表

達式最原始的含義可表達為: 列印網絡位址為 ucb-ether 的所有資料包)tcpdump net ucb-ether

列印所有通過網關 snup 的 ftp 資料包(注意, 表達式被單引号括起來了, 這可以防止 shell 對其中的括号進行錯誤解析)

tcpdump 'gateway snup and (port ftp or ftp-data)'列印所有源位址或目标位址是本地主機的 IP 資料包

(如果本地網絡通過網關連到了另一網絡, 則另一網絡并不能算作本地網絡.(nt: 此句翻譯曲折,需補充).localnet 實際使用時要真正替換成本地網絡的名字)

tcpdump ip and not net localnet

監視指定協定的資料包

列印 TCP 會話中的的開始和結束資料包, 并且資料包的源或目的不是本地網絡上的主機.(nt: localnet, 實際使用時要真正替換成本地網絡的名字))tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0 and not src and dst net localnet'列印所有源或目的端口是 80, 網絡層協定為 IPv4, 并且含有資料,而不是 SYN,FIN 以及 ACK-only 等不含資料的資料包.(ipv6 的版本的表達式可做練習)tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'(nt: 可了解為, ip[2:2]表示整個 ip 資料包的長度, (ip[0]&0xf)<<2)表示 ip 資料包標頭的長度(ip[0]&0xf 代表包中的 IHL 域, 而此域的機關為 32bit, 要換算成位元組數需要乘以 4, 即左移 2. (tcp[12]&0xf0)>>4 表示 tcp 頭的長度, 此域的機關也是 32bit, 換算成比特數為((tcp[12]&0xf0) >> 4) << 2, 即 ((tcp[12]&0xf0)>>2). ((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0 表示: 整個 ip 資料包的長度減去ip 頭的長度,再減去tcp 頭的長度不為 0, 這就意味着, ip 資料包中确實是有資料.對于 ipv6 版本隻需考慮 ipv6 頭中的'Payload Length' 與 'tcp 頭的長度'的內插補點, 并且其中表達方式'ip[]'需換成'ip6[]'.)

列印長度超過 576 位元組, 并且網關位址是 snup 的 IP 資料包

tcpdump 'gateway snup and ip[2:2] > 576'

列印所有 IP 層廣播或多點傳播的資料包, 但不是實體以太網層的廣播或多點傳播資料報

tcpdump 'ether[0] & 1 = 0 and ip[16] >= 224'

列印除'echo request'或者'echo reply'類型以外的 ICMP 資料包( 比如,需要列印所有非 ping 程式産生的資料包時可用到此表達式 .

(nt: 'echo reuqest' 與 'echo reply' 這兩種類型的 ICMP 資料包通常由 ping 程式産生))

tcpdump 'icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply'tcpdump 與 wireshark

Wireshark(以前是 ethereal)是 Windows 下非常簡單易用的抓包工具。但在 Linux 下很難找到一個好用的圖形化抓包工具。

還好有 Tcpdump。我們可以用 Tcpdump + Wireshark 的完美組合實作:在 Linux 裡抓包,然後在 Windows 裡分析包。

tcpdump tcp -i eth1 -t -s 0 -c 100 and dst port ! 22 and src net 192.168.1.0/24 -w ./target.cap

(1)tcp: ip icmp arp rarp 和 tcp、udp、icmp 這些選項等都要放到第一個參數的位置,用來過濾資料報的類型

(2)-i eth1 : 隻抓經過接口 eth1 的包

(3)-t : 不顯示時間戳

(4)-s 0 : 抓取資料包時預設抓取長度為 68 位元組。加上-S 0 後可以抓到完整的資料包

(5)-c 100 : 隻抓取 100 個資料包

(6)dst port ! 22 : 不抓取目标端口是 22 的資料包

(7)src net 192.168.1.0/24 : 資料包的源網絡位址為 192.168.1.0/24

(8)-w ./target.cap : 儲存成 cap 檔案,友善用 ethereal(即 wireshark)分析

使用 tcpdump 抓取 HTTP 包

tcpdump -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854

0x4745 為"GET"前兩個字母"GE",0x4854 為"HTTP"前兩個字母"HT"。

tcpdump 對截獲的資料并沒有進行徹底解碼,資料包内的大部分内容是使用十六進制的形式直接列印輸出的。顯然這不利于分析網絡故障,通常的解決辦法是先使用帶-w 參 數的 tcpdump 截獲資料并儲存到檔案中,然後再使用其他程式(如 Wireshark)進行解碼分析。當然也應該定義過濾規則,以避免捕獲的資料包填滿整個硬碟。

輸出資訊含義

首先我們注意一下,基本上 tcpdump 總的的輸出格式為:系統時間 來源主機.端口 > 目标主機.端口 資料包參數

tcpdump 的輸出格式與協定有關.以下簡要描述了大部分常用的格式及相關例子.

鍊路層頭 

對于 FDDI 網絡, '-e' 使 tcpdump 列印出指定資料包的'frame control' 域, 源和目的位址, 以及包的長度.(frame control域控制對包中其他域的解析). 一般的包(比如那些 IP datagrams)都是帶有'async'(異步标志)的資料包,并且有取值 0 到 7 的優先級;

比如 'async4'就代表此包為異步資料包,并且優先級别為 4. 通常認為,這些包們會内含一個 LLC 包(邏輯鍊路控制包); 這時,如果此包不是一個 ISO datagram 或所謂的 SNAP 包,其 LLC 頭部将會被列印(nt:應該是指此包内含的 LLC 包的標頭).

對于 Token Ring 網絡(令牌環網絡), '-e' 使 tcpdump 列印出指定資料包的'frame control'和'access control'域, 以及源和目的位址,外加包的長度. 與 FDDI 網絡類似, 此資料包通常内含 LLC 資料包. 不管 是否有'-e'選項.對于此網絡上的'source-routed'類型資料包(nt:意譯為:源位址被追蹤的資料包,具體含義未知,需補充), 其包的源路由資訊總會被列印.

對于 802.11 網絡(WLAN,即 wireless local area network), '-e' 使 tcpdump 列印出指定資料包的'frame control 域,標頭中包含的所有位址, 以及包的長度.與 FDDI 網絡類似, 此資料包通常内含 LLC 資料包. (注意: 以下的描述會假設你熟悉 SLIP 壓縮算法 (nt:SLIP 為 Serial Line Internet Protocol.), 這個算法可以在RFC-1144 中找到相關的蛛絲馬迹.)

對于 SLIP 網絡(nt:SLIP links, 可了解為一個網絡, 即通過串行線路建立的連接配接, 而一個簡單的連接配接也可看成一個網絡),資料包的'direction indicator'('方向訓示标志')("I"表示入, "O"表示出), 類型以及壓縮資訊将會被列印. 包類型會被首先列印.

類型分為 ip, utcp 以及 ctcp(nt:未知, 需補充). 對于 ip 包,連接配接資訊将不被列印(nt:SLIP 連接配接上,ip 包的連接配接資訊可能無用或沒有定義.

reconfirm).對于 TCP 資料包, 連接配接辨別緊接着類型表示被列印. 如果此包被壓縮, 其被編碼過的頭部将被列印.

此時對于特殊的壓縮包,會如下顯示:

*S+n 或者 *SA+n, 其中 n 代表包的(順序号或(順序号和應答号))增加或減少的數目(nt | rt:S,SA 拗口, 需再譯).

對于非特殊的壓縮包,0 個或更多的'改變'将會被列印.'改變'被列印時格式如下: '标志'+/-/=n 包資料的長度 壓縮的頭部長度.

其中'标志'可以取以下值:

U(代表緊急指針), W(指緩沖視窗), A(應答), S(序列号), I(包 ID),而增量表達'=n'表示被賦予新的值, +/-表示增加或減少.

比如, 以下顯示了對一個外發壓縮 TCP 資料包的列印, 這個資料包隐含一個連接配接辨別(connection identifier); 應答号增加了 6,順序号增加了 49, 包 ID 号增加了 6; 包資料長度為 3 位元組(octect), 壓縮頭部為 6 位元組.(nt:如此看來這應該不是一個特殊的壓縮資料包).

ARP/RARP 資料包

tcpdump 對 Arp/rarp 包的輸出資訊中會包含請求類型及該請求對應的參數. 顯示格式簡潔明了. 以下是從主機 rtsg 到主機csam 的'rlogin'

(遠端登入)過程開始階段的資料包樣例:

arp who-has csam tell rtsg

arp reply csam is-at CSAM

第一行表示:rtsg 發送了一個 arp 資料包(nt:向全網段發送,arp 資料包)以詢問 csam 的以太網位址

Csam(nt:可從下文看出來, 是 Csam)以她自己的以太網位址做了回應(在這個例子中, 以太網位址以大寫的名字辨別, 而internet位址(即 ip 位址)以全部的小寫名字辨別).

如果使用 tcpdump -n, 可以清晰看到以太網以及 ip 位址而不是名字辨別:

arp who-has 128.3.254.6 tell 128.3.254.68

arp reply 128.3.254.6 is-at 02:07:01:00:01:c4

如果我們使用 tcpdump -e, 則可以清晰的看到第一個資料包是全網廣播的, 而第二個資料包是點對點的:

RTSG Broadcast 0806 64: arp who-has csam tell rtsg

CSAM RTSG 0806 64: arp reply csam is-at CSAM

第一個資料包表明:以 arp 包的源以太位址是 RTSG, 目标位址是全以太網段, type 域的值為 16 進制 0806(表示ETHER_ARP(nt:arp 包的類型辨別)),包的總長度為 64 位元組.

TCP 資料包 (注意:以下将會假定你對 RFC-793 所描述的 TCP 熟悉. 如果不熟, 以下描述以及 tcpdump 程式可能對你幫助不大.(nt:警告可忽略,隻需繼續看, 不熟悉的地方可回頭再看.).

通常 tcpdump 對 tcp 資料包的顯示格式如下:

src > dst: flags data-seqno ack window urgent options

src 和 dst 是源和目的 IP 位址以及相應的端口. flags 标志由 S(SYN), F(FIN), P(PUSH, R(RST),W(ECN CWT(nt | rep:未知, 需補充))或者 E(ECN-Echo(nt | rep:未知, 需補充))組成,單獨一個'.'表示沒有 flags 辨別. 資料段順序号(Data-seqno)描述了此包中資料所對應序列号空間中的一個位置(nt:整個資料被分段,每段有一個順序号, 所有的順序号構成一個序列号空間)(可參考以下例子). Ack 描述的是同一個連接配接,同一個方向,下一個本端應該接收的(對方應該發送的)資料片段的順序号. Window 是本端可用的資料接收緩沖區的大小(也是對方發送資料時需根據這個大小來組織資料).

Urg(urgent) 表示資料包中有緊急的資料. options 描述了 tcp 的一些選項, 這些選項都用尖括号來表示(如 ).

src, dst 和 flags 這三個域總是會被顯示. 其他域的顯示與否依賴于 tcp 協定頭裡的資訊.

這是一個從 trsg 到 csam 的一個 rlogin 應用登入的開始階段.

rtsg.1023 > csam.login: S 768512:768512(0) win 4096

csam.login > rtsg.1023: S 947648:947648(0) ack 768513 win 4096 rtsg.1023 > csam.login: . ack 1 win 4096

rtsg.1023 > csam.login: P 1:2(1) ack 1 win 4096

csam.login > rtsg.1023: . ack 2 win 4096

rtsg.1023 > csam.login: P 2:21(19) ack 1 win 4096

csam.login > rtsg.1023: P 1:2(1) ack 21 win 4077

csam.login > rtsg.1023: P 2:3(1) ack 21 win 4077 urg 1

csam.login > rtsg.1023: P 3:4(1) ack 21 win 4077 urg 1

第一行表示有一個資料包從 rtsg 主機的 tcp 端口 1023 發送到了 csam 主機的 tcp 端口 login 上(nt:udp 協定的端口和 tcp 協定的端口是分别的兩個空間, 雖然取值範圍一緻). S 表示設定了 SYN 标志. 包的順序号是 768512, 并且沒有包含資料.(表示格式為:'first:last(nbytes)', 其含義是'此包中資料的順序号從 first 開始直到 last 結束,不包括 last. 并且總共包含 nbytes的使用者資料'.) 沒有捎帶應答(nt:從下文來看,第二行才是有捎帶應答的資料包), 可用的接受視窗的大小為 4096bytes, 并且請求端(rtsg)的最大可接受的資料段大小是 1024 位元組(nt:這個資訊作為請求發向應答端 csam, 以便雙方進一步的協商).Csam 向 rtsg 回複了基本相同的 SYN 資料包, 其差別隻是多了一個' piggy-backed ack'(nt:捎帶回的 ack 應答, 針對 rtsg的 SYN 資料包).rtsg 同樣針對 csam 的 SYN 資料包回複了一 ACK 資料包作為應答. '.'的含義就是此包中沒有标志被設定. 由于此應答包中不含有資料, 是以包中也沒有資料段序列号. 提醒! 此 ACK 資料包的順序号隻是一個小整數 1. 有如下解釋:tcpdump 對于一個 tcp 連接配接上的會話, 隻列印會話兩端的初始資料包的序列号,其後相應資料包隻列印出與初始包序列号的差異.即初始序列号之後的序列号, 可被看作此會話上目前

所傳資料片段在整個要傳輸的資料中的'相對位元組'位置(nt:雙方的第一個位置都是 1, 即'相對位元組'的開始編号). '-S'将覆寫這個功能,使資料包的原始順序号被列印出來.

第六行的含義為:rtsg 向 csam 發送了 19 位元組的資料(位元組的編号為 2 到 20,傳送方向為 rtsg 到 csam). 包中設定了 PUSH 标 志. 在第 7 行,csam 喊到, 她已經從 rtsg 中收到了 21 以下的位元組, 但不包括 21 編号的位元組. 這些位元組存放在 csam 的 socket 的接收緩沖中, 相應地,csam 的接收緩沖視窗大小會減少 19 位元組(nt:可以從第 5 行和第 7 行 win 屬性值的變化看出來). csam 在第 7 行這個包中也向rtsg 發送了一個位元組. 在第 8 行和第 9 行, csam 繼續向 rtsg 分别發送了兩個隻包含一個位元組的資料包, 并且這個資料包帶 PUSH 标志.

如果所抓到的 tcp 包(nt:即這裡的 snapshot)太小了,以至 tcpdump 無法完整得到其頭部資料, 這時, tcpdump 會盡量解析這個不完整的頭,并把剩下不能解析的部分顯示為'[|tcp]'. 如果頭部含有虛假的屬性資訊(比如其長度屬性其實比頭部實際長度長或短), tcpdump 會為該頭部顯示'[bad opt]'. 如果頭部的長度告訴我們某些選項(nt | rt:從下文來看, 指 tcp 包的頭部中針對 ip 包的一些選項, 回頭再翻)會在此包中,

而真正的 IP(資料包的長度又不夠容納這些選項, tcpdump 會顯示'[bad hdr length]'.抓取帶有特殊标志的的 TCP 包(如 SYN-ACK 标志, URG-ACK 标志等).

在 TCP 的頭部中, 有 8 比特(bit)用作控制位區域, 其取值為:

CWR | ECE | URG | ACK | PSH | RST | SYN | FIN(nt | rt:從表達方式上可推斷:這 8 個位是用或的方式來組合的, 可回頭再翻)現假設我們想要監控建立一個 TCP 連接配接整個過程中所産生的資料包. 可回憶如下:TCP 使用 3 次握手協定來建立一個新的連接配接; 其與此三次握手連接配接順序對應,并帶有相應 TCP 控制标志的資料包如下:

1) 連接配接發起方(nt:Caller)發送 SYN 标志的資料包

2) 接收方(nt:Recipient)用帶有 SYN 和 ACK 标志的資料包進行回應

3) 發起方收到接收方回應後再發送帶有 ACK 标志的資料包進行回應

0 15 31

-----------------------------------------------------------------

| source port | destination port |

-----------------------------------------------------------------

| sequence number |

-----------------------------------------------------------------

| acknowledgment number |

-----------------------------------------------------------------

| HL | rsvd |C|E|U|A|P|R|S|F| window size |

-----------------------------------------------------------------

| TCP checksum | urgent pointer |

-----------------------------------------------------------------

一個 TCP 頭部,在不包含選項資料的情況下通常占用 20 個位元組(nt | rt:options 了解為選項資料,需回譯). 第一行包含 0 到 3 編号的位元組,第二行包含編号 4-7 的位元組.

如果編号從 0 開始算, TCP 控制标志位于 13 位元組(nt:第四行左半部分).

0 7| 15| 23| 31

----------------|---------------|---------------|----------------

| HL | rsvd |C|E|U|A|P|R|S|F| window size |

----------------|---------------|---------------|----------------

| | 13th octet | | |

讓我們仔細看看編号 13 的位元組:

| |

|---------------|

|C|E|U|A|P|R|S|F|

|---------------|

|7 5 3 0|

這裡有我們感興趣的控制标志位. 從右往左這些位被依次編号為 0 到 7, 進而 PSH 位在 3 号, 而 URG 位在 5 号.

提醒一下自己, 我們隻是要得到包含 SYN 标志的資料包. 讓我們看看在一個包的標頭中, 如果 SYN 位被設定, 到底在 13 号位元組發生了什麼:

|C|E|U|A|P|R|S|F|

|---------------|

|0 0 0 0 0 0 1 0|

|---------------|

|7 6 5 4 3 2 1 0|

在控制段的資料中, 隻有比特 1(bit number 1)被置位.

假設編号為 13 的位元組是一個 8 位的無符号字元型,并且按照網絡位元組号排序(nt:對于一個位元組來說,網絡位元組序等同于主機位元組序), 其二進制值

如下所示:

00000010

并且其 10 進制值為:

0*2^7 + 0*2^6 + 0*2^5 + 0*2^4 + 0*2^3 + 0*2^2 + 1*2^1 + 0*2^0 = 2(nt: 1 * 2^6 表示 1 乘以 2 的 6 次方, 也許這樣更

清楚些, 即把原來表達中的指數 7 6 ... 0 挪到了下面來表達)

接近目标了, 因為我們已經知道, 如果資料標頭部中的 SYN 被置位, 那麼頭部中的第 13 個位元組的值為 2(nt: 按照網絡序, 即大頭方式, 最重要的位元組在前面(在前面,即該位元組實際記憶體位址比較小, 最重要的位元組,指數學表示中數的高位, 如 356 中的 3) ).表達為 tcpdump 能了解的關系式就是:

tcp[13] 2

進而我們可以把此關系式當作 tcpdump 的過濾條件, 目标就是監控隻含有 SYN 标志的資料包:

tcpdump -i xl0 tcp[13] 2 (nt: xl0 指網絡接口, 如 eth0)這個表達式是說"讓 TCP 資料包的第 13 個位元組擁有值 2 吧", 這也是我們想要的結果.

現在, 假設我們需要抓取帶 SYN 标志的資料包, 而忽略它是否包含其他标志.(nt:隻要帶 SYN 就是我們想要的). 讓我們來看看當一個含有

SYN-ACK 的資料包(nt:SYN 和 ACK 标志都有), 來到時發生了什麼:

|C|E|U|A|P|R|S|F|

|---------------|

|0 0 0 1 0 0 1 0|

|---------------|

|7 6 5 4 3 2 1 0|

13 号位元組的 1 号和 4 号位被置位, 其二進制的值為:

00010010

轉換成十進制就是:

0*2^7 + 0*2^6 + 0*2^5 + 1*2^4 + 0*2^3 + 0*2^2 + 1*2^1 + 0*2 = 18(nt: 1 * 2^6 表示 1 乘以 2 的 6 次方, 也許這樣更清楚些, 即把原來表達中的指數 7 6 ... 0 挪到了下面來表達)現在, 卻不能隻用'tcp[13] 18'作為 tcpdump 的過濾表達式, 因為這将導緻隻選擇含有 SYN-ACK 标志的資料包, 其他的都被丢棄.

提醒一下自己, 我們的目标是: 隻要包的 SYN 标志被設定就行, 其他的标志我們不理會.

為了達到我們的目标, 我們需要把 13 号位元組的二進制值與其他的一個數做 AND 操作(nt:邏輯與)來得到 SYN 比特位的值. 目标是:隻要 SYN 被設定就行, 于是我們就把她與上 13 号位元組的 SYN 值(nt: 00000010).

00010010 SYN-ACK 00000010 SYN

AND 00000010 (we want SYN) AND 00000010 (we want SYN)

-------- --------

= 00000010 = 00000010

我們可以發現, 不管包的 ACK 或其他标志是否被設定, 以上的 AND 操作都會給我們相同的值, 其 10 進制表達就是 2(2 進制表達就是 00000010).

進而我們知道, 對于帶有 SYN 标志的資料包, 以下的表達式的結果總是真(true):

( ( value of octet 13 ) AND ( 2 ) ) ( 2 ) (nt: value of octet 13, 即 13 号位元組的值)靈感随之而來, 我們于是得到了如下的 tcpdump 的過濾表達式tcpdump -i xl0 'tcp[13] & 2 2'注意, 單引号或反斜杆(nt: 這裡用的是單引号)不能省略, 這可以防止 shell 對&的解釋或替換.

UDP 資料包 

UDP 資料包的顯示格式,可通過 rwho 這個具體應用所産生的資料包來說明:

actinide.who > broadcast.who: udp 84其含義為:actinide 主機上的端口 who 向 broadcast 主機上的端口 who 發送了一個 udp 資料包(nt: actinide 和 broadcast 都是指 Internet 位址).這個資料包承載的使用者資料為 84 個位元組.

一些 UDP 服務可從資料包的源或目的端口來識别,也可從所顯示的更高層協定資訊來識别. 比如, Domain Name service requests(DNS 請求, 在 RFC-1034/1035 中), 和 Sun RPC calls to NFS(對 NFS 伺服器所發起的遠端調用(nt: 即 Sun RPC),在 RFC-1050 中有對遠端調用的描述).UDP 名稱服務請求

(注意:以下的描述假設你對 Domain Service protoco(nt:在 RFC-103 中有所描述), 否則你會發現以下描述就是天書(nt:希臘文天書,不必理會, 吓吓你的, 接着看就行))

名稱服務請求有如下的格式:

src > dst: id op? flags qtype qclass name (len)

(nt: 從下文來看, 格式應該是 src > dst: id op flags qtype qclass? name (len))

比如有一個實際顯示為:

h2opolo.1538 > helios.domain: 3+ A? ucbvax.berkeley.edu. (37)

主機 h2opolo 向 helios 上運作的名稱伺服器查詢 ucbvax.berkeley.edu 的位址記錄(nt: qtype 等于 A). 此查詢本身的 id号為'3'. 符号'+'意味着遞歸查詢标志被設定(nt: dns 伺服器可向更高層 dns 伺服器查詢本伺服器不包含的位址記錄). 這個最終通過 IP 包發送的查詢請求資料長度為 37 位元組, 其中不包括 UDP 和 IP 協定的頭資料. 因為此查詢操作為預設值(nt | rt: normal one 的了解), op 字段被省略.

如果 op 字段沒被省略, 會被顯示在'3' 和'+'之間. 同樣, qclass 也是預設值, C_IN, 進而也沒被顯示, 如果沒被忽略, 她會被顯示在'A'之後.

異常檢查會在方括中顯示出附加的域: 如果一個查詢同時包含一個回應(nt: 可了解為, 對之前其他一個請求的回應), 并且此回應包含權威或附加記錄段,

ancount, nscout, arcount(nt: 具體字段含義需補充) 将被顯示為'[na]', '[nn]', '[nau]', 其中 n 代表合适的計數. 如果包中以下回應位(比如 AA 位, RA 位, rcode 位), 或者位元組 2 或 3 中任何一個'必須為 0'的位被置位(nt: 設定為 1), '[b2&3]=x' 将被顯示, 其中 x 表示頭部位元組 2 與位元組 3 進行與操作後的值.

UDP 名稱服務應答

對名稱服務應答的資料包,tcpdump 會有如下的顯示格式

src > dst: id op rcode flags a/n/au type class data (len)

比如具體顯示如下:

helios.domain > h2opolo.1538: 3 3/3/7 A 128.32.137.3 (273)

helios.domain > h2opolo.1537: 2 NXDomain* 0/1/0 (97)

第一行表示: helios 對 h2opolo 所發送的 3 号查詢請求回應了 3 條回答記錄(nt | rt: answer records), 3 條名稱伺服器記錄,

以及 7 條附加的記錄. 第一個回答記錄(nt: 3 個回答記錄中的第一個)類型為 A(nt: 表示位址), 其資料為 internet 位址128.32.137.3.

此回應 UDP 資料包, 包含 273 位元組的資料(不包含 UPD 和 IP 的頭部資料). op 字段和 rcode 字段被忽略(nt: op 的實際值為Query, rcode, 即response code 的實際值為 NoError), 同樣被忽略的字段還有 class 字段(nt | rt: 其值為 C_IN, 這也是 A 類型記錄預設取值)第二行表示: helios 對 h2opolo 所發送的 2 号查詢請求做了回應. 回應中, rcode 編碼為 NXDomain(nt: 表示不存在的域)), 沒有回答記錄,但包含一個名稱伺服器記錄, 不包含權威伺服器記錄(nt | ck: 從上文來看, 此處的 authority records 就是上文中對應的additionalrecords). '*'表示權威伺服器回答标志被設定(nt: 進而 additional records 就表示的是 authority records).

由于沒有回答記錄, type, class, data 字段都被忽略.

flag 字段還有可能出現其他一些字元, 比如'-'(nt: 表示可遞歸地查詢, 即 RA 标志沒有被設定), '|'(nt: 表示被截斷的消息, 即 TC 标志被置位). 如果應答(nt | ct: 可了解為, 包含名稱服務應答的 UDP 資料包, tcpdump 知道這類資料包該怎樣解析其資料)的

'question'段一個條目(entry)都不包含(nt: 每個條目的含義, 需補充),'[nq]' 會被列印出來.

要注意的是:名稱伺服器的請求和應答資料量比較大, 而預設的 68 位元組的抓取長度(nt: snaplen, 可了解為 tcpdump 的一個設定選項)可能不足以抓取資料包的全部内容. 如果你真的需要仔細檢視名稱伺服器的負載, 可以通過 tcpdump 的-s 選項來擴大 snaplen 值.