mitmproxy介绍及使用

mitmproxy介绍

mitmproxy又名中间人攻击代理,是一个抓包工具,类似于WireShark、Filddler,并且它支持抓取HTTP和HTTPS协议的数据包,只不过它是一个控制台的形式操作。另外,它还有两个非常有用的组件,一个mitmdump,它是mitmproxy的命令行接口,可以直接抓取请求数据;另一个是mitmweb,它是一个web程序,通过它可以清楚的观察mitmproxy抓取的请求数据。

为什么选择 mitmproxy

1. 相对于我们常用的 fiddle 代理工具,它是可以跨平台。

2. 相对于跨平台的 charles 代理工具,它是开源免费的。

3. 最重要的一点,也是为什么我们采用 mitmproxy 来进行做 Mock,它支持使用 Python 进行二次开发,这样就可以结合业务进行灵活拓展了。

官方文档

https://docs.mitmproxy.org/stable/

功能简介

  1. 实时拦截、修改 HTTP/HTTPS 请求和响应
  2. 可保存完整的 http 会话,方便后续分析和重放
  3. 支持反向代理模式将流量转发到指定服务器
  4. 支持 macOS 和 Linux上的透明代理模式
  5. 支持用 Python 脚本对 HTTP 通信进行修改

抓包网络调试

使用WebView组件开发,软件可输入网页地址并显示网页内容。把工具的代理设置指向mitmproxy的端口服务。配合使用mitmproxy的MITM技术,监听和拦截输入框发起的网络请求。MITM技术允许应用程序在数据包从客户端到服务器的传输过程中进行干预,从而捕获和分析请求和响应数据,从响应数据中分析网络链接。

在微信小程序等环境中,并不能直接在WebView中配置代理。小程序的WebView组件直接使用的是微信小程序、支付宝小程序等平台提供的WebView实现,这些平台并不直接支持在WebView内设置代理。但在在QT或Android等环境中,WebView组件支持设置代理。这样就可以实现在不改变系统全局代理的情况下,直接造一工具实现对网络的解析。

安装

pip install mitmproxy

查看是否安装成功

# 使用以下三个命令中的任意一个即可,这三个命令返回的结果均一致
mitmproxy --version
mitmdump --version
mitmweb --version

mitmproxy默认只能拦截http,想要拦截https那就需要安装证书。

首先到$PYTHON_HOME/Scripts目录下运行一下mitmdump,完成之后在用户家目录下的.mitmproxy文件夹下即会生成的有证书,点击安装即可。

mitmproxy-ca.p12----PKCS12格式证书私钥

mitmproxy-ca.pem----PEM格式证书私钥

mitmproxy-ca-cert.cer----PEM格式证书,与mitmproxy-ca-cert.pem相同只是改变了后辍,适用于部分Android。

mitmproxy-ca-cert.p12----PKCS12格式证书,适用于Windows

mitmproxy-ca-cert.pem----PEM格式证书,适用于大多数非Windows平台

mitmproxy-dhparam.pem----PEM格式秘钥文件,用于增强SSL安全性

Windows安装证书

双击mitmproxy-ca-cert.p12----全部默认直接点“下一步”直到安装完成。

Android安装证书

把mitmproxy-ca-cert.cer通过usb复制到手机上----点击使用证书安装器安装证书。

工具介绍

mitmproxy 是一个控制台工具,允许交互式检查和修改 HTTP 流量。它与 mitmdump 的不同之处在于所有流都保存在内存中,这意味着它旨在获取和处理小样本。使用 ? 问号键查看上下文相关使用文档。 

mitmweb 提供了一个 web 页面,交互界面可以通过 localhost:8081 去访问。

mitmdump 可以通过执行一个 python 脚本去运行。

mitmproxy 作为一个常规的http代理服务器使用时,默认监听 http://localhost:8080,因此要想数据包经过 mitmproxy,需要配置浏览器的代理(本机或其他机器),代理设置步骤请自行搜索(比如插件:SwitchyOmega)。

代理设置好后可打开 http://mitm.it 验证http流量是否经过 mitmproxy。

如果显示以下文字,则代理配置的不对,流量不走 mitmproxy

If you can see this, traffic is not passing through mitmproxy.

如果配置正确,打开 http://mitm.it 会显示如下界面:

执行 mitmproxy 命令后在终端显示数据包,通过 Shift + ? 可以查看查看当前页面可用的命令。

q    退出(相当于返回键,可一级一级返回)
d    删除当前(黄色箭头)指向的链接
D    恢复刚才删除的请求
G    跳到最新一个请求
g    跳到第一个请求
C    清空控制台(C是大写)
i    可输入需要拦截的文件或者域名(逗号需要用\来做转译,栗子:feezu.cn)
a    放行请求
A    放行所有请求
?    查看界面帮助信息
^ v    上下箭头移动光标
enter    查看光标所在列的内容
tab    分别查看 Request 和 Response 的详细信息
/    搜索body里的内容
esc    退出编辑
e    进入编辑模式

脚本示例提取需要信息

from mitmproxy import http

def request(flow: http.HTTPFlow) -> None:
    # 检查请求的URL是否包含特定的关键字
    if "video" in flow.request.pretty_url:
        print(f"success&&&&&&&&&&&&&&&&& Detected video request: {flow.request.pretty_url}")

def response(flow: http.HTTPFlow) -> None:
    # 检查响应的内容类型是否为视频
    if "video" in flow.response.headers.get("Content-Type", ""):
        print(f"success&&&&&&&&&&&&&&&&& Detected video response: {flow.response.headers.get('Content-Type')}")
        print(f"success&&&&&&&&&&&&&&&&& Video URL: {flow.request.pretty_url}")
        #video_url = flow.request.url
        video_url = flow.request.pretty_url
        #ctx.log.info(f"success&&&&&&&&&&&&&&&&&---------Found video URL: {video_url}")
        print(f"success&&&&&&&&&&&&&&&&&---------Found video URL: {video_url}")
        # 将视频地址保存到文件
        with open("video_urls.txt", "a") as file:
            file.write(video_url + "\n")
            file.flush() 

如何使用

#命令行下执行
mitmproxy -s video_scraper.py

python脚本自动开启并设置windows的浏览器代理

可以使用Python脚本自动开启并设置Windows的浏览器代理,并在退出时关闭代理。你可以使用winreg模块来修改Windows注册表中的代理设置。以下是一个示例脚本,展示了如何实现这一功能:

import winreg
import os

def set_proxy(enable=True, proxy_server="127.0.0.1:8080"):
    internet_settings = winreg.OpenKey(winreg.HKEY_CURRENT_USER,
                                       r'Software\Microsoft\Windows\CurrentVersion\Internet Settings',
                                       0, winreg.KEY_ALL_ACCESS)
    if enable:
        winreg.SetValueEx(internet_settings, "ProxyEnable", 0, winreg.REG_DWORD, 1)
        winreg.SetValueEx(internet_settings, "ProxyServer", 0, winreg.REG_SZ, proxy_server)
    else:
        winreg.SetValueEx(internet_settings, "ProxyEnable", 0, winreg.REG_DWORD, 0)
    winreg.CloseKey(internet_settings)

def main():
    try:
        # 开启代理
        set_proxy(enable=True)
        print("代理已开启")

        # 运行你的主要代码,例如启动浏览器或抓取视频地址
        # ...

    finally:
        # 关闭代理
        set_proxy(enable=False)
        print("代理已关闭")

if __name__ == "__main__":
    main()

解释

  1. 设置代理

    • set_proxy函数用于设置或关闭代理。
    • winreg.OpenKey打开注册表项。
    • winreg.SetValueEx设置代理启用状态和代理服务器地址。
  2. 主函数

    • main函数首先开启代理,然后运行你的主要代码(例如启动浏览器或抓取视频地址)。
    • 使用try...finally确保无论发生什么情况,代理都会在脚本结束时关闭。

注意事项

  • 这个脚本会修改Windows注册表中的Internet设置,因此需要管理员权限。
  • 你可以根据需要修改代理服务器地址。

通过这种方式,可以使用Python脚本自动管理Windows的浏览器代理设置。

但通过这种自动修改系统代理的方式,需要注意一是需要具有管理权限,另外就是退出后别忘恢复代理,否则不懂的人还不知道网络是咋回事。当然懂的人会去找到系统代理的设置并改回来。 

当然,还有一种办法就是不改系统的代理,而是使用webview组件,工具内嵌浏览器组件,设置工具的代理。 以下用qt(版本qt5.10)实现。

QWebEngineView 是QT5.4版本加入的新浏览器引擎,用于编辑、查看web内容。

在windows系统下 QWebEngineView支持MSVC编译器编译、不支持mingw编译。

使用QWebEngineView时,需要在工程文件里增加webenginewidgets模块的引用,并加上#include <QWebEngineView> 头文件。

QT工具实现

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QNetworkProxy>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //ui->mwebView->show();
    // 设置代理
    // 设置全局代理
   QNetworkProxy proxy;
   proxy.setType(QNetworkProxy::HttpProxy);
   proxy.setHostName("127.0.0.1");
   proxy.setPort(8080);
   QNetworkProxy::setApplicationProxy(proxy);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_btnLoad_clicked()
{
    QString url = ui->l_url->text();
    ui->mwebView->load(QUrl(url));
    ui->mwebView->show();
}

到这里很简单,其实关键的是,如何实现让脚本抓取的视频地址传给 qt呢? 方法有很多,这里介绍一种简单可行的方法,通过 socket通信,这样实现跨进程通信。

简单示例:

import mitmproxy.http
import json
import socket

def request(flow: mitmproxy.http.HTTPFlow):
    if "video" in flow.request.pretty_url:
        video_url = flow.request.pretty_url
        print(f"Detected video URL: {video_url}")
        
        # 将视频地址发送到Qt应用程序
        send_to_qt(video_url)

def send_to_qt(video_url):
    # 使用socket将视频地址发送到Qt应用程序
    host = '127.0.0.1'
    port = 12345
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.connect((host, port))
        s.sendall(video_url.encode())
./vcpkg.exe install openssl:x64-windows

其他资源

【mitmproxy】一、简介与快速上手-CSDN博客

抓包工具之mitmproxy-CSDN博客

【mitmproxy】一、简介与快速上手-CSDN博客

https://github.com/reqable/reqable-app

Python 实现代理拦截http请求:mitmproxy_mitmproxy 透明代理-CSDN博客

mitmproxy安装与配置-CSDN博客

Python3+mitmproxy安装使用教程(Windows)_mitmprxy 安装证书存放位置-CSDN博客

https://zhuanlan.zhihu.com/p/651063616

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/801460.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

openlayers WebGLPoints图层应用(光环、光晕扩散收缩)

本篇介绍一下使用 openlayers WebGLPoints图层应用&#xff08;光环、光晕扩散收缩&#xff09; 1 需求 WebGL渲染的光环、光晕扩散收缩 2 分析 WebGLPoints图层应用ol/expr/expression 的简单使用官网解释 WebGLPoints 的 style 属性比较多&#xff08;基本都是图标、填充…

CSS选择器(1)

以内部样式表编写CSS选择器&#xff0c;其主要编写在<head></head>元素里&#xff0c;通过<style></style>标签来定义内部样式表。 基本语法为&#xff1a; 选择器{ 声明块 } 声明块&#xff1a;是由一对大括号括起来&#xff0c;声明块中是一个一个的…

03MFC画笔/画刷/画椭圆/圆/(延时)文字

文章目录 画实心矩形自定义画布设计及使用连续画线及自定义定义变量扇形画椭圆/圆输出颜色文本定时器与定时事件画实心矩形 自定义画布设计及使用 连续画线及自定义定义变量 扇形 画椭圆/圆 输出颜色文本

杰发科技AC7801 —— __attribute__指定地址存储常量

const uint8_t usFlashInitVal[] __attribute__((at(0x08002800))) {0x55,0x55,0x55,0x55,0x55};//定位在flash中&#xff0c;0x00030000开始的6个字节信息固定 注意7801的地址在8000000之后 如地址选0x00000800烧录时候报错 不知道是不是atclinktool的bug&#xff0c;使用_…

缓存穿透,缓存雪崩,使用互斥锁解决缓存击穿

20240716学习redis 一、缓存穿透1. isNotBlank()方法和isNotEmpty()方法的区别2. 缓存穿透3. 缓存雪崩4. 缓存击穿的解决5 ctrlaltT&#xff0c;可以快速生成包围方式&#xff1a;6 //模拟重建延时7. 代码 &#xff08;使用互斥锁&#xff09; 一、缓存穿透 1. isNotBlank()方…

Linux系统编程-线程同步详解

线程同步是指多个线程协调工作&#xff0c;以便在共享资源的访问和操作过程中保持数据一致性和正确性。在多线程环境中&#xff0c;线程是并发执行的&#xff0c;因此如果多个线程同时访问和修改共享资源&#xff0c;可能会导致数据不一致、竞态条件&#xff08;race condition…

15 - matlab m_map地学绘图工具基础函数 - 一些数据转换函数(二)

15 - matlab m_map地学绘图工具基础函数 - 一些数据转换函数&#xff08;二&#xff09; 0. 引言1. 关于m_geodesic2. 关于mygrid_sand23. 结语 0. 引言 通过前面篇节已经将m_map绘图工具中大多绘图有关的函数进行过介绍&#xff0c;已经能够满足基本的绘图需求&#xff0c;本节…

我想做信号通路分析,但我就是不想学编程

“我想做信号通路分析&#xff0c;但我就是不想学编程。” “我又不是生信狗&#xff0c;学代码会死。” “你们这些做生信的&#xff0c;整天把数据分析搞得神神秘秘&#xff0c;不就是怕被人抢饭碗而已嘛。” “这都没分析出我想要的结果&#xff0c;不靠谱。” “你们做…

Go语言中GC(垃圾回收回收机制)三色标记与混合写屏障

5、Golang三色标记混合写屏障GC模式全分析 (yuque.com) 第1讲-课程目标_哔哩哔哩_bilibili Golang三色标记GC混合写屏障 Go V1.3之前的标记清除&#xff08;mark and sweep) 垃圾回收、内存管理、自动适放、三色标记法、STW (stop the world) 图的遍历&#xff1f;可达性分…

路网双线合并单线——ArcGISpro 解决方法

路网双线合并成单线是一个在地图制作、交通规划以及GIS分析中常见的需求。双线路网定义&#xff1a;具有不同流向、不同平面结构的道路。此外&#xff0c;车道数较多的道路&#xff08;例如&#xff0c;双黄实线车道数大于4的道路&#xff09;也可以视为双线路网&#xff0c;本…

走,戴上你的旅行搭子去探险吧

如今快节奏的生活经常会让人感到疲惫和压力&#xff0c;炎炎夏日&#xff0c;一直想给自己松松绑&#xff01; 最近我和我的的小伙伴们去户外探险了&#xff0c;三五好友&#xff0c;组队出去玩&#xff0c;真的很让人放松&#xff01;一起去户外呼吸大自然的空气&#xff0c;…

【Hot100】LeetCode—155. 最小栈

目录 题目1- 思路2- 实现⭐155. 最小栈——题解思路 3- ACM 实现 题目 原题连接&#xff1a;155. 最小栈 1- 思路 思路 最小栈 ——> 借助两个栈来实现 2- 实现 ⭐155. 最小栈——题解思路 class MinStack {Stack<Integer> data;Stack<Integer> min;public …

VUE:跨域配置代理服务器

//在vite.config。js中&#xff0c;同插件配置同级进行配置server:{proxy:{"/myrequest":{//代理域名&#xff0c;可自行修改target:"https://m.wzj.com/",//访问服务器的目标域名changeOrigin:true,//允许跨域configure:(proxy,options) > {proxy.on(&…

图片常用的压缩方法,适用多种常用图片格式

jpg、png、jpeg、gif等图片格式是日常最常用的三种图片类型&#xff0c;一般在使用或者上传图片的时候这几种是比较常用的格式。在使用图片的时候&#xff0c;最常见的一个问题就是图片太大需要缩小后才可以正常使用&#xff0c;那么有什么方法或者工具能够快速处理不同图片格式…

在Mac上免费恢复已删除的PowerPoint文件

Microsoft PowerPoint for Mac 允许您在 macOS 环境中访问您熟悉的 PowerPoint 工具。该软件是Mac版Microsoft Office套件的一部分&#xff0c;具有各种稳定版本&#xff0c;即。PowerPoint 2019、2016、2011 等 PowerPoint for Mac 与 Apple 自己的演示应用程序 Keynote 兼容…

组网升级,双击热备和宽带管理

拓扑 要求&#xff1a; 要求12&#xff1a; 要求13&#xff1a; 要求14&#xff1a; 要求15&#xff1a; 要求16&#xff1a;

记录些MySQL题集(2)

MySQL 不使用limit的分页查询 limit问题&#xff1a;limit&#xff0c;offset递增问题。随着offset的增加&#xff0c;条数不变&#xff0c;耗时却增加了。 limit 0,10 耗时1ms limit 300000,10 耗时152ms limit 600000,10 耗时312ms 毫秒级别可能没感觉。假…

netdata 监控软件安装与学习

netdata官网 netdata操作文档 前言&#xff1a; netdata是一款监控软件&#xff0c;可以监控多台主机也可以监控单台主机&#xff0c;监控单台主机时&#xff0c;开箱即用&#xff0c;web ui很棒。 环境&#xff1a; [root192 ~]# cat /etc/system-release CentOS Linux rel…

工业大数据是什么?应用工业大数据时面临哪些挑战?

在当今快速发展的工业领域&#xff0c;大数据已成为推动企业转型升级的核心动力。工业大数据&#xff0c;以其独特的价值和潜力&#xff0c;正逐渐改变着传统的生产、管理和决策模式。然而&#xff0c;伴随着大数据的快速发展&#xff0c;一系列挑战也随之浮现。本文将深入探讨…

玻璃透过率太阳光辐射系统模拟器

太阳光模拟器概述 太阳光模拟器是一种先进的实验室设备&#xff0c;它能模拟太阳光的全光谱辐射&#xff0c;包括紫外线、可见光和红外线&#xff0c;用以评估材料、产品或设备在太阳辐射影响下的性能和耐久性。太阳光模拟器在多个领域有着广泛的应用&#xff0c;如光伏电池测…