mitmprxoyツールとPythonによる高度なパケットキャプチャ実装

1.mitmproxyの拡張メカニズム

公式ドキュメントを参照:

mitmproxy アドオンの例:https://docs.mitmproxy.org/stable/addons-examples/#example-complexhar_dumppy

2.パケットキャプチャ - ローカルマッピング

雪球アプリを例に挙げる

1)スクリプトを作成し、mock2.json内の自選株リストデータを倍増させる

mitmproxydemo.py

from mitmproxy import http


def request(flow: http.HTTPFlow) -> None:
    if "quote.json" in flow.request.pretty_url and "x=" in flow.request.pretty_url:
        with open("/Users/zhaitiantian3/Public/mock2.json") as f:
            flow.response = http.HTTPResponse.make(200, f.read(), {"Content-Type": "application/json"})

2)モバイルアプリがプロキシに接続し、証明書をインストールする:mit.it

3)スクリプトを実行する

mitmdump -s mitmproxydemo.py

自選株リストをリフレッシュすると、データが倍増する。ただしiOS端末を使用している場合、このプロキシ設定により一部アプリでエラーが発生することがある。

<< Cannot establish TLS with 182.92.251.113:443 (sni: None): TlsException('Cannot validate certificate hostname without SNI')  

そのため解決策を検索する:

コマンドを使用する:

mitmdump -s -k mitmproxydemo.py

モック後のデータ:

3.パケットキャプチャ - レスポンス書き換え

1)Pythonスクリプトを作成する

rewriter.py

import json


def response(flow):
    if "quote.json" in flow.request.pretty_url and "x=" in flow.request.pretty_url:
        data = json.loads(flow.response.content)
        data['data']['items'][0]['quote']['name'] = data['data']['items'][0]['quote']['name'] + "test"
        flow.response.text = json.dumps(data)

2)モバイルアプリがプロキシに接続し、証明書をインストールする:mit.it

3)スクリプトを実行する

mitmdump -s rewriter.py

4)表示されるデータは以下の通り:

4.同等クラスデータの自動生成スクリプトを作成する:``` import json

from mitmproxy import http

url_index = dict() arrays = [-5, -3, -1, 0, 1, 3, 5, 100]

def response(flow: http.HTTPFlow) -> None: # if "Content-Type" in flow.response.headers.keys() and
# "json" in flow.response.headers['Content-Type']: if "quote.json" in flow.request.pretty_url and "x=" in flow.request.pretty_url: url = flow.request.url.split('.json')[0] if url not in url_index.keys(): url_index[url] = 0 else: url_index[url] += 1

    # 同等クラスから一つを選択し、アクセス回数に応じてループして使用
    seed = url_index[url] % len(arrays)
    print(seed)
    data = json.loads(flow.response.text)
    # データを一括で変更
    data_new = json_travel(data, num=arrays[seed])
    json_new = json.dumps(data_new, indent=2)
    flow.response.text = json_new

def json_travel(data, array=None, text=1, num=1): data_new = None # 辞書の場合、辞書を走査 if isinstance(data, dict): data_new = dict() for k, v in data.items(): data_new[k] = json_travel(v, array, text, num)

# リストの場合、各要素を走査
elif isinstance(data, list):
    data_new = list()
    for item in data:
        item_new = json_travel(item, array, text, num)
        if array is None:
            data_new.append(item_new)
        elif len(data_new) < array:
            data_new.append(item_new)
        else:
            pass
# 文字列の場合
elif isinstance(data, str):
    data_new = data * text
# 数値(intまたはfloat)の場合
elif isinstance(data, int) or isinstance(data, float):
    # 数値を乗算計算
    data_new = data * num
# その他の型はそのまま
else:
    data_new = data
return data_new

def test_json_travel(): with open("demo.json") as f: data = json.load(f) print(json_travel(data, array=0)) print(json_travel(data, text=5)) print(json_travel(data, num=5))


2)モバイルアプリがプロキシに接続し、証明書をインストールする:mit.it

3)スクリプトを実行する

mitmdump -s tstcase.py


アクセス回数に応じて現在の価格を乗算することで、他のフロントエンドのロジックを模擬できる

タグ: mitmproxy Python パケットキャプチャ HTTPプロキシ データモック

5月16日 21:56 投稿