mitmproxy详解。什么?你还在用Fiddler everywhere抓包?

原创博客不易,如若转载请注明来源

前言

测试/爬虫工作中,很重要的一环一定是抓包。什么?你还在用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上在网络配置中,配置全局代理。

Screen Shot 2022-06-19 at 11.26.25

安装证书

配置好代理后,浏览器访问 mitm.it。

配置好代理后,访问mitm.it才能打开证书下载页面

Screen Shot 2022-06-19 at 11.26.31

下载安装对应系统的证书。

命令行中使用

命令行启动有三个命令:

  • 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发生错误时调用
        """
    
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C知道:要使用 Fiddler Everywhere 抓包手机应用的流量,您需要按照以下步骤进行设置: 1. 首先,确保您已经在您的计算机上安装了 Fiddler Everywhere。您可以从 Fiddler Everywhere 官方网站(https://www.telerik.com/fiddler-everywhere)下载并安装它。 2. 连接您的手机和计算机到同一个网络上,可以是通过 Wi-Fi 连接或 USB 连接。 3. 在手机上,打开设置,并找到网络设置。然后找到 Wi-Fi 设置或移动网络设置,根据您的连接类型进行调整。 4. 找到您当前所连接的 Wi-Fi 网络或移动网络,并点击进入详细设置。 5. 找到代理设置,选择手动代理配置(Manual Proxy Configuration)。 6. 在代理服务器主机名(Proxy Server Hostname)中输入您计算机上运行 Fiddler Everywhere 的 IP 地址。您可以在 Fiddler Everywhere 的界面中找到此信息。 7. 在代理服务器端口(Proxy Server Port)中输入默认的 Fiddler Everywhere 端口号,通常是 8866。 8. 保存设置并退出网络设置页面。 9. 在计算机上运行 Fiddler Everywhere,并确保它正在监听网络流量。 10. 现在您应该能够在 Fiddler Everywhere 中看到手机应用程序的网络流量,并进行抓包分析。 请注意,这只是基本的设置过程,具体步骤可能会因手机型号、操作系统本和网络配置而有所不同。确保您已经详细查阅了 Fiddler Everywhere 的文档,并按照其指南进行操作。同时,请遵守法律和道德规范,并仅在合法和道德的范围内使用抓包工具。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值