是否可以通过编程方式从数据包创建请求?

Is it possible to recreate a request from the packets programatically?

对于我正在制作的脚本,我需要能够看到随请求一起发送的参数。 这可以通过 Fiddler 实现,但我正在尝试自动化该过程。

Here 是一些截图。正如您在 Fiddler 的第一张图片中看到的,我可以看到请求的 URL 以及随该请求发送的参数。

我试着用下面的代码用scapy做一些数据包嗅探,看看我是否能得到类似的结果,但我得到的是在第二张图片中。基本上,我可以获取数据包的源和目标作为 IP 地址,但数据包本身只是字节。

def sniffer():
    t = AsyncSniffer(prn = lambda x: x.summary(), count = 10)
    t.start()
    time.sleep(8)
    results = t.results
    print(len(results))
    print(results)
    print(results[0])

据我了解,建立TCP连接后,请求被分解成几个IP数据包,然后发送到目的地。我希望能够复制 Fiddler 的功能,在那里我可以看到请求的 url,然后是发送过来的参数值。

仅通过从数据包中收集的信息来重新创建请求的信息是否可行?

或者这种差异是因为嗅探是在第 2 层完成的,然后 Fiddler 可能在第 3/4 层运行 before/after 完成了 IP 数据包的转换,所以它实际上看到了原始文件的内容请求本身和数据包组合的结果?如果我的理解有误,请指正。

基本上,我的问题归结为:“是否有一个 python 模块可用于复制 Fiddler 的功能,以识别请求的目的地 url 以及随同发送的参数那个要求?

嗅探到的流量是 HTTPS 流量 - 因此仅通过嗅探您将看不到 HTTP request/response 的任何详细信息,因为它是通过 SSL/TLS.

加密的

Fiddler 是一个具有 HTTPS 拦截功能的代理,这与在网络级别嗅探流量完全不同。这意味着对于客户端应用程序,Fiddler“模仿”服务器,对于服务器,Fiddler 模仿客户端。这允许 Fiddler 解密 requests/responses 并将它们显示给您。

如果您想在 python 级别执行请求拦截,我建议您使用 mitmproxy 而不是 Fiddler。此代理也可以执行 HTTPS 拦截,但它是用 Python 编写的,因此更容易集成到您的 Python 环境中。

或者,如果您只想查看 Python 程序的 request/response 详细信息,以适当的方式设置 log-level 可能更容易做到这一点。参见例如这个问题:Log all requests from the python-requests module