モバイルアプリ内の確立したWebソケットのテキスト送受信を、プロキシーで改竄したり遅延させたりしたい

そういうことができるツールがあるか探す。
CharlesはWebソケットのテキスト送受信を傍受することはできるが、改ざんや遅延は出来なさそう。

Burp Suiteというセキュリティのツールがありできそうな気配がしたが、Webサイト専用ツールだった。

Proxyman Appはそういう機能がまだ実装されていなさそう。

mitmproxyというツールはスクリプトによりできるかもしれない。試してみる

mitmproxyはアドオン機能で結構簡単にリクエストの改ざんができそう。

mitmproxy、若干プロキシーとしての動作速度が遅いかな・・・?

類似ツールで参考になるページ

AndroidのWebソケットをmitmproxyに通すことができず、一旦挫折

mitmproxyのHTTPS通信を傍受するための証明書等。

FiddlerでWebソケット通信を傍受する方法。

Androidの WebSocketClient
がCharlesのSOCKSプロキシモードのみで通信傍受できるが、それ以外で全くできない。iOSは普通にできるので、プロトコルが対応していないのか?

以下あたりが参考になるかもしれない

Androidの WebSocketClient がCharlesのSOCKSプロキシモードのみで通信傍受できるが、それ以外で全くできない。iOSは普通にできるので、プロトコルが対応していないのか?
AndroidのWebソケットライブラリをOkHttpに変更すると、CharlesのHTTPモードやmitmproxyのHTTPモードなどで通信傍受できた。
Androidアプリのコード

Webソケットにおけるサーバーからの応答を遅延させるスクリプトは以下が成功した。
import asyncio
import logging
from mitmproxy import http
from mitmproxy import ctx
async def websocket_message(flow: http.HTTPFlow):
assert flow.websocket is not None # make type checker happy
# Get the latest message
latest_message = flow.websocket.messages[-1]
# Was the message sent from the server and response to the client message?
if not latest_message.from_client:
latest_message.drop()
logging.info(f"Delay message from the server for 1 seconds: {latest_message.text}")
# delay response for 1 second
await asyncio.sleep(1)
ctx.master.commands.call(
"inject.websocket", flow, latest_message.from_client, latest_message.text.encode()
)
実行コマンド
mitmproxy -s anatomy.py
logging
の内容を見るには以下が良い。
mitmdump -s anatomy.py

mitmproxyのPythonスクリプトの内容は、mitmproxy起動中でも上書き保存すれば即時反映される。