你的电脑每天都在联网:看视频、刷网页、发消息、后台更新。
这些联网动作,本质上都是你的电脑在跟远处的服务器互相传递数据。
传递的数据,在网络上叫数据包,就像公路上跑的一辆辆车。
抓包,就是站在路边把这些车一辆辆记下来:什么时候经过的、多大、装的什么。
chensuiyi/pcap 是 MoonBit 语言的一个抓包模块,专门负责这件事。
它主要解决三个问题:
- 电脑上的软件都在跟谁通信
- 通信量有多大
- 通信发生在什么时候
抓包需要什么条件?
Windows 系统本身不能直接抓包,需要先装一个叫 Npcap 的驱动。
它是 Windows 的官方抓包驱动,相当于给系统装上了一个"数据包收费站",所有经过网卡的数据都要从它这里过。
装好 Npcap 之后,程序就能通过它拿到原始数据。
chensuiyi/pcap 模块做的事情,就是帮 MoonBit 程序跟 Npcap 对接。
它采用运行时动态加载的方式,程序启动后自己去系统里找 wpcap.dll 文件。
使用这个模块的人,只需要安装 Npcap 本体,不需要安装任何开发包。
如何下载安装?
MoonBit 是一门新的编程语言,语法风格类似 Rust 但更简洁,编译成 WebAssembly 后体积小、速度快,主要面向云原生场景。
语言文档:docs.moonbitlang.com
MoonBit 工具链在 Windows 上用 PowerShell 一条命令安装:
javascript
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser; irm https://cli.moonbitlang.com/install/powershell.ps1 | iex
安装完成后验证一下:
css
moon --version
能输出版本号就说明装好了。
然后新建一个项目,引入抓包模块:
bash
moon new my-sniffer
cd my-sniffer
moon add chensuiyi/pcap
一个完整示例
整个抓包流程只有四步:加载、查网卡、打开、收包。
先写一个查看网卡列表的小程序:
scss
fn main {
match @pcap.load() {
Err(msg) => {
println("加载失败: {msg}")
return
}
Ok(_) => ()
}
let devs = @pcap.devices()
for d in devs {
println("{d.name} ------ {d.description}")
}
}
运行它:
arduino
moon run
能看到本机所有网卡的名称和描述。
再进一步,打开第一个真实网卡,循环收包,把每个包的到达时间和大小打印出来:
scss
fn main {
match @pcap.load() {
Err(msg) => {
println("加载失败: {msg}")
return
}
Ok(_) => ()
}
let devs = @pcap.devices()
match @pcap.open(devs[0].name, 65535, true, 1000) {
Err(msg) => println("打开失败: {msg}")
Ok(pc) => {
while true {
match @pcap.next(pc) {
Some(pkt) =>
println("时间:{pkt.ts_sec}.{pkt.ts_usec} 长度:{pkt.len} 字节")
None => () // 这一秒没有数据,继续等
}
}
}
}
}
运行后,只要电脑上有网络活动,屏幕上就会不断打印新抓到的数据包信息。
每收到一个数据包,你能拿到这些信息:
| 信息 | 说明 |
|---|---|
| 时间戳 | 这个包是什么时候经过的 |
| 捕获长度 | 实际记录下来的数据大小 |
| 原始长度 | 这个包本来有多大 |
| 原始数据 | 包里的全部字节内容 |
能做到什么效果?
网络卡顿时,可以用它确认是否有软件在后台偷偷上传数据。
写一个小程序抓包,就能看到哪个软件、在什么时间、传了多少数据。
网络程序调试遇到问题时,可以用它确认数据是否真的发出、对方是否回应。
持续运行一段时间抓包,把数据存下来,还能分析出电脑的主要通信对象。
使用这个模块需要注意什么?
- 操作系统要求 Windows 10 或 11。
- 必须安装 Npcap,官网地址:npcap.com
- 部分系统需要管理员权限运行。
感谢阅读,我是前端之虎陈随易,公众号 陈随易,个人网站:https://chensuiyi.me。