移動測試開發(fā)Mitmproxy用于測試抓包神器詳解
1.前言
在移動商業(yè)廣告的測試的工作中,經(jīng)常會需要對廣告請求進(jìn)行捕獲和分析,常使用的有兩個測試工具:fiddler,Charles,這兩個工具都可以對廣告請求進(jìn)行抓包,斷點調(diào)試,請求替換,構(gòu)造請求等,但是這兩個工具都有一定的局限性。首先,fiddler 只能在 windows 上運行,charles 雖然可以在 mac,windows 上運行,但是收費。其次,在商業(yè)廣告請求中經(jīng)常會對接口協(xié)議進(jìn)行加密處理,使用 fiddler 和 charles 就不容易解決了。最后,商業(yè)廣告測試中需要對廣告請求協(xié)議的各種字段進(jìn)行校驗,但業(yè)務(wù)涉及到多字段修改的情況下,再利用 fiddler 和 charles 逐一校驗判斷顯然很浪費時間。經(jīng)過調(diào)研和實際應(yīng)用,我們發(fā)現(xiàn) mitmproxy 這個工具非常靈活,它是基于 Python 開發(fā)的開源工具,提供了 Python API,可以通過載入自定義 python 腳本輕松控制請求和響應(yīng)。這是其它工具所不能做到的,通過自定義腳本進(jìn)行二次開發(fā),能夠解決商業(yè)廣告測試過程中所遇到的問題。
2.Mitmproxy 簡介
MITM(Man In The Middle Attack)中間人攻擊,這種攻擊模式是通過各種技術(shù)手段將受入侵者控制的一臺計算機(jī)虛擬放置在網(wǎng)絡(luò)連接中的兩臺通信計算機(jī)之間,這臺計算機(jī)就稱為 “中間人”。mitmproxy 就是用于 MITM 的 proxy,用于中間人攻擊的代理。首先會向正常的代理一樣轉(zhuǎn)發(fā)請求,保障服務(wù)端與客戶端的通信,其次,會適時的查、記錄其截獲的數(shù)據(jù),或篡改數(shù)據(jù),引發(fā)服務(wù)端或客戶端特定的行為。
mitmproxy 有兩個關(guān)聯(lián)組件。一個是 mitmdump,它是 mitmproxy 的命令行接口,利用它我們可以對接 Python 腳本,用 Python 實現(xiàn)監(jiān)聽后的處理邏輯。另一個是 mitmweb,它是一個 Web 程序,通過它我們可以清楚觀察 mitmproxy 捕獲的請求。
3.Mitmproxy 工作原理
mitmproxy 有 5 種代理模式,主要包含:正向代理,透明代理,反向代理,上游代理,socks 代理,在實際使用中經(jīng)常用到正向代理,mitmproxy 作為正向代理是一個位于客戶端和原始服務(wù)器 (origin server) 之間的服務(wù)器,為了從原始服務(wù)器取得內(nèi)容,客戶端向 mitmproxy 代理發(fā)送一個請求并指定目標(biāo) (原始服務(wù)器),然后代理向原始服務(wù)器轉(zhuǎn)交請求并將獲得的內(nèi)容返回給客戶端??蛻舳吮仨氁M(jìn)行一些特別的設(shè)置才能使用正向代理。
我們以 HTTPS 請求為例介紹一下 mitmproxy 作為正向代理抓包的過程:
①. 客戶端連接到 mitmproxy,并發(fā)出 HTTP 連接請求。
②. mitmproxy 響應(yīng)建立了一個 200 的連接
③. 客戶端認(rèn)為它正在與遠(yuǎn)程服務(wù)器通信,并啟動 SSL 連接。使用 SNI 來指定它連接到的主機(jī)名。
④. mitmproxy 使用客戶端指定的 SNI 主機(jī)名與服務(wù)端建立一個 SSL/TLS 連接。
⑤. 服務(wù)器使用匹配的證書進(jìn)行響應(yīng),該證書包含生成攔截證書所需的 CN 和 SAN 值。
⑥. mitmproxy 生成攔截證書,并繼續(xù)跟客戶端 SSL/TLS 握手。
⑦. 客戶端通過已建立的 SSL/TLS 連接發(fā)送請求。
⑧. mitmproxy 通過步驟 ④ 中啟動的 SSL/TLS 連接將請求傳遞到服務(wù)器。
4.實踐應(yīng)用
解決多字段校驗效率問題:
商業(yè)廣告測試中有大量的重復(fù)性工作在打點校驗上,為了節(jié)省測試時間和解決易漏測的問題,我們可以利用 mitmproxy 二次開發(fā),自定義業(yè)務(wù)相關(guān)的校驗規(guī)則,然后通過捕獲請求對協(xié)議中的各個字段進(jìn)行自動化校驗,這樣既可以提高測試效率,又避免了漏測問題。
以所測廣告業(yè)務(wù)為例,首先建立 addons.py 文件,addons 是個列表,每個元素是一個類實例,這些類,稱為一個個 addon,這些類有若干方法,這些方法實現(xiàn)了某些 mitmproxy 提供的事件,mitmproxy 會在某個事件發(fā)生時調(diào)用對應(yīng)的方法。如下圖所示為 addons 文件內(nèi)容,其中 SemiNativeCSJAd 則為 addon。
SemiNativeCSJAd 類中實現(xiàn)了 mitmproxy 提供的 request 和 response 事件,當(dāng)觸發(fā)該事件的時候,就會調(diào)用對應(yīng)的方法。
其中將所有類型的廣告打點中的公共字段校驗抽取成公共方法 semiNativeCSJfieldCheck 調(diào)用。如下圖所示:
通過以上方式,簡單且有效的解決了多個字段校驗問題。
解決商業(yè)廣告中加解密問題:
商業(yè)廣告有不同的渲染形態(tài),例如:激勵視頻類,模板類,在實際測試過程中,需要測試人員 mock 不同的廣告進(jìn)行測試,不僅如此,還會遇到需要對廣告進(jìn)行加解密的情況,那么具體應(yīng)該怎么解決呢?以所測的廣告業(yè)務(wù)為例需要做以下幾個步驟:
①. mitmproxy 攔截客戶端發(fā)起的請求并獲取某字段
②. 利用 RSA 算法根據(jù)請求的某字段解密獲取到秘鑰
③. 利用 AES 算法和 ② 步驟的秘鑰,對本地廣告內(nèi)容進(jìn)行加密
④. mitmproxy 將加密的廣告返回給客戶端
如下圖是實現(xiàn)的代碼,此 mockMaxFile 函數(shù)還可以根據(jù)入?yún)魅氩煌瑥V告文件即可實現(xiàn)不同廣告的 mock。
5.總結(jié)
以上就是 mitmproxy 的簡單介紹和在商業(yè)廣告測試中的應(yīng)用,相比傳統(tǒng)的抓包工具,mitmproxy 可以通過載入自定義 python 腳本輕松實現(xiàn)各種定制化需求,提升測試效率和質(zhì)量,不愧為 “抓包神器”。
更多關(guān)于移動測試Mitmproxy抓包的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
PyTorch實現(xiàn)手寫數(shù)字識別的示例代碼
本文主要介紹了PyTorch實現(xiàn)手寫數(shù)字識別的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下<BR>2022-05-05python實現(xiàn)scrapy爬蟲每天定時抓取數(shù)據(jù)的示例代碼
這篇文章主要介紹了python實現(xiàn)scrapy爬蟲每天定時抓取數(shù)據(jù)的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01PyTorch數(shù)據(jù)讀取的實現(xiàn)示例
這篇文章主要介紹了PyTorch數(shù)據(jù)讀取的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03python實現(xiàn)圖書館研習(xí)室自動預(yù)約功能
這篇文章主要為大家詳細(xì)介紹了python實現(xiàn)圖書館研習(xí)室自動預(yù)約功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-04-04python內(nèi)置數(shù)據(jù)類型之列表操作
數(shù)據(jù)類型是一種值的集合以及定義在這種值上的一組操作。這篇文章主要介紹了python內(nèi)置數(shù)據(jù)類型之列表的相關(guān)知識,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-11-11Python中線程threading.Thread的使用詳解
python的thread模塊是比較底層的模塊,python的threading模塊是對thread做了一些包裝的,可以更加方便的被使用。本文將為大家詳細(xì)介紹一下python中的線程threading.Thread()的使用,需要的可以參考一下2022-07-07wtfPython—Python中一組有趣微妙的代碼【收藏】
Wtfpython講解了大量的Python編譯器的內(nèi)容。這篇文章主要介紹了wtfPython-Python中一些奇妙的代碼,感興趣的朋友跟隨腳本之家小編一起看看吧2018-08-08python消費kafka數(shù)據(jù)批量插入到es的方法
今天小編就為大家分享一篇python消費kafka數(shù)據(jù)批量插入到es的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12