原创博客不易,如若转载请注明来源
- 参考文档
前言
测试/爬虫工作中,很重要的一环一定是抓包。什么?你还在用Fiddler?Charles?
可能你还在苦恼,Mac上只能用Charles和阉割版Fiddler everywhere。现在有了mitmproxy,支持自定义python插件,轻松实现你想要全部功能。
本文应该是全网最全,最详细的mitmproxy文章了,部分内容甚至官方文档中都没有。没有官方文档细节,但可能比官方文档更通俗易懂!
本文出自:csdn,请勿随意转载。有疑问欢迎留言,必回。
安装
Mac
brew install mitmproxy
Python
# 使用 python3
pip install mitmproxy
使用
先配置mitmproxy开放的代理。手机/浏览器/电脑,配置mitmproxy启动设备的IP和mitmproxy监听的端口。
手机 or 浏览器 or 电脑,配置 ip + port。
例如:mac上在网络配置中,配置全局代理。
安装证书
配置好代理后,浏览器访问 mitm.it。
配置好代理后,访问mitm.it才能打开证书下载页面
下载安装对应系统的证书。
命令行中使用
命令行启动有三个命令:
-
mitmproxy
直接命令行启动,
-p
指定端口# 默认端口 8080 mitmproxy
-
mitmweb
web端可视化启动,输入命令后
mitmweb
-
mitmdump
可以
-s
加载脚本mitmdump
详细参数查看下文 => 常用参数说明
Python客户端
-
启动入口
from mitmproxy.tools.main import mitmdump if __name__ == '__main__': """""" mitmdump([ "-s", "addon/addon.py", "-p", "8866", ])
-
脚本
addon/addon.py
import json import mitmproxy from mitmproxy import http from pokit.tools.logger.logger_factory import LoggerFactory logger = LoggerFactory.get_logger("addon") class HookAddon(object): """插件类""" def response(self, flow: mitmproxy.http.HTTPFlow): """ response hook """ addons = [ HookAddon() ]
常用参数说明
参数 | 含义 | 示例 |
---|---|---|
-p | 指定端口 | mitmproxy -p 8866 |
-s | 加载脚本 | mitmproxy -s hook_addon.py |
–version | 查看mitmproxy版本 | mitmproxy --version |
常用脚本API
生命周期事件
class LifecycleHook(object):
"""
生命周期事件Hook
"""
def load(self, loader: mitmproxy.addonmanager.Loader):
"""
首次加载插件时调用。
此事件接收一个加载程序对象,其中包含添加选项和命令的方法。此方法是插件自行配置的地方。
"""
def running(self):
"""
当代理完全启动并运行时调用。
"""
def configure(self, updated: Set[str]):
"""
配置更改时调用。
更新的参数是一个类似集的对象,包含所有更改选项的key。此事件在启动期间调用,所有选项都在更新的set中。
"""
def done(self):
"""
当插件关闭时调用,
从mitmproxy实例中删除、或者在mitmproxy本身关闭时调用。在关机时,此事件在事件循环终止后调用,
它将是插件看到的最后一个事件(注意:日志处理程序此时已关闭,因此对日志函数的调用不会产生输出)。
"""
连接事件
class ConnectionHook(object):
"""
连接事件Hook
"""
def client_connected(self, client: mitmproxy.connection.Client):
"""
客户端已连接到mitmproxy时调用。
请注意,一个连接可以对应多个HTTP请求。
"""
def client_disconnected(self, client: mitmproxy.connection.Client):
"""
客户端连接已被关闭时调用。
无论是mitmproxy还是客户端
"""
def server_connect(self, data: mitmproxy.proxy.server_hooks.ServerConnectionHookData):
"""
Mitmproxy即将连接到服务器时调用。
请注意,一个连接可以对应多个请求。
"""
def server_connected(self, data: mitmproxy.proxy.server_hooks.ServerConnectionHookData):
"""
Mitmproxy已连接到服务器时调用。
"""
def server_disconnected(self, data: mitmproxy.proxy.server_hooks.ServerConnectionHookData):
"""
服务器连接已被关闭时调用
"""
HTTP事件
class HTTPHook(object):
"""
HTTP Hook
"""
def requestheaders(self, flow: mitmproxy.http.HTTPFlow):
"""
http请求头成功读取时调用
此时,body还是空的
"""
def request(self, flow: mitmproxy.http.HTTPFlow):
"""
完整http请求被读取时调用
注意:可以在此处修改请求内容
"""
def responseheaders(self, flow: mitmproxy.http.HTTPFlow):
"""
http响应头成功读取时调用
此时,body还是空的
"""
def response(self, flow: mitmproxy.http.HTTPFlow):
"""
拿到完整http响应时调用
注意:可以在此处修改响应内容
"""
def http_connect(self, flow: mitmproxy.http.HTTPFlow):
"""
http连接建立时调用(不常用)
"""
def http_connect_upstream(self, flow: mitmproxy.http.HTTPFlow):
"""
http请求即将发送到上游代理时调用(不常用)
"""
TCP事件
class TCPHook(object):
"""
TCP Hook
"""
def tcp_start(self, flow: mitmproxy.tcp.TCPFlow):
"""
TCP连接开始时调用
"""
def tcp_message(self, flow: mitmproxy.tcp.TCPFlow):
"""
TCP收到消息时调用
在这块消息是可以修改的
"""
def tcp_end(self, flow: mitmproxy.tcp.TCPFlow):
"""
TCP连接结束时调用
"""
def tcp_error(self, flow: mitmproxy.tcp.TCPFlow):
"""
TCP发生错误时调用
"""