mitmproxy详细文档:https://docs.mitmproxy.org/stable/
一、插件的基本介绍
- mitmproxy真正强大的地方在于自定义脚本插件。
- mitmproxy的插件机制由一组支持任何复杂组件的API组成。
- 通过响应事件,插件与mitmproxy交互,这允许它们之间有联系并可以改变mitmproxy的行为。
二、一个插件的具体剖析
from mitmproxy import ctx
class Counter:
def __init__(self):
self.num = 0
def request(self, flow):
self.num = self.num + 1
ctx.log.info("We've seen %d flows" % self.num)
addons = [
Counter()
]
- 插件的本质就是一个脚本文件,在python中就是一个类的实例对象。
- 上面是一个简单的插件,它跟踪我们看到的流的数量(更具体的说是HTTP请求的个数)。每当它看到一个新的流,他就会使用mitmproxy的内部日志记录机制来输出它的计数。
- 运行脚本命令如下:
mitmdump -s (./some_script.py)---这括号里面填写路径
注意事项:
- Mitmproxy选择
addons
全局列表的内容并将其内容加载到插件机制中。 - 插件只是对象,上面的代码中,我们的插件是
Counter
的一个实例。 - 该
request
方法是事件的实例。每当有请求来的话就会触发request
方法,进行self.num + 1
操作。每个事件(即request事件)都有一个参数。对于request
事件,它的参数是一个mitmproxy.http.HTTPFlow
的对象。 - 最后,
ctx
是有个全局模块,它公开了一个组常用于插件的标准对象。我们可以将ctx
对象作为第一个参数传递给每个事件,但是我们发现它只是将它作为一个可全局导入的公开。在这种情况下,我们使用ctx.log
对象进行日志记录。
三、相应的脚本
mitmproxy插件机制有一个简写,允许将模块作为一个整体被视为插件对象,如果事件中有flow的话,不管在外面还是里面,当有请求来的时候,就会触发事件的启动。这允许我们将事件处理函数放在模块范围中。例如:
def request(flow):
flow.request.headers["myheader"] = "value"
- 加上上面的方法事件后就会在每个请求头上加上
{'myheader':'value'}
。