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