關於爬蟲,看這一篇就夠了!
閱讀本篇預計需要 6 分鐘
本文來自公眾號:DeveloperPython作者:馬超
抓包,我相信很多程序員對這個都不陌生。但真正抓過包或者了解其原理的並沒有幾個。
所以,這次我分享一篇關於抓包的文章,也算是對之前文章的一個重新梳理。
其中會介紹幾款簡單易用的工具以及針對目前互聯網主流的 Http 和 Https 網路包進行抓取並分析,最後也會分享下手機抓包得技術。
目前市面上比較火的幾個抓包工具有:Charles、Fiddler 以及 Wireshark。
1、抓包工具
Fiddler
這個是我之前在 Windows 時代經常用的工具。而且當時的 Fiddler 足以滿足了我的簡單抓包需求。
話說現在都更新到 Fiddler 4 了,如果用 Windows 的朋友可以試試這個。
Charles
自從換了 Mac 之後我就開始用這個工具,但有一點比較麻煩的就是這個款軟體是收費的。
不過在我大天朝,如果你不是土豪那麼就找找破解版。
Wireshark
這個工具比較牛逼,不過我不經常用。這工具可以詳細的抓包網路請求的三次握手,同時也支持 Spdy、tcp 直連等等的網路協議。
如果你需要對網路做一個比較深的抓取,那麼建議使用這個。
(ps: 後台回復對應工具,會拿到破解版的下載地址)
2、抓取 Http、Https 包
2.1、 Http 包的步驟:
2.1.1、 清理 Charles 列表,讓抓包更加清晰
2.1.2、 以我的 CSDN 為例 (m694449212),在 Chrome 中打開我的博客,抓到需要的包
在 Structure 中找到 csdn 的包,如上圖。
2.1.3、 分析包
2.1.4、查看請求頭
其中比較重要的是 Cookie 欄位,這是網站為了表示用戶身份、進行 Session 跟蹤而存儲在用戶本地終端上的數據(通常是加密的)。
其次,Cookie 在我們爬蟲的時候也是一個必不可少的東西,那麼如何自動獲取 Cookie 呢?後面會講到。
2.1.5、 拿到返回的數據 Response
CSDN 博客的返回數據是 Html 的格式,其中每篇文章的地址都是通過跳轉 href 來做的,因此我們可以通過正則表達式匹配,或者 XPath 來拿到 Href 再拼接 Host 生成一個絕對路徑的地址:
http://blog.csdn.net/m694449212/artlcle/details/31806139.這就是我的Blog中的一篇文章。
2.1.6、獲取 Cookie ,我以往的經驗:
a. 獲取 Cookie 的時候,首先需要保證我們的瀏覽器環境是乾淨的,我說的乾淨其實就是 清除當前瀏覽器保存的 Cookie,並重啟瀏覽器。
b. 重啟之後我們訪問 http://www.csdn.net,當前 Host 的 Request 就不會包含Cookie,那麼 Cookie 在哪呢?其實細心點的會發現 Cookie 在 Response 的 Headers > set-cookie 欄位裡面,並在下次請求中使用。
也就是說 Cookie 在大多數情況下都是伺服器生成的,然後在首次請求的時候返回給客戶端使用。
c. 那麼,當我們做登錄操作的時候攜帶 Cookie 在請求 Headers 中,登錄成功之後這個 Cookie 就會被伺服器標記為有效值。之後我們的所有請求都攜帶這個 Cookie 就可以正常的完成所有請求。
提提神,繼續看
2.2、Https 包的步驟
2.2.1、 Https 簡介
SSL 相信大家都不陌生,其實 Https 就是在 Http 基礎上通過 SSl 協議進行加密之後的網路傳輸。
其中通過非對稱和對稱加密演算法來對密碼和數據進行加密。具體看下圖:
1. Client 明文將自己支持的一套加密規則、一個隨機數(Random_c)發送給伺服器。
2. Server 返回自己選擇的加密規則、CA 證書(伺服器地址、加密公鑰、以及證書頒發機構),外加一個通過加密規則和 HASH 演算法生成的隨機數(Random_S)
3. Client 收到 Server 的消息之後會:
a:驗證證書(地址是否是正在訪問的和機構是否合法)
b:自己生成一個隨機的密碼(Pre_master)並使用CA證書中的加密公鑰進行加密生成enc_pre_masterc:計算出一個對稱加密的enc_key,通過Random_C、Random_S、Pre_master。d:生成握手信息:使用約定好的Hash演算法計算握手信息,並通過enc_key和約定好的加密演算法對消息進行加密
4. Client 將 enc_pre_master,加密之後的握手信息發送給 Server
5. Sever 收到消息之後
a: 收到enc_pre_master之後,會通過私鑰進行解密(非對稱加密演算法)得到pre_master
b: 通過pre_masrer、Random_C、Random_S計算得到協商密碼 enc_keyc: 通過enc_key解密握手信息,驗證HASH是否和客戶端發來的一致d: 生成握手信息同樣使用enc_key和約定好的加密演算法
6. Server 發送握手信息給 Client,也就是說 Server 驗證通過了 Client,並在此發送信息給 Client 來讓其驗證自己
7. 客戶端拿到握手信息,解密並計算握手信息的 HASH,如果與服務端發來的 HASH 一致,此時握手過程結束
8. 正常加密通信,握手成功之後,所有的通信數據將由之前協商密鑰 enc_key 及約定好的演算法進行加密解密。
其中,Https 使用到的加密演算法如下:
- 非對稱加密: RSA、DSA/DSS
- 對稱加密:AES、RC4、3DES
- HASH 演算法:MD5、SHA1、SHA256
2.2.2、Charles 抓取 Https 原理
Charles 本身就是一個協議代理工具,在上面的Https 原理上,客戶端和伺服器的所有通信都被 Charles 捕獲到。
如下圖:
主要步驟如下:
- Charles 捕獲 Client 發送給 Server 的請求,並偽裝成客戶端向伺服器發送握手請求
- 伺服器響應,Charles 獲取到伺服器的 CA 證書,並用根證書公鑰進行解密,獲取到伺服器的 CA 證書公鑰。然後 Charles 偽造自己的 CA 證書,偽裝為伺服器的 CA 證書發送給伺服器
- 客戶端收到返回之後,和上面講的過程一樣,證書校驗、生成密碼、並使用 Charles 偽裝的證書公鑰進行加密,並生成 Https 通信的協商密碼 enc_key
- Charles 捕獲到 Client 發來的重要信息,並使用自己偽造的證書私鑰將密文解密,獲取到 enc_key,然後 Charles 使用伺服器之前返回的證書公鑰對明文進行加密並發送給伺服器
- 與之前一樣,伺服器收到消息之後,用私鑰解開並建立信任,然後發送加密的握手信息
- Charles 截獲伺服器發來的握手密文,並用對稱密鑰解開,再用自己偽造證書的私鑰加密傳給客戶端
- 客戶端拿到加密信息之後,用公鑰解開,驗證 HASH。握手過程正式完成,客戶端和伺服器就這樣建立了「信任」
其實在整個過程中,最重要的就是 enc_key,由於Charles 從一開始偽造並獲取了 enc_key,所以整個通信過程中 Charles 都充當第三者,所有信息對其來講都是透明的。
其次就是根證書,這是 https 一個信任鏈的開始。這也是 Charles 偽造的 CA 證書能獲得雙方信任的關鍵。
2.2.3、演示 Charles 抓取 https
原理清楚了,其實操作就很簡單了,操作的核心點就是根證書。
- 安裝根證書(Charles Root Certificate)
- 讓系統信任證書
- 接下來將需要抓的 Https 鏈接添加到 Charles SSL 代理規則中,443 是 https 的默認埠
當然,你也可以像我一樣,使用 *.443 來抓取所有的 Https 包。
- 通過瀏覽器訪問自己要抓的鏈接,這樣所有的 Https 都可以像 HTTP 一樣明文的展示在我們面前
3、手機抓包
手機抓包的原理其實也很簡單,讓手機和抓包工具處於同一個區域網,並將手機的 Wifi Proxy 手動代理到電腦的 IP 和 Charles 設置的抓包埠上,具體操作可以參考:http://blog.csdn.net/richer1997/article/details/52198024
我這裡主要講一下手機端抓取 Https 的方式,其實也和瀏覽器一樣:
- 首先需要安裝 Charles 的根證書到手機上
- 點擊之後,會彈出讓你在手機上配置代理到對一個 ip 和埠,之後通過手機瀏覽器打開 chls.pro/ssl 來安裝
- 使用手機訪問該鏈接之後,會自動被識別為證書,並跳轉到安裝界面
- 之後就類似於 PC 端抓包原理一樣,手機端的證書被作為根證書使用,並通過 Charles 拿到 enc_key 將所有通信過程透明化
4、總結
抓包的用處其實很多,有時候可以用來調試我們的介面、有時候也可以用來做一些對工作有益的事情。
感謝大家閱讀本篇。
推薦閱讀: