Go Parse! Escrevendo um Parser de Cache ARP para Dominar Golang

Go Parse! Escrevendo um Parser de Cache ARP para Dominar Golang

Aprenda a analisar arquivos de texto em Go construindo um parser de cache ARP. Este artigo aborda o uso de maps, o pacote strings e a criação de pacotes personalizados para extrair informações relevantes de diferentes sistemas operacionais.

MundiX News·13 de abril de 2026·10 min de leitura·👁 2 views

Trabalhar com arquivos de texto é uma das tarefas mais comuns na programação. Neste artigo, vamos explorar o parsing de texto em Go, usando como exemplo o cache ARP. Utilizaremos esses dados para estabelecer a correspondência entre endereços MAC e IP na rede local.

No caso mais simples, o arquivo contém um único valor (token) por linha – como geralmente são construídas as wordlists para brute-force ou fuzzing. Em outros casos, o arquivo tem uma estrutura regular definida, como várias variações de CSV, adequadas para dados tabulares, telemetria e conjuntos de dados semelhantes.

O pior cenário é quando o arquivo de entrada é originalmente destinado à leitura humana e contém formatação adicional – recuos, alinhamento com espaços, subtítulos, pseudográficos. Esses arquivos não podem ser lidos diretamente "como estão" – é necessário encontrar e usar apenas fragmentos específicos. Neste artigo, abordaremos as principais técnicas para obter as informações que nos interessam de um arquivo de texto, ou seja, seu parsing.

Como exemplo prático, usaremos algo um pouco abstrato, mas presente em qualquer computador: o cache ARP. Utilizaremos os dados desse cache para estabelecer a correspondência entre endereços IP e MAC de dispositivos na rede local.

Como o acesso ao conteúdo do cache é um pouco diferente em diferentes sistemas operacionais, também abordaremos o trabalho com código dependente da plataforma: no Linux, podemos ler o conteúdo de /proc/net/arp, enquanto no Windows, podemos executar arp -a. Finalmente, transformaremos o código do parser que escrevemos em um pacote adequado para uso em outros projetos.

Info: O cache ARP é preenchido automaticamente pelo sistema operacional (geralmente ao tentar estabelecer uma conexão com um nó na rede local). O acesso a essas informações não requer elevação de privilégios, ao contrário de abrir um socket e enviar um pacote ARP discovery manualmente (e para fazer isso em um host Windows, geralmente é necessário instalar previamente o Npcap/WinPcap).

Começaremos, como sempre, criando um novo pacote:

bash
mkdir readarp && cd $_
go mod init readarptouch main.go
touch arp.go

Como parte do código dependerá da plataforma de destino, criaremos dois arquivos imediatamente. Em main.go estará nosso ponto de entrada, e em arp.go – o código para trabalhar com o cache ARP.

No futuro, pretendemos obter o endereço MAC correspondente a um determinado IP. Nesse cenário, não é aconselhável ler todo o conteúdo do cache a cada solicitação. É muito mais eficiente fazer isso uma vez e salvar imediatamente as informações que nos interessam para acessos subsequentes.

Para armazenar os dados processados, poderíamos criar uma estrutura com dois campos – IP e MAC – e salvar um conjunto de suas instâncias em um slice, no qual procuraríamos o necessário. Mas é melhor aplicar outra abordagem e armazenar os dados como uma coleção de pares chave-valor, onde os endereços IP serão chaves únicas, para as quais usaremos a estrutura de dados map.

Embora ainda não estejamos fazendo nada disso, a decisão sobre a escolha da estrutura de dados é tomada agora para não ter que reescrever muito código depois.

Conteúdo do arquivo arp.go:

go
package main

func retrieveArpTable() map[string]string {
 result := make(map[string]string)
 // TODO not implemented
 return result
}

Aqui declaramos uma função que processa os dados do cache e retorna um dicionário com os valores que precisamos.

E o conteúdo do arquivo main.go:

go
package main

import "fmt"

func main() {
 arpResuls := retrieveArpTable()
 fmt.Print(arpResuls)
}

Aqui simplesmente exibimos os dados do dicionário formado pela função retrieveArpTable() na tela. Por enquanto, não é exatamente o que queremos fazer no final: é apenas uma função stub que nos dá a oportunidade de ver os resultados intermediários da execução. Mais tarde, nos livraremos dela completamente.

Observe: embora os arquivos sejam diferentes, eles pertencem ao mesmo pacote – neste caso, main – e no arquivo main.go, sem nenhuma ação adicional, chamamos a função definida em arp.go.

Diferença entre estrutura e estrutura de dados

Talvez, neste ponto, alguma confusão tenha surgido em sua cabeça. Anteriormente, falamos sobre uma estrutura como um tipo de dados que declaramos com a palavra-chave struct e, em seguida, trabalhamos com seus campos. Mas também usamos uma expressão como "estrutura de dados", falando sobre map ou slice.

De fato, tanto map quanto slice são internamente uma estrutura com os campos e métodos correspondentes. Mas o ponto aqui é outro. Em ciência da computação, "estrutura de dados" é um conceito fundamental que descreve uma maneira específica de alocar e organizar uma coleção de dados na memória.

Estruturas de dados são coisas como listas, pilhas, filas, árvores, tabelas hash e assim por diante. E elas podem ser implementadas usando estruturas (que são struct), ou classes, ou algo mais. Por sua vez, o tipo (type MySet struct{}), que é a implementação de uma ou outra estrutura de dados, também costumamos chamar simplesmente de estrutura de dados, ou seja, há um certo desfoque de limites entre os conceitos.

Dicionários, ou mapas (map)

A função retrieveArpTable() retorna um dicionário (palavra-chave map) com chaves do tipo string (o tipo de chave é especificado entre colchetes) e valores do tipo string (o tipo de valor é especificado após os colchetes).

Info: Map é uma coleção de pares chave-valor, onde as chaves são únicas e usadas para extrair valores, semelhante a como um índice é usado em arrays ou slices. Em diferentes literaturas sobre diferentes linguagens de programação, existem diferentes nomes para essa estrutura: "array associativo", "dicionário", "tabela hash", tradução literal de "mapa" e até mesmo um calque do inglês "mapa". Em fontes sobre Go, os dois últimos são geralmente usados, no entanto, eu prefiro "dicionário". Um dicionário é bom porque fornece acesso a um valor por chave em tempo constante O(1), independentemente do tamanho da coleção – ao contrário da pesquisa em um array ou slice.

Assim como os slices, os dicionários são criados com o comando make. O segundo argumento pode especificar a capacidade da coleção, se for conhecida de antemão. Se a capacidade for excedida, ela será aumentada automaticamente – aqui tudo é igual ao caso dos slices.

O acesso a um elemento da coleção ocorre por chave, que é passada entre colchetes, assim como o índice de um array ou slice: value := result[key]. Se a chave não for encontrada, o valor padrão para este tipo (zero value) será retornado.

Talvez, aqui você tenha imediatamente uma pergunta: e se zero value for um valor legítimo para um elemento de nossa coleção? Como distinguir duas situações: a coleção tem a chave desejada e um valor 0 (ou uma string vazia) está associado a ela, ou a coleção não tem essa chave e recebemos 0 (ou uma string vazia) como o valor padrão para o tipo int (ou string)?

Na verdade, dois valores são retornados aqui: value, ok := result[key], e é o segundo que indica se a chave foi encontrada. Se precisarmos apenas verificar a existência de uma chave, o primeiro valor pode ser descartado completamente: _, ok := result[key].

A gravação de um valor ocorre de forma semelhante: result[key] = value. Nesse caso, o valor será adicionado à coleção se essa chave ainda não estiver nela ou substituído se essa chave já existir.

A função delete() é usada para excluir uma chave. Ao contrário de append(), com a qual nos familiarizamos anteriormente, delete() altera a coleção existente e não retorna uma nova. Se a chave a ser excluída já estiver ausente na coleção, delete() será concluído sem erros.

Info: Exemplos de trabalho com map

Implementando conjuntos

Em algumas linguagens de programação, você pode ter visto outra coleção de dados, como set (conjunto). Um conjunto é semelhante a um map no sentido de que também é um conjunto de chaves únicas e fornece complexidade de acesso constante O(1). A diferença é que um conjunto contém apenas chaves, sem valores.

Se você precisar de tal estrutura de dados em Go, a implementação idiomática é um map com chaves do tipo necessário e valores do tipo "estrutura vazia" – struct{}{}. Por que exatamente uma estrutura vazia? É simples: em Go, seu tamanho é exatamente zero bytes.

go
// Criando um set de strings
mySet := make(map[string]struct{}{})

// Adicionando um elemento
mySet["newElement"] = struct{}{}

// Removendo um elemento
delete(mySet, "spareElement")

// Verificando a presença de um elemento
_, ok := mySet["checkElement"]
if ok {
 // Encontrado!
}

Pacote strings

Agora vamos passar para o parsing de dados de texto. O pacote strings da biblioteca padrão do Go nos ajudará com isso (veja, quanto já fizemos e ainda estamos usando os recursos da biblioteca padrão!). Como você já deve ter adivinhado pelo nome, este pacote combina ferramentas para trabalhar com strings.

[Conteúdo adicional não traduzido devido a restrições de acesso]

🛡️⚡

Pare de pesquisar. Comece a hackear.

O MundiX é seu copiloto de pentest com IA: comandos exatos, análise de outputs e próximo passo na kill chain — em segundos.

Testar grátis por 7 dias →

Sem cartão para começar · Planos a partir de R$49/mês

📤 Compartilhar & Baixar

🧰 Ferramentas recomendadas

Divulgação: alguns links são patrocinados. Podemos receber comissão se você comprar — sem custo extra para você. Só indicamos o que faz sentido para a comunidade.

Aprendendo Kali Linux: Teste de segurança, pentest e hacking ético

Aprendendo Kali Linux: Teste de segurança, pentest e hacking ético

Com centenas de ferramentas pré-instaladas, a distribuição Kali Linux facilita o trabalho de os profissionais de segurança começarem a fazer testes de segurança rapidamente. No entanto, com mais de 600 ferramentas em seu arsenal, o Kali Linux também pode ser desafiador. A nova edição deste prático livro abrange as atualizações nas ferramentas e inclui uma melhor abordagem da análise forense e da engenharia reversa. Ric Messier, autor, não fica apenas no teste de segurança, mas também faz uma abordagem sobre a execução de análise forense, incluindo a análise em disco e na memória, assim como alguma análise básica de malware. • Explore as diversas ferramentas disponíveis no Kali Linux • Entenda o valor do teste de segurança e examine os tipos de teste disponíveis • Aprenda os aspectos básicos do pentest em todo o ciclo de vida do ataque • Instale o Kali Linux em vários sistemas, tanto físicos quanto virtuais • Descubra como usar diferentes ferramentas destinadas à segurança • Estruture um teste de segurança baseado nas ferramentas do Kali Linux • Estenda as ferramentas do Kali para criar técnicas de ataque avançadas • Use o Kali Linux para ajudar a criar relatórios quando o teste terminar “A abordagem concisa, clara e baseada na experiência adotada por Ric Messier para a introdução do Kali Linux e dos testes de cibersegurança é incomparável. Este livro é uma leitura excelente e acessível para iniciantes e um recurso valioso para qualquer pessoa.” —Alexander Arlt, Consultor sênior de segurança, Google

Ver na Amazon
Gshield 2 em 1 Hub Extensor Conector USB-C + USB-A e Adaptador de Rede Ethernet LAN RJ45 com 3 Entradas USB 3.0 até 5 Gbps em Liga de Alumínio para Computador e Notebook, Cinza

Gshield 2 em 1 Hub Extensor Conector USB-C + USB-A e Adaptador de Rede Ethernet LAN RJ45 com 3 Entradas USB 3.0 até 5 Gbps em Liga de Alumínio para Computador e Notebook, Cinza

Compatível com portas USB-C e USB-A, ideal para ampliar a conectividade de dispositivos como MacBook Pro e outros com portas USB-C. Inclui um adaptador USB-A extra, proporcionando uma conexão Ethernet estável e veloz de até 1 Gbps, perfeita para filmes, jogos online e videoconferências. Oferece três portas USB 3.0 com velocidades de transferência de até 5 Gbps, permitindo conectar mouse, teclado, discos rígidos e outros periféricos. Fabricado em alumínio durável, garantindo longa vida útil e resistência ao uso diário. Design compacto e leve, ideal para viagens de negócios e uso diário, facilitando o transporte e armazenamento. Funciona com Windows 10/8.1/8, Mac OS e Chrome OS, oferecendo versatilidade incomparável para diversas necessidades de conectividade. Assegura uma conectividade estável e rápida, perfeita para tarefas exigentes como transferência de dados, streaming e mais.

Ver na Amazon
Hacking APIs: Breaking Web Application Programming Interfaces

Hacking APIs: Breaking Web Application Programming Interfaces

Hacking APIs is a crash course on web API security testing that will prepare you to penetration-test APIs, reap high rewards on bug bounty programs, and make your own APIs more secure. You'll learn how REST and GraphQL APIs work in the wild and set up a streamlined API testing lab with Burp Suite and Postman. Then you'll master tools useful for reconnaissance, endpoint analysis, and fuzzing, such as Kiterunner and OWASP Amass. Next, you'll learn to perform common attacks, like those targeting an API's authentication mechanisms and the injection vulnerabilities commonly found in web applications. You'll also learn techniques for bypassing protections against these attacks. In the book's nine guided labs, which target intentionally vulnerable APIs, you'll practice: Enumerating APIs users and endpoints using fuzzing techniques Using Postman to discover an excessive data exposure vulnerability Performing a JSON Web Token attack against an API authentication process Combining multiple API attack techniques to perform a NoSQL injection Attacking a GraphQL API to uncover a broken object level authorization vulnerability

Ver oferta
Gray Hat Hacking: The Ethical Hacker's Handbook, Sixth Edition

Gray Hat Hacking: The Ethical Hacker's Handbook, Sixth Edition

Up-to-date strategies for thwarting the latest, most insidious network attacks This fully updated, industry-standard security resource shows, step by step, how to fortify computer networks by learning and applying effective ethical hacking techniques. Based on curricula developed by the authors at major security conferences and colleges, the book features actionable planning and analysis methods as well as practical steps for identifying and combating both targeted and opportunistic attacks. Gray Hat Hacking: The Ethical Hacker's Handbook, Sixth Edition clearly explains the enemy's devious weapons, skills, and tactics and offers field-tested remedies, case studies, and testing labs. You will get complete coverage of Internet of Things, mobile, and Cloud security along with penetration testing, malware analysis, and reverse engineering techniques. State-of-the-art malware, ransomware, and system exploits are thoroughly explained. Fully revised content includes 7 new chapters covering the latest threats Includes proof-of-concept code stored on the GitHub repository Authors train attendees at major security conferences, including RSA, Black Hat, Defcon, and B-Sides

Ver na Amazon
Bloqueador USB de privacidade de porta USB para PC, notebook, bloco de laptop,

Bloqueador USB de privacidade de porta USB para PC, notebook, bloco de laptop,

Proteção de privacidade aprimorada: protege o link de transmissão de dados para evitar roubo de informações, fornecendo proteção de segurança robusta que protege a privacidade do usuário durante transferências de arquivos e garante uma conexão segura para interações de dispositivos sem preocupações em vários ambientes Uso a longo prazo: a camada protetora resistente ao desgaste, combinada com um corpo de metal resistente, oferece gerenciamento de calor confiável e qualidade duradoura durante o uso diário Entrega eficiente de energia: a tecnologia de chip inteligente garante a identificação automática dos requisitos de energia, fornecendo carregamento eficiente alinhando-se com vários protocolos de carregamento rápido para maior conveniência Proteção contra sobrecarga: evitando riscos de sobrecarga, este bloqueador de dados USB protege a vida útil da bateria e garante um desempenho estável, mantendo um fluxo estável de energia para melhorar a longevidade do dispositivo de forma eficaz Prático de transportar: com atenção à portabilidade, este bloqueador de dados USB oferece um design compacto que é leve e fácil de transportar, melhorando a conveniência do usuário e operação eficiente

Ver na Amazon

📩 Newsletter MundiX

Receba novidades de cibersegurança + um checklist de pentest grátis. Sem spam.

Ao assinar você concorda em receber e-mails. Cancele quando quiser.