關(guān)于爬蟲,看這一篇就夠了!

閱讀本篇預(yù)計(jì)需要 6 分鐘
本文來自公眾號(hào):DeveloperPython
作者:馬超

抓包,我相信很多程序員對(duì)這個(gè)都不陌生。但真正抓過包或者了解其原理的并沒有幾個(gè)。

所以,這次我分享一篇關(guān)于抓包的文章,也算是對(duì)之前文章的一個(gè)重新梳理。

其中會(huì)介紹幾款簡單易用的工具以及針對(duì)目前互聯(lián)網(wǎng)主流的 Http 和 Https 網(wǎng)絡(luò)包進(jìn)行抓取并分析,最后也會(huì)分享下手機(jī)抓包得技術(shù)。

目前市面上比較火的幾個(gè)抓包工具有:Charles、Fiddler 以及 Wireshark。

1、抓包工具

Fiddler

這個(gè)是我之前在 Windows 時(shí)代經(jīng)常用的工具。而且當(dāng)時(shí)的 Fiddler 足以滿足了我的簡單抓包需求。

話說現(xiàn)在都更新到 Fiddler 4 了,如果用 Windows 的朋友可以試試這個(gè)。

Charles

自從換了 Mac 之后我就開始用這個(gè)工具,但有一點(diǎn)比較麻煩的就是這個(gè)款軟件是收費(fèi)的。

不過在我大天朝,如果你不是土豪那么就找找破解版。

Wireshark

這個(gè)工具比較牛逼,不過我不經(jīng)常用。這工具可以詳細(xì)的抓包網(wǎng)絡(luò)請(qǐng)求的三次握手,同時(shí)也支持 Spdy、tcp 直連等等的網(wǎng)絡(luò)協(xié)議。

如果你需要對(duì)網(wǎng)絡(luò)做一個(gè)比較深的抓取,那么建議使用這個(gè)。

(ps: 后臺(tái)回復(fù)對(duì)應(yīng)工具,會(huì)拿到破解版的下載地址)

2、抓取 Http、Https 包

2.1、 Http 包的步驟:

2.1.1、 清理 Charles 列表,讓抓包更加清晰

image

2.1.2、 以我的 CSDN 為例 (m694449212),在 Chrome 中打開我的博客,抓到需要的包

image

在 Structure 中找到 csdn 的包,如上圖。

2.1.3、 分析包

image

2.1.4、查看請(qǐng)求頭

image

其中比較重要的是 Cookie 字段,這是網(wǎng)站為了表示用戶身份、進(jìn)行 Session 跟蹤而存儲(chǔ)在用戶本地終端上的數(shù)據(jù)(通常是加密的)。

其次,Cookie 在我們爬蟲的時(shí)候也是一個(gè)必不可少的東西,那么如何自動(dòng)獲取 Cookie 呢?后面會(huì)講到。

2.1.5、 拿到返回的數(shù)據(jù) Response

image

CSDN 博客的返回?cái)?shù)據(jù)是 Html 的格式,其中每篇文章的地址都是通過跳轉(zhuǎn) href 來做的,因此我們可以通過正則表達(dá)式匹配,或者 XPath 來拿到 Href 再拼接 Host 生成一個(gè)絕對(duì)路徑的地址:

http://blog.csdn.net/m694449212/artlcle/details/31806139.這就是我的Blog中的一篇文章。

2.1.6、獲取 Cookie ,我以往的經(jīng)驗(yàn):

a. 獲取 Cookie 的時(shí)候,首先需要保證我們的瀏覽器環(huán)境是干凈的,我說的干凈其實(shí)就是 清除當(dāng)前瀏覽器保存的 Cookie,并重啟瀏覽器。

b. 重啟之后我們訪問 www.csdn.net,當(dāng)前 Host 的 Request 就不會(huì)包含Cookie,那么 Cookie 在哪呢?其實(shí)細(xì)心點(diǎn)的會(huì)發(fā)現(xiàn) Cookie 在 Response 的 Headers > set-cookie 字段里面,并在下次請(qǐng)求中使用。

也就是說 Cookie 在大多數(shù)情況下都是服務(wù)器生成的,然后在首次請(qǐng)求的時(shí)候返回給客戶端使用。

c. 那么,當(dāng)我們做登錄操作的時(shí)候攜帶 Cookie 在請(qǐng)求 Headers 中,登錄成功之后這個(gè) Cookie 就會(huì)被服務(wù)器標(biāo)記為有效值。之后我們的所有請(qǐng)求都攜帶這個(gè) Cookie 就可以正常的完成所有請(qǐng)求。
image

提提神,繼續(xù)看


2.2、Https 包的步驟

2.2.1、 Https 簡介

SSL 相信大家都不陌生,其實(shí) Https 就是在 Http 基礎(chǔ)上通過 SSl 協(xié)議進(jìn)行加密之后的網(wǎng)絡(luò)傳輸。

其中通過非對(duì)稱和對(duì)稱加密算法來對(duì)密碼和數(shù)據(jù)進(jìn)行加密。具體看下圖:

image

1. Client 明文將自己支持的一套加密規(guī)則、一個(gè)隨機(jī)數(shù)(Random_c)發(fā)送給服務(wù)器。

2. Server 返回自己選擇的加密規(guī)則、CA 證書(服務(wù)器地址、加密公鑰、以及證書頒發(fā)機(jī)構(gòu)),外加一個(gè)通過加密規(guī)則和 HASH 算法生成的隨機(jī)數(shù)(Random_S)

3. Client 收到 Server 的消息之后會(huì):

a:驗(yàn)證證書(地址是否是正在訪問的和機(jī)構(gòu)是否合法)
b:自己生成一個(gè)隨機(jī)的密碼(Pre_master)并使用CA證書中的加密公鑰進(jìn)行加密生成enc_pre_master
c:計(jì)算出一個(gè)對(duì)稱加密的enc_key,通過Random_C、Random_S、Pre_master。
d:生成握手信息:使用約定好的Hash算法計(jì)算握手信息,并通過enc_key和約定好的加密算法對(duì)消息進(jìn)行加密

4. Client 將 enc_pre_master,加密之后的握手信息發(fā)送給 Server

5. Sever 收到消息之后

a: 收到enc_pre_master之后,會(huì)通過私鑰進(jìn)行解密(非對(duì)稱加密算法)得到pre_master
b: 通過pre_masrer、Random_C、Random_S計(jì)算得到協(xié)商密碼 enc_key
c: 通過enc_key解密握手信息,驗(yàn)證HASH是否和客戶端發(fā)來的一致
d: 生成握手信息同樣使用enc_key和約定好的加密算法

6. Server 發(fā)送握手信息給 Client,也就是說 Server 驗(yàn)證通過了 Client,并在此發(fā)送信息給 Client 來讓其驗(yàn)證自己

7. 客戶端拿到握手信息,解密并計(jì)算握手信息的 HASH,如果與服務(wù)端發(fā)來的 HASH 一致,此時(shí)握手過程結(jié)束

8. 正常加密通信,握手成功之后,所有的通信數(shù)據(jù)將由之前協(xié)商密鑰 enc_key 及約定好的算法進(jìn)行加密解密。

其中,Https 使用到的加密算法如下:

  • 非對(duì)稱加密: RSA、DSA/DSS

  • 對(duì)稱加密:AES、RC4、3DES

  • HASH 算法:MD5、SHA1、SHA256

2.2.2、Charles 抓取 Https 原理

Charles 本身就是一個(gè)協(xié)議代理工具,在上面的Https 原理上,客戶端和服務(wù)器的所有通信都被 Charles 捕獲到。

如下圖:

image

主要步驟如下:

  1. Charles 捕獲 Client 發(fā)送給 Server 的請(qǐng)求,并偽裝成客戶端向服務(wù)器發(fā)送握手請(qǐng)求

  2. 服務(wù)器響應(yīng),Charles 獲取到服務(wù)器的 CA 證書,并用根證書公鑰進(jìn)行解密,獲取到服務(wù)器的 CA 證書公鑰。然后 Charles 偽造自己的 CA 證書,偽裝為服務(wù)器的 CA 證書發(fā)送給服務(wù)器

  3. 客戶端收到返回之后,和上面講的過程一樣,證書校驗(yàn)、生成密碼、并使用 Charles 偽裝的證書公鑰進(jìn)行加密,并生成 Https 通信的協(xié)商密碼 enc_key

  4. Charles 捕獲到 Client 發(fā)來的重要信息,并使用自己偽造的證書私鑰將密文解密,獲取到 enc_key,然后 Charles 使用服務(wù)器之前返回的證書公鑰對(duì)明文進(jìn)行加密并發(fā)送給服務(wù)器

  5. 與之前一樣,服務(wù)器收到消息之后,用私鑰解開并建立信任,然后發(fā)送加密的握手信息

  6. Charles 截獲服務(wù)器發(fā)來的握手密文,并用對(duì)稱密鑰解開,再用自己偽造證書的私鑰加密傳給客戶端

  7. 客戶端拿到加密信息之后,用公鑰解開,驗(yàn)證 HASH。握手過程正式完成,客戶端和服務(wù)器就這樣建立了“信任”

其實(shí)在整個(gè)過程中,最重要的就是 enc_key,由于Charles 從一開始偽造并獲取了 enc_key,所以整個(gè)通信過程中 Charles 都充當(dāng)?shù)谌撸行畔?duì)其來講都是透明的。

其次就是根證書,這是 https 一個(gè)信任鏈的開始。這也是 Charles 偽造的 CA 證書能獲得雙方信任的關(guān)鍵。

2.2.3、演示 Charles 抓取 https

原理清楚了,其實(shí)操作就很簡單了,操作的核心點(diǎn)就是根證書。

  • 安裝根證書(Charles Root Certificate)
image
  • 讓系統(tǒng)信任證書
image
  • 接下來將需要抓的 Https 鏈接添加到 Charles SSL 代理規(guī)則中,443 是 https 的默認(rèn)端口
image

當(dāng)然,你也可以像我一樣,使用 *.443 來抓取所有的 Https 包。

  • 通過瀏覽器訪問自己要抓的鏈接,這樣所有的 Https 都可以像 HTTP 一樣明文的展示在我們面前

    image

3、手機(jī)抓包

手機(jī)抓包的原理其實(shí)也很簡單,讓手機(jī)和抓包工具處于同一個(gè)局域網(wǎng),并將手機(jī)的 Wifi Proxy 手動(dòng)代理到電腦的 IP 和 Charles 設(shè)置的抓包端口上,具體操作可以參考:http://blog.csdn.net/richer1997/article/details/52198024

我這里主要講一下手機(jī)端抓取 Https 的方式,其實(shí)也和瀏覽器一樣:

  • 首先需要安裝 Charles 的根證書到手機(jī)上
image
  • 點(diǎn)擊之后,會(huì)彈出讓你在手機(jī)上配置代理到對(duì)一個(gè) ip 和端口,之后通過手機(jī)瀏覽器打開 chls.pro/ssl 來安裝
image
  • 使用手機(jī)訪問該鏈接之后,會(huì)自動(dòng)被識(shí)別為證書,并跳轉(zhuǎn)到安裝界面
image
  • 之后就類似于 PC 端抓包原理一樣,手機(jī)端的證書被作為根證書使用,并通過 Charles 拿到 enc_key 將所有通信過程透明化

4、總結(jié)

抓包的用處其實(shí)很多,有時(shí)候可以用來調(diào)試我們的接口、有時(shí)候也可以用來做一些對(duì)工作有益的事情。

感謝大家閱讀本篇。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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