LoginSignup
0
0

mitmproxyのaddonを書いてみる

Posted at

mitmproxyのaddonを書いてみる

リクエスト先をlocalhostに飛ばしたいとき

def request(flow):
    if flow.request.pretty_host == "example.com":
        flow.request.host = "localhost"
        flow.request.port = 8889
        flow.request.scheme = "http"
        flow.request.headers["Host"] = "localhost"
        flow.request.headers["Content-Type"] = "text/plain"

レスポンスを加工したいとき

def response(flow: http.HTTPFlow) -> None:
    # 略

content viewを追加したいとき

from mitmproxy import contentviews, flow, http
from mitmproxy.contentviews.json import format_json, parse_json, PARSE_ERROR

class XXXX(contentviews.View):
    name = "content viewの名前"

    # 戻り値が表示する内容
    # parse_jsonにjsonを渡すと色付けして表示してくれるので、加工したデータをjsonにして渡すとよい
    def __call__(
        self,
        data: bytes,
        *,
        content_type: Optional[str] = None,
        flow: Optional[flow.Flow] = None,
        http_message: Optional[http.Message] = None,
        **unknown_metadata,
    ) -> contentviews.TViewResult:
        json_body = parse_json(data)
        if json_body is not PARSE_ERROR:
            return self.name, format_json(json_body)

    # content viewでこれが選択される優先順位を指定する
    # 数字が大きいほうが優先順位が高い
    def render_priority(
        self,
        data: bytes,
        *,
        content_type: Optional[str] = None,
        flow: Optional[flow.Flow] = None,
        http_message: Optional[http.Message] = None,
        **unknown_metadata,
    ) -> float:
        if "XXXXX" in http_message.headers:
            return 2
        else:
            return 0


xxx = XXX()

def load(l):
    contentviews.add(xxx)

def done():
    contentviews.remove(xxx)

他にも、protobufをparseしたりできますし、androidのtermux上でも同様に動かせるので、発送次第では色々なことができます

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0