前端使用 flutter 做 webui ,后端使用 C++ 和 pcapplusplus 来实现抓包,通过 socket 通信。
- 获取网卡信息。
- 开启一个子线程,主线程接受进一步消息,选择对应的网卡开始抓包。
- 主线程根据进一步的消息决定下一步操作。
- Ethernet
- IPv4
- IPv6
- Arp
- ICMP
- TCP
- UDP
- HTTP/HTTPS
- SSH
- FTP/SFTP
- SCP
- DHCP
- TELNET
- ip
- port
- protocol
- 仅支持 and 语法,比如
ip=123 and port=22
- 过滤过程是在抓包时过滤还是抓所有的包到最后过滤呢? 最后再过滤,抓全部的包,最后根据需求展示,如果数据量遭不住再换方法。
这个好做,每一个 TCP 数据包都对 IP 和 Port 进行一次判断,并且注意一下 FIN 等标志位。
具体的处理可能需要开一个额外的线程,主线程、抓包线程都不适合大量操作,防止影响处理效率。
分为两个界面,一个为选择界面,另一个为抓包展示界面
- IP 和 Port 输入框和一个链接按钮。
- 网卡选择列表和一个确认按钮 (网卡选择列表是上一步链接之后后端返回的)
- 类似 Wireshark 那样,一个主列表框图,第一行是输入框,用来输入过滤条件。 下面是一个可拖动的列表,里面展示数据包的信息。
- 20231015:
- 做好了基础结构,通信 socket 和 DataPack 也封装了一下
- 明天开始着手写 onPacketArrives 这个函数,这个才是重点,需要确定 数据报协议栈 和传输格式问题。
- 20231016:
- sniffer 用各层的 LayerInfo 拼接成一个 json 数组发送给前端, onPacketArrives 和 formatLayerInfos 已经完成了。
- flutter 前端结构基本确定了,和 sniffer 通过 socket 通信。
- 20231017:
- 用 LayerInfo 传递包数据不达可靠,前端没得展示,现在换成一个 Packet 提取一系列关键信息,其他的都放到 details 里让前端解决,用 formatPacketInfos 替换了 formatLayerInfos 。
- dart4web 不支持 dart:io 用不了 socket, 只能用 websocket 来写
- 用 vcpkg 装 uwebsockets 全是依赖问题,微软出品确实不可靠。
- 20231018:
- 换成 conan 十分钟解决了依赖问题,sniffer 成功换成了 websocket 通信。
- flutter 三个界面也基本设置完了,但是性能很差,一开始抓包界面根本动不了。
- 用 ListView.build 替换了 TableView 提高了性能,但是不好看了。
- 20231019:
- 完成了 sniffer 和前端之间的通信,通信数据格式什么的基本都确定了,数据传输也正常,前端性能也看的过去。
- 现在还需要完成:筛选功能、包原始数据的 hex 和文本对照(可选)、TCP 流(可选)。