mitmproxy使用详解
mitmproxy 相比Charles、fiddler的优点在于,它可以命令行方式或脚本的方式进行mock
mitmproxy不仅可以像Charles那样抓包,还可以对请求数据进行二次开发,进入高度二次定制
大家可以先查看下官网的相关文档
- mitmproxy 官网:https://www.mitmproxy.org/
- mitmproxy 官方文档:https://docs.mitmproxy.org/stable/
- mitmproxy 官方脚本 demo:https://docs.mitmproxy.org/stable/addons-examples/
mitmproxy安装
Mac安装
brew install mitmproxy
Windows安装
该方法同样适用于Mac,是利用Python安装的
pip install pipx
pipx install mitmproxy
也可以直接使用 pip install mitmproxy
命令安装
如果是Mac,通过这2条命令安装完后,会自动添加好环境变量。
但对于Windows来说,就需要我们手动添加环境变量了,Windows安装成功的提示中会给出需要配置的目录,将其配置到path环境变量中即可
推荐使用Python进行安装,注意Python版本需大于等于3.6
安装并配置完环境变量后,可以通过查看版命令本mitmproxy --version
验证我们是否安装并配置好环境变量
mirmproxy使用
同Charles一样,在使用mitmproxy之前,我们需要先安装整数
在连接mitmproxy代理之后,通过访问连接:http://mitm.it/ 来安装证书
选择相应版本安装即可,注意安装完证书后需要信任证书后才能正常进行抓包
mitmproxy 工具有以下三部分组成
- mitmproxy -> 命令行工具(win不支持)
- mitmdump -> 加载 python 脚本
- mitmweb -> web 界面工具
常用参数
-h 帮助信息
-p 修改监听端口
-s 加载 python 脚本
默认监听端口8080
mitmproxy
mitmproxy是已命令行的方式运行的
例:监听8999端口进行抓包
mitmproxy -p 8999
可以通过上下移动鼠标滚轮的切换请求,选中某一请求后单击可查看请求详情
然后通过q
命令可以返回到主界面,然后通过f
命令加上要过滤的参数可以过滤请求,如下是只展示包含mitmproxy的请求
最后可以通过q
命令退出
mitmweb
mitmweb是启动同mitmproxy启动方式一样,与mitmproxy不同的是,mitmweb是有web页面的
例:启动mitmweb并指定监听8999端口
mitmweb -p 8999
遇到的坑,当我通过命令mitmweb -p 8999
启动时,报OSError: [Errno 48] Address already in use
的错误,报错详情如下:
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.9/bin/mitmweb", line 8, in <module>
sys.exit(mitmweb())
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/mitmproxy/tools/main.py", line 168, in mitmweb
run(web.master.WebMaster, cmdline.mitmweb, args)
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/mitmproxy/tools/main.py", line 127, in run
master.run()
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/mitmproxy/tools/web/master.py", line 108, in run
http_server.listen(self.options.web_port, self.options.web_host)
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/tornado/tcpserver.py", line 151, in listen
sockets = bind_sockets(port, address=address)
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/tornado/netutil.py", line 174, in bind_sockets
sock.bind(sockaddr)
OSError: [Errno 48] Address already in use
以上报错是因为,mitmweb启动需要使用8081端口,而我的8081端口已经被占用了,终止占用的进程之后,启动成功
chenshifengdeMacBook-Pro:~ chenshifeng$ lsof -i:8081
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 456 chenshifeng 128u IPv6 0xfe3ce857c44c2c7d 0t0 TCP localhost:sunproxyadmin (LISTEN)
chenshifengdeMacBook-Pro:~ chenshifeng$ kill 456
chenshifengdeMacBook-Pro:~ chenshifeng$ mitmweb -p 8999
Web server listening at http://127.0.0.1:8081/
Proxy server listening at http://*:8999
页面功能介绍:
miemweb mock数据使用:
mitmdump
mitmdump是核心,需要重点掌握
mitmdump 是 mitmproxy 的命令行版本。将 tcpdump 用于 HTT
近似于 charles 的命令行版本
python:mitmproxy
功能和 charles、fiddler 相似,强大之处在于它的工具 mitmdump 可以直接对接 python 对请求做处理
mitmdump 是 mitmproxy 的命令行窗口,同时还可对接 python 对请求进行处理,因此就不用手动截获和分析 http 请求和响应,只需要写好请求和响应的处理逻辑即可
录制与回放
- 录制:mitmdump -w 文件名
- 过滤:mitmdump -nr 文件名 -w 文件名2 "~s hogwarts"
- 回放:mitmdump -nC 文件名
参数
- -s "script.py --bar" # 执行脚本,通过双引号来添加参数
- -n 不启动代理
- -r 读取文件内容
- -w 写入文件
- ~s 过滤响应数据
- ~q 过滤请求数据
- 更多参数见:https://docs.mitmproxy.org/stable/concepts-filters/
例1:监听8999端口,并录制请求数据,保存到baidu.txt文件
mitmdump -p 8999 -w baidu.txt
打开百度搜索,依次搜索mitmproxy、mitmweb、mitmdump,然后结束录制。录制结束后,会在当前目录下生成二进制录制文件baudu.txt
例2:过滤上面录制的请求,只保存搜索mitmdump的数据
mitmdump -nr baidu.txt -w mitmdump.txt "~s mitmdump"
chenshifengdeMacBook-Pro:mitm chenshifeng$ mitmdump -nr baidu.txt -w mitmdump.txt "~s mitmdump"
Only processing flows that match "~s mitmdump"
127.0.0.1:54144: GET https://www.baidu.com/sugrec?pre=1&p=3&ie=utf-8&json=1&prod=pc&from=pc_web&sugsid=33423,33429…
<< 200 OK 675b
127.0.0.1:54140: GET https://www.baidu.com/s?ie=utf-8&mod=11&isbd=1&isid=fdb4c9fa0004968c&ie=utf-8&f=8&rsv_bp=1&tn…
<< 200 OK 214b
127.0.0.1:54140: GET https://www.baidu.com/s?ie=utf-8&mod=1&isbd=1&isid=fdb4c9fa0004968c&ie=utf-8&f=8&rsv_bp=1&tn=…
<< 200 OK 24.8k
127.0.0.1:54140: GET https://www.baidu.com/s?ie=utf-8&csq=1&pstg=20&mod=2&isbd=1&cqid=eaf04f36001734b3&istc=361&ve…
<< 200 OK 78b
127.0.0.1:54153: GET https://sp0.baidu.com/5bU_dTmfKgQFm2e88IuM_a/w.gif?q=mitmdump&fm=se&T=1612592652&y=9FD1FDF9&r…
<< 200 OK 0b
127.0.0.1:54149: GET https://sp1.baidu.com/5b1ZeDe5KgQFm2e88IuM_a/wb.gif?type=3&fm=flow_monitor&data=%5B%7B%7D%5D&…
<< 200 OK 0b
chenshifengdeMacBook-Pro:mitm chenshifeng$ ls
baidu.txt mitmdump.txt
例3:回放mitmdump.txt 文件接口
mitmdump -nC mitmdump.txt
chenshifengdeMacBook-Pro:mitm chenshifeng$ mitmdump -nC mitmdump.txt
127.0.0.1:54144: GET https://www.baidu.com/sugrec?pre=1&p=3&ie=utf-8&json=1&prod=pc&from=pc_web&sugsid=33423,33429…
<< 200 OK 676b
127.0.0.1:54140: GET https://www.baidu.com/s?ie=utf-8&mod=11&isbd=1&isid=fdb4c9fa0004968c&ie=utf-8&f=8&rsv_bp=1&tn…
<< 200 OK 214b
127.0.0.1:54140: GET https://www.baidu.com/s?ie=utf-8&mod=1&isbd=1&isid=fdb4c9fa0004968c&ie=utf-8&f=8&rsv_bp=1&tn=…
<< 200 OK 25k
127.0.0.1:54140: GET https://www.baidu.com/s?ie=utf-8&csq=1&pstg=20&mod=2&isbd=1&cqid=eaf04f36001734b3&istc=361&ve…
<< 200 OK 78b
127.0.0.1:54153: GET https://sp0.baidu.com/5bU_dTmfKgQFm2e88IuM_a/w.gif?q=mitmdump&fm=se&T=1612592652&y=9FD1FDF9&r…
<< 200 OK 0b
127.0.0.1:54149: GET https://sp1.baidu.com/5b1ZeDe5KgQFm2e88IuM_a/wb.gif?type=3&fm=flow_monitor&data=%5B%7B%7D%5D&…
<< 200 OK 0b
chenshifengdeMacBook-Pro:mitm chenshifeng$
mitmdump 脚本
例1:增加请求的头信息
#!/usr/bin/python
# -*- coding: UTF-8 -*-
"""
@author:chenshifeng
@file:test_mitm.py
@time:2020/11/29
"""
from mitmproxy import http
def request(flow: http.HTTPFlow):
# 增加请求的头信息
flow.request.headers["myheader"] = "shifeng"
print(flow.request.headers)
加载脚本:mitmdump -p 8999 -s /Users/chenshifeng/MyCode/PythonCode/SFDSZL/interface/test_mitm.py
例2:实现Charles中的MapLocal功能
修改返回值:
mitmdump脚本
#!/usr/bin/python
# -*- coding: UTF-8 -*-
"""
@author:chenshifeng
@file:test_maplocal.py
@time:2020/11/29
"""
from mitmproxy import http
def request(flow: http.HTTPFlow):
# 修改判断条件
if "quote.json" in flow.request.pretty_url and "x=" in flow.request.pretty_url:
# 打开保存在本地的数据文件
with open("/Users/chenshifeng/MyCode/PythonCode/SFDSZL/interface/quote.json") as f:
# 创造一个 response
flow.response = http.HTTPResponse.make(
200, # (optional) status code
# 读取文件中数据作为返回内容
f.read(),
# 指定返回数据的类型
{"Content-Type": "application/json"} # (optional) headers
)
加载脚本: mitmdump -p 8999 -s /Users/chenshifeng/MyCode/PythonCode/SFDSZL/interface/test_maplocal.py
例3:实现Charles中的MapRemote功能
mitmdump脚本
#!/usr/bin/python
# -*- coding: UTF-8 -*-
"""
@author:chenshifeng
@file:test_rewrite.py
@time:2020/11/29
"""
import json
from mitmproxy import http
def response(flow: http.HTTPFlow):
# 加上过滤条件
if "quote.json" in flow.request.pretty_url and "x=" in flow.request.pretty_url:
# 把响应数据转化成python对象,保存到data中
data = json.loads(flow.response.content)
# 对第一个股票保持原样
data['data']['items'][0] = data['data']['items'][0]
# 对第二个股票名字加长一倍
data['data']['items'][1]['quote']['name'] = data['data']['items'][1]['quote']['name'] * 2
# 对第三个股票名字变成空
data['data']['items'][2]['quote']['name'] = None
# 把修改后的内容赋值给 response 原始数据格式
flow.response.text = json.dumps(data)
加载脚本: mitmdump -p 8999 -s /Users/chenshifeng/MyCode/PythonCode/SFDSZL/interface/test_rewrite.py
更多例子详见官网介绍:https://docs.mitmproxy.org/stable/addons-scripting/
mitmproxy使用详解的更多相关文章
- Linq之旅:Linq入门详解(Linq to Objects)
示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...
- 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)
一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...
- EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解
前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...
- Java 字符串格式化详解
Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...
- Android Notification 详解(一)——基本操作
Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...
- Android Notification 详解——基本操作
Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...
- Git初探--笔记整理和Git命令详解
几个重要的概念 首先先明确几个概念: WorkPlace : 工作区 Index: 暂存区 Repository: 本地仓库/版本库 Remote: 远程仓库 当在Remote(如Github)上面c ...
- Drawable实战解析:Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)
Android XML shape 标签使用详解 一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...
- Node.js npm 详解
一.npm简介 安装npm请阅读我之前的文章Hello Node中npm安装那一部分,不过只介绍了linux平台,如果是其它平台,有前辈写了更加详细的介绍. npm的全称:Node Package M ...
随机推荐
- ArrayDeque API 与算法分析
ArrayDeque 是双端队列的动态数组实现,可以当作栈和队列来使用.作为栈时,它的效率比 Stack 更高,作为队列时,效率比 LinkedList 更高.ArrayDeque 大部分操作的时间复 ...
- 【C++】《Effective C++》第九章
杂项讨论 条款53:不要轻忽编译器的警告 请记住 严肃对待编译器发出的警告信息.努力在你的编译器的最高(最严苛)警告级别下争取"无任何警告"的容易. 不要过度依赖编译器的报警能力, ...
- Hbase 手动执行MajorCompation
说明: Major Compaction 的作用: 1.将一个Region下的所有StoreFile合并成一个StoreFile文件 2.对于删除.过期.多余版本的数据进行清除 由于MajorComp ...
- show engine innodb status
TRANSACTIONS------------Trx id counter 2003909(当前事务号)Purge done for trx's n:o < 2003905 (清理线程完成到了 ...
- 记录Js动态加载页面.append、html、appendChild、repend添加元素节点不生效以及解决办法
今天再优化blog页面的时候添加了个关注按钮和图片,但是页面上这个按钮和图片时有时无,本来是搞后端的,被这个前端的小问题搞得抓耳挠腮的! 网上各种查询解决方案,把我解决问题的艰辛历程分享出来,希望大家 ...
- css全站变灰
2020年4月4日全国哀悼日这一天,我发现不少网址都变灰了,我第一想法就是怎么做到的?不可能换素材整个网址重做一遍吧?后面发现是用的其实是css的filter滤镜: grayscale可以将图像转化为 ...
- 浅谈JavaScript代码性能优化2
一.减少判断层级 从下图代码中可以明显看出,同样的效果判断层级的减少可以优化性能 二.减少作用域链查找层级 简单解释下,下图中第一个运行foo函数,bar函数内打印name,bar作用域内没有name ...
- 【中文】【deplearning.ai】【吴恩达课后作业目录】
[目录][吴恩达课后作业目录] 吴恩达深度学习相关资源下载地址(蓝奏云) 课程 周数 名称 类型 语言 地址 课程1 - 神经网络和深度学习 第1周 深度学习简介 测验 中英 传送门 无编程作业 编程 ...
- FLask之视图
视图 1 FBV def index(): return render_template('index.html') app.add_url_rule('/index', 'index', index ...
- Mybatis总结(一)
Mybatis总结(一) 一.Mybatis启动流程(代码层面) 关于config.xml <?xml version="1.0" encoding="UTF-8& ...