WirePenguin é um sniffer de pacotes de rede desenvolvido em Rust com interface gráfica no terminal (TUI). O projeto foi criado como trabalho acadêmico por Matheus Tregnago e Ricardo Bregalda.
- Captura em tempo real de pacotes de rede
- Interface gráfica no terminal intuitiva e interativa
- Análise detalhada das camadas de enlace, rede e transporte
- Visualização de cabeçalhos de protocolos
- Gráficos dinâmicos mostrando estatísticas de captura
- Múltiplas interfaces de rede suportadas
- Ethernet
- IPv4
- IPv6
- ARP
- ICMP
- ICMPv6
- TCP
- UDP
- Linguagem: Rust
- Bibliotecas principais:
- Rust 1.70+ instalado
- Cargo (gerenciador de pacotes do Rust)
- Permissões de administrador/root (necessário para captura de pacotes)
# Clone o repositório
git clone https://github.com/matregnago/wirepenguin
cd wirepenguin
# Compile o projeto
cargo build --releaseExecute o programa com privilégios de administrador:
sudo ./target/release/wirepenguin| Tecla | Ação |
|---|---|
q |
Sair do programa |
j ou ↓ |
Navegar para baixo na lista |
k ou ↑ |
Navegar para cima na lista |
i |
Alternar interface de rede |
p |
Pausar/Continuar captura |
Enter |
Ver detalhes do pacote selecionado |
O WirePenguin apresenta uma interface dividida em seções:
- Gráfico de Pacotes: Exibe estatísticas dos protocolos capturados
- Lista de Interfaces: Mostra as interfaces de rede disponíveis
- Tabela de Pacotes: Lista todos os pacotes capturados com informações básicas
- Rodapé: Exibe os atalhos de teclado disponíveis
O software utiliza um sistema baseado em eventos com threads separadas para:
- Thread Principal: Gerencia a interface e processa eventos
- Thread de Captura: Realiza o sniffing de pacotes
- Thread de Renderização: Controla a atualização da tela (22 FPS)
- Thread de Input: Captura entradas do teclado
Utiliza canais MPSC (Multi-producer, single-consumer) para comunicação entre threads, com três tipos de eventos:
Render: Atualização da interfacePacketCaptured: Novo pacote capturadoInput: Entrada do usuário
wirepenguin/
├── src/
│ ├── main.rs # Ponto de entrada
│ ├── app.rs # Lógica principal da aplicação
│ ├── event.rs # Definição de eventos
│ ├── packet_data.rs # Estruturas de dados dos pacotes
│ ├── sniffer.rs # Lógica de captura de pacotes
│ └── widgets/ # Componentes da interface
│ ├── charts.rs # Gráfico de estatísticas
│ ├── footer.rs # Rodapé com atalhos
│ ├── interfaces.rs # Lista de interfaces
│ ├── packet_table.rs # Tabela de pacotes
│ └── popup.rs # Detalhes do pacote
├── Cargo.toml # Configuração do projeto
└── README.md # Este arquivo
