使用Wireshark抓包

前言

在正式開始本文前先來一段廢話.

工作中經(jīng)常會(huì)使用到自己沒有接觸過的技術(shù), 而后不斷的百度, 谷歌查詢, 不斷的摸索最終找到解決自己遇到的難題的解決方案. 每次都想寫一些總結(jié)分享一下, 但是總覺得自己文筆不佳, 而相關(guān)技術(shù)的文章網(wǎng)絡(luò)上多不勝數(shù), 也不缺自己寫的, 所以到最后總是不了了之

幾個(gè)月后回頭看一看自己做過的項(xiàng)目, 用過的技術(shù), 覺得又熟悉又陌生, 用過卻忘記了.

偶然聽同事說的一句話很受感觸: 寫文章寫總結(jié)并不一定要寫的多好, 更重要的是將自己遇到過的難題以及解決方案分享, 這樣當(dāng)別的 IT Guys在遇到相同難題時(shí), 能快速的定位和解決, 提高工作效率, 這才是分享精神. 想一下: 遇到個(gè)bug, 錯(cuò)誤的時(shí)候, 還不是從其他伙伴的總結(jié), 筆記里一個(gè)個(gè)方案摸索嘗試, 最后解決問題的呢?

以上總結(jié)一句話就是: 寫得不好, 不要吐槽我; 沒幫上你, 別罵我

說明

  1. 本文是講解如何以小白的姿勢(shì), 學(xué)習(xí)使用wireshark抓包, 本人是剛?cè)腴Twireshark的使用, 想更深入了解的請(qǐng)自行查詢其他資料;

  2. 本文重點(diǎn)講解的是Wireshark的一些簡(jiǎn)單操作, 例如:

  • 如何抓取指定網(wǎng)絡(luò)的數(shù)據(jù)包
  • 如果編寫過濾表達(dá)式
  • 如何分析抓取到的數(shù)據(jù)
  1. 本文講解如何抓取TCP和UDP協(xié)議的數(shù)據(jù)包; 使用電腦端和手機(jī)端互發(fā)消息, 然后抓取它們之間數(shù)據(jù), 手機(jī)和電腦處于同一網(wǎng)段下(連著同一個(gè)路由器);
  • 電腦端使用Java編寫的小程序, 用cmd 窗口做輸入輸出交互
  • 手機(jī)端使用安卓手機(jī)
  1. 本文演示的環(huán)境是Windows操作系統(tǒng)

軟件安裝

  1. 可以到百度上搜索 Wireshark, 然后點(diǎn)擊下載即可

  2. 點(diǎn)擊安裝, 一路Next即可

界面操作

  1. 安裝好Wireshark后, 進(jìn)入軟件, 你看到的是如下界面
wireshark_use_1.png

首先看到的是

  VirtualBox host-Only Network
  無(wú)線網(wǎng)絡(luò)連接
  VirtualBox host-Only Network #2
  VirtualBox host-Only Network #4
  ....

上面顯示的是當(dāng)前操作系統(tǒng)連接了哪些網(wǎng)絡(luò), 這些和你的電腦上

控制面板/網(wǎng)絡(luò)和Internet/網(wǎng)絡(luò)連接是一一對(duì)應(yīng)的
wireshark_use_2.png

現(xiàn)在, 我的手機(jī)和電腦同處于 無(wú)線網(wǎng)絡(luò)連接 下, 我需要抓取這個(gè)網(wǎng)絡(luò)的數(shù)據(jù)包, 鼠標(biāo)選中 無(wú)線網(wǎng)絡(luò)連接 后, 軟件左上角出現(xiàn)了一個(gè)藍(lán)色的弧形圖標(biāo)(文件) 下, 這個(gè)圖片的含義就是開始捕獲

wireshark_use_3.png

點(diǎn)擊開始捕獲后, 出現(xiàn)如下:

wireshark_use_4.png

可以看到, 軟件顯示數(shù)據(jù)模塊被分成了三個(gè)部分, 我們可以稱為 Top, Center和Bottom

  • Top顯示當(dāng)前網(wǎng)絡(luò)中傳遞數(shù)據(jù)的記錄的, 當(dāng)前網(wǎng)絡(luò)中每次傳遞的數(shù)據(jù)都會(huì)顯示到上面
  • Center顯示的是Top某一條記錄的詳細(xì)信息
  • Bottom則顯示Center中某一項(xiàng)數(shù)據(jù)的具體數(shù)據(jù)

還可以看到另外一個(gè)重要的輸入行: 在Top上 提示 "應(yīng)用顯示過濾器" 的輸入框, 用于輸入過濾表達(dá)式來從Top中海量的記錄過濾出我們想要的信息


來看一則抓取到的TCP消息


wireshark_use_5.png

先來看看過濾表達(dá)式:

tcp and ((ip.src == 192.168.31.113 and ip.dst == 192.168.31.225)or(ip.dst == 192.168.31.113 and ip.src == 192.168.31.225))

PS: 上面的過濾表達(dá)式等同于:
tcp && ((ip.src == 192.168.31.113 && ip.dst == 192.168.31.225) || (ip.dst == 192.168.31.113 && ip.src == 192.168.31.225))

含義是: 
1. 當(dāng)協(xié)議是TCP, 并且源地址IP是192.168.31.113, 目標(biāo)地址IP是192.168.31.225時(shí), 滿足過濾條件
2. 當(dāng)協(xié)議是TCP, 并且源地址IP是192.168.31.225, 目標(biāo)地址IP是192.168.31.113時(shí), 滿足過濾條件

過濾出來的記錄確實(shí)如此, Top中顯示的記錄:

Sourece表示是源地址IP
Destination表示的是目標(biāo)地址IP
Protocol表示的是通信協(xié)議
Length表示的是數(shù)據(jù)長(zhǎng)度(字節(jié)個(gè)數(shù))
Info 表示的是數(shù)據(jù)的詳細(xì)信息, 包含了協(xié)議的一些參數(shù), 通信雙方的端口號(hào), 我們發(fā)送的數(shù)據(jù)等等

另外, 本次抓取到的數(shù)據(jù), 其實(shí)是連接 TCP 的時(shí)候抓取到的, 我們都聽聞過TCP是經(jīng)過三次握手才建立連接, 今天終于見到它的廬山真面目

抓取TCP數(shù)據(jù)

本節(jié)來講解如何抓取TCP協(xié)議的數(shù)據(jù)

  1. 將我的電腦作為服務(wù)端, 手機(jī)作為客戶端, 手機(jī)去連接電腦, 連接成功后, 手機(jī)和電腦就可以相互發(fā)送消息了
  2. 電腦的IP是192.168.23.225, 端口號(hào)是23233
  3. 手機(jī)的IP是192.168.23.113, 隨機(jī)分配端口 

在Wireshark中添加過濾表達(dá)式

tcp && ((ip.src == 192.168.31.113 && ip.dst == 192.168.31.225) || (ip.dst == 192.168.31.113 && ip.src == 192.168.31.225))

首先, 要使用TCP傳遞數(shù)據(jù), 第一步是創(chuàng)建連接, PS: 以下代碼只是演示使用

  • 首先需要先運(yùn)行服務(wù)端程序
int serverPort = 23233;
ServerSocket serverSocket = new ServerSocket(serverPort);
Socket client = serverSocket.accept();  // 阻塞等待, 直到客戶端連接成功
  • 客戶端
Socket socket = new Socket();
String serverIp = "192.168.31.225";
InetAddress serverHost = InetAddress.getByName(serverIp);
int serverPort = 23233;
SocketAddress serverAddress = new InetSocketAddress(serverHost,serverPort);
socket.connect(serverAddress);    // 執(zhí)行這個(gè)方法后, 如果不拋出異常, 則連接服務(wù)端成功, 
  • 如果連接服務(wù)端程序成功, 則Wireshark抓取到的消息如下
image.png

看到了建立TCP連接的時(shí)候的三次握手, 來看看有什么數(shù)據(jù)可能是我們需要的呢?

1. 看第一次握手的發(fā)起方是192.168.31.113(手機(jī)端), 接收方是192.168.31.225(電腦端)
2. 看第二次握手的時(shí)候, Center里的消息, 看到Src Port是23233(上面說了設(shè)置給服務(wù)端的端口號(hào)), Dst Port是客戶端的端口號(hào)
3. 連接tcp的時(shí)候, 我們并沒有去發(fā)送什么數(shù)據(jù), 全部是協(xié)議底層自己實(shí)現(xiàn)的一些數(shù)據(jù)交互, 而這些數(shù)據(jù)我們不關(guān)心, 因此三次握手抓包意義應(yīng)該不大 

客戶端給服務(wù)端發(fā)送 "hello"

  • 客戶端發(fā)送數(shù)據(jù)
// 獲取與服務(wù)端的輸入流
OutputStream os = socket.getOutputStream();
// 準(zhǔn)備發(fā)送的信息
String msg = "hello";                           
// 給準(zhǔn)備發(fā)送的數(shù)據(jù)加一個(gè)換行符, 服務(wù)端以 '行' 的方式來讀取數(shù)據(jù)
msg += "\n";                                
// 以u(píng)tf-8的編碼寫出數(shù)據(jù)    
os.write(msg.getBytes("UTF-8"));                
// 將數(shù)據(jù)刷進(jìn)流中
os.flush();                                     
  • 服務(wù)端讀取數(shù)據(jù)
// 獲取與客戶端的字節(jié)輸入流
// 將字節(jié)輸入流轉(zhuǎn)成為編碼為utf-8的字符輸入流
BufferedReader reader = new BufferedReader(new InputStreamReader(
                client.getInputStream(), "UTF-8"));
String line = null;
// 讀取數(shù)據(jù)
while ((line = reader.readLine()) != null) {
    // 將接收到的數(shù)據(jù)打印到cmd控制臺(tái)上
    System.out.println("receive msg: "+line);
}
  • 抓取到的包
image.png

1. 從top可看出第一份數(shù)據(jù)是客戶端(ip:192.168.31.113,端口: 48983)發(fā)給服務(wù)端(ip:192.168.31.225,端口: 23233);
   服務(wù)端收到來自客戶端的消息后也客戶端反饋了一份數(shù)據(jù)(第二份數(shù)據(jù))

2. 選中top中的第一份數(shù)據(jù), 可以在center中看到數(shù)據(jù)的詳細(xì)信息: 
    a. src.ip, dst.ip
    b. src.port, dst.port
    c. data, 數(shù)據(jù)(6個(gè)字節(jié), 數(shù)據(jù)內(nèi)容為6865566c6c6f0a)
          拆成字節(jié)數(shù)組就是[68,65,56,6c,6c,6f,0a], 在這里字節(jié)是以十六進(jìn)制表示的, 轉(zhuǎn)成十進(jìn)制, 再轉(zhuǎn)成對(duì)應(yīng)的ascii碼表上的字符, 數(shù)據(jù)就是['h','e','l','l','o','\n']
    總結(jié)一下: data: 6865566c6c6f0a --每?jī)晌粸橐粋€(gè)字節(jié), 拆成字節(jié)數(shù)組-->[68,65,56,6c,6c,6f,0a]--將每個(gè)字節(jié)轉(zhuǎn)成十進(jìn)制, 再轉(zhuǎn)成對(duì)應(yīng)的ascii字符-->['h','e','l','l','o','\n']

是不是抓取到了TCP數(shù)據(jù)了呢?

抓取UDP數(shù)據(jù):

本節(jié)來講解如何抓取UDP協(xié)議的數(shù)據(jù)


UDP和TCP的傳輸方式不一樣, 但是抓取的方式卻是一樣的, 只需要修改一下過濾表達(dá)式, 就可以帥選出UDP協(xié)議的數(shù)據(jù)包

UDP協(xié)議面向無(wú)連接, 所謂面向無(wú)連接, 也就是說不管對(duì)方存不存在, 它都可以向?qū)Ψ桨l(fā)送數(shù)據(jù), 當(dāng)然, 如果接收方不在, 數(shù)據(jù)就會(huì)被丟失了, 所以, 使用UDP發(fā)送數(shù)據(jù), 沒有三次握手, 也沒有想TCP那樣, 接收到消息后, 對(duì)方還會(huì)反饋一個(gè)數(shù)據(jù)


  • 首先來編寫一個(gè)過濾表達(dá)式;
我要過濾所有發(fā)送給本機(jī)(ip:192.168.31.225, 端口號(hào)為10086)的udp數(shù)據(jù)
udp && ip.dst == 192.168.31.225 && udp.port == 10086
  • 接收端程序
int port = 10086;
DatagramSocket datagramSocket = new DatagramSocket(port);
byte[] buffer = new byte[1024 * 8];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
datagramSocket.receive(packet);  // 這個(gè)方法會(huì)阻塞直到接收到一個(gè)udp消息
byte[] data = packet.getData();
int length = packet.getLength();
int offset = packet.getOffset();
InetAddress remoteAddress = packet.getAddress();  // 遠(yuǎn)程發(fā)送端的ip地址
int remotePort = packet.getPort();    // 遠(yuǎn)程發(fā)送端的端口
System.out.println("remoteIp: " + remoteAddress.getHostAddress()
                + ", remotePort: " + remotePort 
                + ", Msg: " + (new String(data, offset, length)));
  • 發(fā)送端程序
DatagramSocket datagramSocket = new DatagramSocket();
String msg = "hello udp";
String toIp = "192.168.31.225";
int toPort = 10086; 
byte[] bytes = msg.getBytes();      
DatagramPacket packet = new DatagramPacket(
                bytes,0,bytes.length,           // 要發(fā)送的數(shù)據(jù)
                InetAddress.getByName(toIp),    // 要發(fā)送到哪個(gè)ip
                toPort);                        // 要發(fā)送到哪個(gè)端口上
datagramSocket.send(packet);
  • 抓包
image.png

可以看到,

  • top區(qū)顯示的僅一條數(shù)據(jù)記錄
  • udp發(fā)送端: ip: 192.168.31.214, 端口:16166
  • udp接收端: ip: 192.168.31.225, 端口:10086
  • center區(qū)顯示接收到的數(shù)據(jù)具有9個(gè)字節(jié), 數(shù)據(jù)是[68656c6c6f20756470]
  • bottom區(qū)可以看到數(shù)據(jù)是"hello udp"

編寫過濾表達(dá)式

Wireshark的過濾表達(dá)式, 就和我們一般寫的if語(yǔ)句的條件表達(dá)式一致
其中,

     and 和 && 含義一致, 表示 '并且'; 
     or 和 || 含義一致, 表示 '或者';
     udp 表示 udp協(xié)議
     tcp 表示 tcp協(xié)議
     udp.port == 10086 表示udp端口為10086
     tcp.port == 23233 表示tcp端口為23233
     ip.src == 192.168.31.225 數(shù)據(jù)發(fā)送端ip是192.168.31.225
     ip.dst == 192.168.31.113 數(shù)據(jù)接收端ip是192.168.31.113

來看幾個(gè)例子

  • 過濾ip為192.168.31.225設(shè)備, 端口為23233, 協(xié)議為tcp的數(shù)據(jù)包和端口為10086, 協(xié)議為udp的數(shù)據(jù)包
(ip.src == 192.168.31.225 or ip.dst == 192.168.31.225) and ( ((tcp) and tcp.port == 23233) or((udp) and udp.port == 10086))

注意事項(xiàng)

  • 需要注意的是:
    Wireshark抓取的是經(jīng)過本機(jī)網(wǎng)卡的數(shù)據(jù), 無(wú)論tcp還是udp, 如果接收端和發(fā)送端都是本機(jī), 那么是抓不到包的, 當(dāng)然解決方案是有的,

  • 解決方案:
    使用管理員權(quán)限運(yùn)行cmd, 執(zhí)行命令

route add 本機(jī)ip mask 255.255.255.255 網(wǎng)關(guān)ip

發(fā)送數(shù)據(jù)的時(shí)候, ip地址必須添加本機(jī)的ip, 而不應(yīng)該是127.0.0.1或localhost
當(dāng)結(jié)束調(diào)試的時(shí)候, 需要將靜態(tài)ip刪除

route delete 本機(jī)ip mask 網(wǎng)關(guān)ip

總結(jié)

  • 本文介紹了Wireshark的簡(jiǎn)單用法, 并分別演示了抓取TCP, UDP數(shù)據(jù)
  • 本文從另一個(gè)角度去驗(yàn)證了TCP的三次握手連接, 以及發(fā)送消息時(shí)的連接(TCP發(fā)送消息時(shí), 接收端也有反饋), 驗(yàn)證了UDP的面向無(wú)連接

后記

  • 使用Wireshark抓包并不是新技術(shù), 也不是什么黑科技. 看似能抓取到數(shù)據(jù), 不過現(xiàn)在傳遞的數(shù)據(jù)都是經(jīng)過加密的, 即便抓取到數(shù)據(jù)了, 也無(wú)法解析出來.

  • 比較有用的場(chǎng)景, 例如你在研究一個(gè)設(shè)備(例如攝像頭)與它的控制軟件之間的通訊協(xié)議, 你使用Wireshark抓包, 然后反推出它們之間的通訊協(xié)議; 再實(shí)現(xiàn)自己的需求.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,563評(píng)論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,694評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,672評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,965評(píng)論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,690評(píng)論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,019評(píng)論 1 329
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,013評(píng)論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,188評(píng)論 0 290
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,718評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,438評(píng)論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,667評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,149評(píng)論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,845評(píng)論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,252評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,590評(píng)論 1 295
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,384評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,635評(píng)論 2 380

推薦閱讀更多精彩內(nèi)容

  • 簡(jiǎn)介 用簡(jiǎn)單的話來定義tcpdump,就是:dump the traffic on a network,根據(jù)使用者...
    保川閱讀 5,981評(píng)論 1 13
  • 聊聊 tcpdump 與 Wireshark 抓包分析 1 起因 前段時(shí)間,一直在調(diào)線上的一個(gè)問題:線上應(yīng)用接受P...
    meng_philip123閱讀 21,517評(píng)論 4 36
  • 1.這篇文章不是本人原創(chuàng)的,只是個(gè)人為了對(duì)這部分知識(shí)做一個(gè)整理和系統(tǒng)的輸出而編輯成的,在此鄭重地向本文所引用文章的...
    SOMCENT閱讀 13,123評(píng)論 6 174
  • 努力是為了未來有更多選擇的機(jī)會(huì),選擇適合的生活而已
    不努力有什么意義閱讀 239評(píng)論 0 0
  • 講一個(gè)現(xiàn)象,現(xiàn)在越來越多的家長(zhǎng)吐槽,熊孩子是越來越難管了!他們不寫作業(yè)、不認(rèn)真聽課、天天只玩游戲等。他們不知道究竟...
    安伶兒閱讀 262評(píng)論 2 6