Android 抓包,監控流量工具之 mitmproxy

轉:http://greenrobot.me/devpost/how-to-debug-android-http-get-started/

mitmproxy實踐教程之調試 Android 上 HTTP流量

以前寫了一篇博客介紹了mitmproxy,不過有些同窗對這個工具到底該怎麼使用仍是有點不清楚,因而本身花了一天時間把本身對這個工具的理解和使用過程進行了一番整理,造成了這篇文章。接下來我就以一些簡單的場景來講明mitmproxy的用法。html

實踐環境

iMac一臺、華爲B199(Android 4.4)手機一部,這二者都連着同一個wifi。mitmproxy安裝版本爲0.11.3。iMac的ip地址爲:192.168.0.104android

mitmproxy安裝與設置

  1. 下載mitmproxy。推薦下載二進制安裝包(當前版本爲0.11.3),由於使用pip安裝會因爲牆的緣由安裝失敗。下載成功以後解壓,即可直接點擊名爲「mitmproxy」的文件了。
  2. 在iMac上運行和設置mitmproxy。因爲直接點擊運行是沒有設置mitmproxy參數的,因此咱們須要在命令行裏面輸入mitmproxy進行設置:

    注意,此處的[YOUR_DOWNLOAD_PATH]爲你下載mitmproxy二進制文件解壓後所對應的目錄,就我而言的目錄就是:~/Downloads/osx-mitmproxy-0.11.3 .  其中ip設置爲iMac的ip,端口則按照你的我的喜愛來。
    初始界面以下:

     

    mitmproxy初始運行界面
    mitmproxy初始運行界面

    輸入「?」即可查看幫助界面(輸入「q」回到正常界面):git

    mitmproxy幫助界面
    mitmproxy幫助界面
  3. 在Android上設置代理。按照以前的步驟將Android所鏈接的wifi代理ip設置爲:192.168.0.1,端口設置爲:9527 。如今Android已經連上代理,iMac端便開始展現它所抓取到的包了(我在刷微博:)):
    mitmproxy抓包顯示
    mitmproxy抓包顯示

     

mitmproxy常見操做

mitmproxy的操做主要是經過命令行來解決的,不少操做和vi相同。通常說來,「q」表明返回。當mitmproxy回到抓包列表界面時,輸入「q」就表明退出mitmproxy了。github

清除抓包結果

當你處於抓包列表界面時,以爲太多的信息讓你十分惱火,直接輸入大寫字母C即可以清楚全部的抓包結果。json

查看抓包

在步驟3中咱們能夠看到一個黃色的指標,咱們能夠經過上下箭頭(或者使用 「j」/」k」來上下選擇)。直接回車即可以查看指標所選定的包的詳細信息:服務器

mitmproxy詳細信息
mitmproxy抓包的Request詳細信息

此時,咱們可使用tab鍵在「Request」和「Response」之間切換。這是「Response」的詳細信息(這是一個張圖片,因此下面亂碼了):dom

mitmproxy抓去response信息
mitmproxy抓去response信息

當咱們發現「Response」的信息比較亂的時候,咱們能夠選擇合適的形式來展現,這個時候咱們只要輸入「m」即可以看到mitmproxy提供的不一樣展示形式,輸入對應高亮的字母即可以看到相應的結果(輸入「s」即可以以json形式展現):工具

mitmproxy 展現模式
mitmproxy 展現模式

mitmproxy修改抓包

若是這個時候咱們須要編輯「Request」怎麼辦,很簡單,輸入字母「e」便可(注意圖片最下方出現的提示(Edit request (query,path,url,header,form,raw body,method)?:post

mitmproxy編輯request
mitmproxy編輯request

我從mitmproxy給出的提示中選擇了「method」,也就是編輯當前包的http方法,因而mitmproxy便給出了常見的方法:屏幕快照 2015-01-27 下午2.20.09在這些方法中,我要選擇「trace」,便輸入高亮的字母「t」便可,最後原來「Request」裏面的方法就變成了TRACE了:spa

mitmproxy 修改request method
mitmproxy 修改request method

 

可是這個時候修改的request尚未生效,由於如今mitmproxy所展現的抓包信息只是記錄了Android和server端之間的通訊,所以咱們如今編輯的抓包是已經傳輸過了,因此怎麼辦呢?很簡單,從新request一下,輸入字母「r」(表明「replay」)。這個時候咱們就能夠看到咱們修改過的request獲得的結果了:

mitmproxy 抓包replay效果
mitmproxy 抓包replay效果

此時咱們輸入「q」即可以回到以前的抓包列表了。這些都是歷史抓包紀錄,能不能實時地抓包呢?固然能夠,這就是下面要說的攔截(Intercept)了。

mitmproxy攔截

何爲攔截?以前開篇就介紹過mitmproxy是一箇中間人代理工具,它位於客戶端和Server 端之間,它能夠獲取客戶端的Request而後修改,發送給Server 端;Server端獲得Request以後在發出相應的Response又會被mitmproxy攔截,若是你想修改response,即可修改後再發給客戶端。注意:這與以前修改抓包信息不一樣的是,前者的抓包已經發送給了服務器,而mitmproxy攔截則是獲取了抓包,還未發送給服務器。也就是說若是我攔截了我手機上全部的request,那麼個人手機將沒法獲取來自服務器的response。

那麼咱們若是進行攔截,怎麼進行特定的攔截?輸入字母「i」(表明Intercept filter)便可,此時界面便會讓你輸入想要攔截的條件:

mitmproxy 攔截
mitmproxy 攔截

mitmproxy的條件攔截在默認狀況下是過濾抓包的URL的。也就是說當你直接輸入要攔截的條件(好比輸入「weibo」),那麼接下來要出現抓包會將匹配的抓包總體變黃:

mitmproxy條件過濾效果
mitmproxy條件攔截效果

這些橘黃色的數據包都表明被攔截了,還未發送給服務器,這個時候你就能夠對這些數據包進行修改,咱們選擇一個數據包enter進入:

mitmproxy 攔截 選擇數據包
mitmproxy 攔截 選擇數據包

與以前的相似,輸入「e」,進行request編輯模式,而後輸入「h」表明要編輯request的頭部:

mitmproxy 編輯攔截包的頭部
mitmproxy 編輯攔截包的頭部

輸入enter即可對高亮的User-Agent的值進行修改,上圖的weibo版本以前是5.0的,被我改爲了6.0 。咱們還能夠對header進行添加屬性,輸入「a」便可,而後使用tab分別鍵入key和value。這裏我添加了「test-test」鍵值對:

mitmproxy 攔截header添加鍵值對
mitmproxy 攔截header添加鍵值對

至此,我對攔截的request header已經修改完畢,如今要作的就是我要承認接受這個修改,而後發給服務器。因此咱們輸入「a」(表明「accept」)便可,等到服務器響應後,注意,mitmproxy便又了攔截服務器發過來的response(注意那個「Response intercepted」):

mitmproxy 攔截response
mitmproxy 攔截response

如今若是你想修改這個response也能夠,方式同上面修改request同樣。這個時候我再輸入「a」,表明我接受了這個response,而後這個response即可發給客戶端了:

mitmproxy 攔截response以後accept
mitmproxy 攔截response以後accept

 

更多類型的mitmproxy攔截

同時mitmproxy還支持不一樣類型的條件過濾,以前在攔截字符串前面加上特定的參數好比我要攔截全部的POST request怎麼辦?輸入:~m POST 便可(m表明method):

mitmproxy 攔截特定的request 方法
mitmproxy 攔截特定的request 方法

攔截全部的request: ~q

攔截特定的header: ~h

攔截特定的domain: ~d

攔截特定的響應代碼(404之類的): ~c

其餘還有不少類型,請參看mitmproxy官方文檔

相關文章
相關標籤/搜索