以羊了個羊為例,淺談小程式抓包與響應報文修改

語言: CN / TW / HK

在前面的文章中,我們一起製作了一個天眼查小程式,其中涉及到了微信小程式的抓取過程,應眾多讀者的要求,今天我們一起來看看微信小程式的抓包流程

本來是想以天眼查小程式作為抓包主體的,但是這兩天羊了個羊實在是太火了,沒辦法,咱們也來追一追熱點,今天我們的目標程式就是羊了個羊了!

而且從9月20號的某個時刻開始,羊了個羊的介面正式進入到V2時代,也就是相關的通關介面進行了加密處理,請求時需要攜帶引數 MatchPlayInfo ,而該引數又是通過 JavaScript 的混淆程式碼來處理的,所以導致一鍵通過程式都失效了,那麼咱們只能另尋出路了,修改 response 響應訊息的方法也就應運而生!

MitmProxy 的使用

我們這裡使用的抓包程式是 MitmProxy,這是一個用 Python 編寫的工具,其安裝使用簡單,而且通過與自定義的 Python 指令碼相結合,可以非常方便的篡改 request 和 response 內容

安裝配置 MitmProxy

安裝非常簡單,直接 pip 即可

pip install mitmproxy

完成安裝之後,我們就可以通過命令 mitmdump 來啟動了

可以看到,以上面的命令啟動之後,會在本地啟動一個監聽了8080埠的程式,這個就是我們的抓包代理程序了

設定手機代理

這裡我們需要保證手機與電腦處於同一個 WiFi 網路之中,我們通過命令 ipconfig 獲取電腦的 IP 地址

然後我們進入手機的無線區域網設定當中,選擇當前連線的 WiFi,進行 HTTP 程式碼設定

在代理設定中,伺服器填寫電腦的 IP 地址,埠填寫 8080

這樣代理就設定好了

安裝證書

為了讓手機信任我們的代理,還需要安裝證書,通過手機瀏覽器訪問地址:http://mitm.it/

我們選擇對應的裝置證書下載,比如 Apple 證書

下載完成後,通過設定,“已下載描述檔案”進入安裝即可

至此,MitmProxy 以及手機側的配置都已經完成,我們可以進行抓包操作了

抓包操作

我們通過手機開啟《羊了個羊》小程式,如果我們執行 mitmdump 命令的介面有資料包列印,那麼就說明我們的配置是成功的

下面我們來編寫 Python 指令碼,來修改 response 內容

修改 response

通過抓包資訊分析,我們知道返回地圖的介面是 map_info_ex 介面,其響應訊息體的內容為

{"err_code":0,"err_msg":"","data":
        {"map_md5":["046ef1bab26e5b9bfe2473ded237b572","046ef1bab26e5b9bfe2473ded237b572"],
         "map_seed":[3622853803,3053757364,32667028,3621470055]}}

我們只需要把 map_md5 中的第二個值改為與第一個值一致就可以達到第二關的難度與第一關一樣的效果,下面就開始幹吧~

對於 MitmProxy 工具而言,我們有如下事件可以擷取

針對 HTTP 生命週期的事件:

  • 請求:def request(self, flow: mitmproxy.http.HTTPFlow):
  • 響應:def response(self, flow: mitmproxy.http.HTTPFlow):
  • 其它:

    • def http_connect(self, flow: mitmproxy.http.HTTPFlow):
    • def requestheaders(self, flow: mitmproxy.http.HTTPFlow):
    • def responseheaders(self, flow: mitmproxy.http.HTTPFlow):
    • def error(self, flow: mitmproxy.http.HTTPFlow):

這裡我們主要用到了響應事件,程式碼如下

def response(flow):
    tmp_txt = {"err_code":0,"err_msg":"","data":
        {"map_md5":["046ef1bab26e5b9bfe2473ded237b572","046ef1bab26e5b9bfe2473ded237b572"],
         "map_seed":[3622853803,3053757364,32667028,3621470055]}}
    if "map_info_ex" in flow.request.url:
        info(str(response.text))
        print(type(tmp_txt))
        print(type(json.dumps(tmp_txt)))
        response.set_text(json.dumps(tmp_txt))
        info(str(response.text))

我們判斷請求 url 中是否包含 map_info_ex ,如果包含,則篡改 response 資訊

下面我們以如下命令重新啟動代理程式

這樣,當我通過第一關之後,進入第二關時,其難度還是與第一關一樣的,怎麼樣,開心吧!

當然我們還可以篡改其他介面,比如 rank 介面,話題介面等等,都可以輕鬆達到我們想要的目的,就不再一一贅述了

好了,這就是今天分享的全部內容,喜歡就點個贊吧~

本文由mdnice多平臺釋出