保存解码后的 Protobuf 内容

Saving decoded Protobuf content

我正在尝试设置一个 .py 插件,它将解码的 Protobuf 响应保存到文件中,但无论我做什么,结果总是以字节格式(未解码)文件。我也尝试通过在 Mitmproxy 中使用 "w" 来做同样的事情——尽管在屏幕上我看到了解码数据,但在文件中它又被编码了。 任何想法如何正确地做到这一点?

现在的示例代码:

import mitmproxy
def response(flow):
    # if flow.request.pretty_url.endswith("some-url.com/endpoint"):
    if flow.request.pretty_url.endswith("some-url.com/endpoint"):
        f = open("test.log","ab")
        with decoded(flow.response)
            f.write(flow.request.content)
            f.write(flow.response.content)

呃,我不确定这是否有帮助,但是如果您不以二进制模式打开文件会怎样

f = open("test.log","a")

?

嗨,

我发现的一些基本内容。 尝试替换

f.write(flow.request.content)

f.write(flow.request.text)

我在这个网站上看到的 https://discourse.mitmproxy.org/t/modifying-https-response-body-not-working/645/3

请阅读并尝试此操作以收集请求和响应。 MITM Proxy, getting entire request and response string

祝你的项目好运。

我找到了做到这一点的方法。似乎 mitmdump 或 mitmproxy 无法保存原始解码的 Protobuf,所以我使用:

mitmdump -s decode_script.py

使用以下脚本将解码后的数据保存到文件中:

import mitmproxy
import subprocess
import time

def response(flow):
    if flow.request.pretty_url.endswith("HERE/IS/SOME/API/PATH"):
        protobuffedResponse=flow.response.content
        (out, err) = subprocess.Popen(['protoc', '--decode_raw'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate(protobuffedResponse)
        outStr = str(out, 'utf-8')
        outStr = outStr.replace('\"', '"')
        timestr = time.strftime("%Y%m%d-%H%M%S")
        with open("decoded_messages/" + timestr + ".decode_raw.log","w") as f:
            f.write(outStr)