一、安裝
1.1 安裝mitmproxy
直接使用pip安裝即可
pip install mitmproxy
pip本質上會一是安裝mitmproxy庫的相關代碼,二是安裝mitmproxy.exe/mitmdump.exe/mitmdump.exe三個可執行程序。
可執行程序被安裝在$PYTHON_HOME/Scripts文件夾下,如果是conda版本的python那可以用以下命令來查看當前使用的是哪個環境。
conda env list

1.2 安裝證書
和burpsuite類似mitmproxy默認只能攔截http,想要攔截https那就需要安裝證書。
首先到$PYTHON_HOME/Scripts目錄下運行一下mitmdump,完成之后在用戶家目錄下的.mitmproxy文件夾下即會生成證書,傳到手機點擊安裝即可。


mitmproxy-ca.p12----PKCS12格式證書私鑰
mitmproxy-ca.pem----PEM格式證書私鑰
mitmproxy-ca-cert.cer----PEM格式證書,與mitmproxy-ca-cert.pem相同只是改變了后輟,適用於部分Android
mitmproxy-ca-cert.p12----PKCS12格式證書,適用於Windows
mitmproxy-ca-cert.pem----PEM格式證書,適用於大多數非Windows平台
mitmproxy-dhparam.pem----PEM格式秘鑰文件,用於增強SSL安全性
Windows安裝證書:雙擊mitmproxy-ca-cert.p12----全部默認直接點“下一步”直到安裝完成。
Android安裝證書:把mitmproxy-ca-cert.cer通過usb復制到手機上----點擊使用證書安裝器安裝證書(通過qq發送到手機上時提示無法讀取證書不懂什么原因)
二、網絡代理配置
2.1 確保手機和電腦處於同一局域網
運行mitmproxy的電腦和運行目標app的手機要同處一個局域網才能進行代理。
如果是有筆記本那么筆記本和手機同連到一個路由器上,或者在筆記本上開啟一個wifi然后用手機連上去,或者用Genymotion等模擬器運行app在模擬器設置代理,這三個方法都可以。
但如果是沒有無線網卡的台式機那似乎只能使用模擬器,要用其他兩種方法那得外接一個usb式無線網卡。

我這里用的方法是台式機外接無線網卡使用360開啟一個wifi手機連上去,台式機ip為172.30.195.1手機ip為172.30.195.2。
2.2 電腦啟動代理
我這里是windows,mitmproxy.exe並不支持windows,但這並沒有很大關系,mitmproxy.exe本質就是一個窗口式的burpsuite的proxy+repeater。
如果要攔包改包我們用burpsuite更加好,用mitmproxy的意義在於代碼能獲取數據包,而這個功能是由mitmdump實現只要mitmdump.exe可運行即可。

和1.2一樣啟動mitmdump.exe
mitmdump.exe

2.3 手機配置代理
手機配置代理大同小異都在設置之中進行配置。比如我這里的路徑是:
設置----無線和網絡WLAN----長按wifi名----修改網絡----顯示高級選項----代理----手動---服務器主機名輸入172.30.195.1(根據自己電腦ip修改)服務器端口輸入8080----保存

2.4 代理效果查看
完成后在啟動mitmdump.exe的代理窗口上即可看到手機發送的所有數據包。

三、Python3使用mitmproxy
我們前邊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網絡爬蟲開發實戰》
