使用mitmweb查看windows上软件发出去 的网络请求
背景
平时在windows是使用比较重的软件时,如idea,很想知道它到底背后在干啥,比如搜索插件的时候,感觉速度很慢,就想知道,是不是走了国外的服务器,在中国国内没有弄服务器吗?
这种时候就可以用mitmweb来查看idea发出去的网络流量到底是啥。
步骤
安装mitmweb
下载exe安装即可,然后在cmd中就可以使用mitmweb命令
启动mitmweb
cmd中直接执行:
mitmweb
启动mitmweb后,会默认在浏览器打开一个tab页:
大概如下:
http://127.0.0.1:8081/#/flows/
打开local application模式

注意啊,这里如果像上面这样选择,会导致电脑上所有的网络请求都被拦截到mitmweb,你可能会发现,有些网站好像都打不开了。
所以,我们不能这么玩,要选择一个要捕获流量的程序,对于idea,我这里选择:


值得注意的是,我这边idea是先启动的,这里才能搜索出来。有人会问,那这边如果程序没启动,搜不出来,怎么办?
其实,就算程序没启动,这里也可以随便输入:

当然,这么随便输入没有意义,当我们需要捕获某个程序,如idea初始启动时的流量,就可以先启动一次,先把它加入到这里。
然后,再把程序关了重新打开,就能捕获到程序初始启动的流量了。
查看百度网盘的流量
比如我启动百度网盘后,查看到大概的几个进程:

此时,再去百度网盘里操作,就可以在mitmweb查看到流量了。
此时,要看百度网盘启动时的流量,就把网盘关了重开就行:

idea流量查看
回归正题,我们查看下idea的流量,我这边刚开始查看不了,是因为说idea不信任mitmweb颁发的根证书。
然后就用下面的命令,把mitmweb的根证书,加到idea的证书库了:
下面的路径,大家自己改一下就行:
我先查看了是否存在mitmweb的根证书,自然是没有:
keytool -list -keystore "D:\Program Files\JetBrains\IntelliJ IDEA 2026.2.1\jbr\lib\security\cacerts" -storepass changeit |findstr mit
新增:
"D:\Program Files\JetBrains\IntelliJ IDEA 2026.2.1\jbr\bin\keytool.exe" -importcert -trustcacerts -noprompt -alias mitmproxy -file "C:\Users\caoshu\.mitmproxy\mitmproxy-ca-cert.pem" -keystore "D:\Program Files\JetBrains\IntelliJ IDEA 2026.2.1\jbr\lib\security\cacerts" -storepass changeit
C:\Users\xxx>keytool -list -keystore "D:\Program Files\JetBrains\IntelliJ IDEA 2026.2.1\jbr\lib\security\cacerts" -storepass changeit |findstr mit
mitmproxy, 2026-9-25, trustedCertEntry,
上述所示,再查已经有了。

其他
原理
https://www.mitmproxy.org/posts/local-capture/windows/
原文翻译:
尽管 macOS 为我们提供了相对完善的系统 API, 用于流量重定向(此处暂不讨论相关的代码签名相关难题), Windows 系统并不具备与之对应的功能。与 macOS 系统不同,Windows 并不以处理 TCP 流的方式来实现此功能。 我们捕获单个数据包,并需自行处理 TCP 数据包重组。
为了捕获数据包,mitmproxy 会启动一个具有特权权限的重定向进程,该进程利用 WinDivert 实现功能。 通过windivert-rust 引入一个用户模式数据包捕获库。 这使我们能够针对特定的 PID 进行操作,同时避免在本地使用内存不安全代码。
当重定向器判定某个特定数据包需要被拦截时, 该数据通过命名管道传输至 mitmproxy_rs。在此过程中,我们复用已有的用户空间资源。 TCP/IP 协议栈将数据包转换为流,随后将其传递给 mitmproxy。
WinDivert
https://github.com/basil00/WinDivert
如下图所示,就是mitmweb这类启动时,就会把过滤表达式传给底层的windivert,windivert在运行时,就会判断流量是否符合过滤表达式,符合的话,就会交给mitmweb这类程序去处理,否则就放行。

本地启动了代理软件后,在mitmweb local application模式中查看不到流量
mitmweb中以local application模式运行时,捕获的app必须是发起出站流量的。
比如,
我在everything中点检查更新时,发现是可以在mitmweb中查看到流量的。
但是,如果本机开启了代理程序,如charles这类(会设置系统代理为localhost:8888),那everything会先把流量发给本机的charles。这部分都是在本机loopback是的流量,mitmweb local application貌似是不捕获这种流量的。
只有charles往外发的时候,这部分流量才会被捕获到。
所以,要改成这样:

此时,流量变成了:
everything --本地代理》 charles
然后mitmweb监控charles的流量

mitmweb的upstream模式
这个模式,这么理解。
charles在localhost:8888开启了代理。
那mitmweb可以在8080端口开个代理,然后上游设置为charles的localhost:8888.
然后程序或者系统,设置代理为mitmweb的8080端口。


不过接下来,我试了下,发现mitmweb中报错了:

是:
Everything ──系统代理──▶ mitmweb:8080 ──upstream──▶ Charles:8888 ──▶ www.voidtools.com:443
因为charles给mitmweb返回的是charles自己的证书,这个证书mitmweb不认。
mitmweb不检查证书
可以这样,让mitmweb不检查证书,就行了:
mitmweb --mode upstream:http://127.0.0.1:8888/ --ssl-insecure

导出charles证书让mitmweb信任
还有个方式:
Charles 菜单 Help → SSL Proxying → Save Charles Root Certificate,导出为 .pem,然后:
mitmweb --mode upstream:http://127.0.0.1:8888/ --set ssl_verify_upstream_trusted_ca=C:\path\charles-ca.pem
这样也是可以的。

浙公网安备 33010602011771号