直接使用pip安裝便可python
pip install mitmproxy
pip本質上會一是安裝mitmproxy庫的相關代碼,二是安裝mitmproxy.exe/mitmdump.exe/mitmdump.exe三個可執行程序。windows
可執行程序被安裝在$PYTHON_HOME/Scripts文件夾下,若是是conda版本的python那能夠用如下命令來查看當前使用的是哪一個環境。安全
conda env list
和burpsuite相似mitmproxy默認只能攔截http,想要攔截https那就須要安裝證書。服務器
首先到$PYTHON_HOME/Scripts目錄下運行一下mitmdump,完成以後在用戶家目錄下的.mitmproxy文件夾下即會生成證書,傳到手機點擊安裝便可。cookie
mitmproxy-ca.p12----PKCS12格式證書私鑰網絡
mitmproxy-ca.pem----PEM格式證書私鑰app
mitmproxy-ca-cert.cer----PEM格式證書,與mitmproxy-ca-cert.pem相同只是改變了後輟,適用於部分Androidui
mitmproxy-ca-cert.p12----PKCS12格式證書,適用於Windowsurl
mitmproxy-ca-cert.pem----PEM格式證書,適用於大多數非Windows平臺spa
mitmproxy-dhparam.pem----PEM格式祕鑰文件,用於加強SSL安全性
Windows安裝證書:雙擊mitmproxy-ca-cert.p12----所有默認直接點「下一步」直到安裝完成。
Android安裝證書:把mitmproxy-ca-cert.cer經過usb複製到手機上----點擊使用證書安裝器安裝證書(經過qq發送到手機上時提示沒法讀取證書不懂什麼緣由)
運行mitmproxy的電腦和運行目標app的手機要同處一個局域網才能進行代理。
若是是有筆記本那麼筆記本和手機同連到一個路由器上,或者在筆記本上開啓一個wifi而後用手機連上去,或者用Genymotion等模擬器運行app在模擬器設置代理,這三個方法均可以。
但若是是沒有無線網卡的臺式機那彷佛只能使用模擬器,要用其餘兩種方法那得外接一個usb式無線網卡。
我這裏用的方法是臺式機外接無線網卡使用360開啓一個wifi手機連上去,臺式機ip爲172.30.195.1手機ip爲172.30.195.2。
我這裏是windows,mitmproxy.exe並不支持windows,但這並無很大關係,mitmproxy.exe本質就是一個窗口式的burpsuite的proxy+repeater。
若是要攔包改包咱們用burpsuite更加好,用mitmproxy的意義在於代碼能獲取數據包,而這個功能是由mitmdump實現只要mitmdump.exe可運行便可。
和1.2同樣啓動mitmdump.exe
mitmdump.exe
手機配置代理大同小異都在設置之中進行配置。好比我這裏的路徑是:
設置----無線和網絡WLAN----長按wifi名----修改網絡----顯示高級選項----代理----手動---服務器主機名輸入172.30.195.1(根據本身電腦ip修改)服務器端口輸入8080----保存
完成後在啓動mitmdump.exe的代理窗口上便可看到手機發送的全部數據包。
咱們前邊2.2也提到使用mitmproxy的根本目的是想要python能修改發送的數據包,及截獲服務端返回的數據包。只是像2.4那樣打印出全部發送的請求對咱們的目的而言是沒有什麼用的。
python接觸發送數據包的途徑是在啓動mitmdump啓動時使用-s選項指定處理腳本,其中經過重寫request方法處理請求數據包,經過重寫response方法處理響應數據包。示例以下。
啓動命令:
mitmdump.exe -s example_script.py
exampl_script.py內容:
from mitmproxy import ctx # 全部發出的請求數據包都會被這個方法所處理 # 所謂的處理,咱們這裏只是打印一下一些項;固然能夠修改這些項的值直接給這些項賦值便可 def request(flow): # 獲取請求對象 request = flow.request # 實例化輸出類 info = ctx.log.info # 打印請求的url info(request.url) # 打印請求方法 info(request.method) # 打印host頭 info(request.host) # 打印請求端口 info(str(request.port)) # 打印全部請求頭部 info(str(request.headers)) # 打印cookie頭 info(str(request.cookies)) # 全部服務器響應的數據包都會被這個方法處理 # 所謂的處理,咱們這裏只是打印一下一些項 def response(flow): # 獲取響應對象 response = flow.response # 實例化輸出類 info = ctx.log.info # 打印響應碼 info(str(response.status_code)) # 打印全部頭部 info(str(response.headers)) # 打印cookie頭部 info(str(response.cookies)) # 打印響應報文內容 info(str(response.text))
如圖箭頭所指處正是經request方法處理,依次輸出請求url、請求方法、host頭、請求端口、全部頭部及cookies
咱們在電腦上寫爬蟲,關鍵操做是找到請求url、制定請求數據包、解析返回結果。
從這個角度出發對app咱們根本須要的彷佛其實只是攔截請求數據包和響應數據包、分析他們的格式,不必從app發出和接收數據包。
也就是彷佛用burpsuite代理並進行數據包分析就完了,mitmproxy沒什麼用(?)。
參考:
崔慶才----《Python3網絡爬蟲開發實戰》