Loading

使用mitmweb查看windows上软件发出去 的网络请求

背景

平时在windows是使用比较重的软件时,如idea,很想知道它到底背后在干啥,比如搜索插件的时候,感觉速度很慢,就想知道,是不是走了国外的服务器,在中国国内没有弄服务器吗?

这种时候就可以用mitmweb来查看idea发出去的网络流量到底是啥。

步骤

安装mitmweb

https://www.mitmproxy.org/

下载exe安装即可,然后在cmd中就可以使用mitmweb命令

启动mitmweb

cmd中直接执行:
mitmweb

启动mitmweb后,会默认在浏览器打开一个tab页:

大概如下:

http://127.0.0.1:8081/#/flows/

打开local application模式

image-20260925141245884

注意啊,这里如果像上面这样选择,会导致电脑上所有的网络请求都被拦截到mitmweb,你可能会发现,有些网站好像都打不开了。

所以,我们不能这么玩,要选择一个要捕获流量的程序,对于idea,我这里选择:

image-20260925141702332

image-20260925141715987

值得注意的是,我这边idea是先启动的,这里才能搜索出来。有人会问,那这边如果程序没启动,搜不出来,怎么办?

其实,就算程序没启动,这里也可以随便输入:

image-20260925141937489

当然,这么随便输入没有意义,当我们需要捕获某个程序,如idea初始启动时的流量,就可以先启动一次,先把它加入到这里。

然后,再把程序关了重新打开,就能捕获到程序初始启动的流量了。

查看百度网盘的流量

比如我启动百度网盘后,查看到大概的几个进程:

image-20260925143335305

此时,再去百度网盘里操作,就可以在mitmweb查看到流量了。

此时,要看百度网盘启动时的流量,就把网盘关了重开就行:

image-20260925143455061

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,

上述所示,再查已经有了。

image-20260925145038926

其他

原理

https://www.mitmproxy.org/posts/local-capture/windows/

Packet Redirection on 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这类程序去处理,否则就放行。

image-20260925145446370

本地启动了代理软件后,在mitmweb local application模式中查看不到流量

mitmweb中以local application模式运行时,捕获的app必须是发起出站流量的。

比如,image-20260925150014438

我在everything中点检查更新时,发现是可以在mitmweb中查看到流量的。

但是,如果本机开启了代理程序,如charles这类(会设置系统代理为localhost:8888),那everything会先把流量发给本机的charles。这部分都是在本机loopback是的流量,mitmweb local application貌似是不捕获这种流量的。

只有charles往外发的时候,这部分流量才会被捕获到。

所以,要改成这样:

image-20260925151449945

此时,流量变成了:

everything --本地代理》 charles

然后mitmweb监控charles的流量

image-20260925151548244

mitmweb的upstream模式

这个模式,这么理解。

charles在localhost:8888开启了代理。

那mitmweb可以在8080端口开个代理,然后上游设置为charles的localhost:8888.

然后程序或者系统,设置代理为mitmweb的8080端口。

image-20260925152415176

image-20260925152705889

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

image-20260925154544580

是:

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

image-20260925154820325

导出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

这样也是可以的。

posted @ 2026-09-25 15:58  三国梦回  阅读(67)  评论(4)    收藏  举报