Pular para o conteúdo
Bruno Fraga
AULÃO #025··18 min

Programação do Zero para Investigação Digital: De Variáveis a WHOIS Automatizado

Capítulos

15 seções
Investigação DigitalOSINTCibersegurançaTutoriaisHacking
Neste artigo

O que você vai aprender neste aulão

Programação para investigação digital não é sobre decorar comandos ou escolher a linguagem perfeita. É sobre entender fundamentos que transformam qualquer ideia em código funcional — e neste aulão de 155 minutos, eu demonstrei ao vivo como fazer exatamente isso.

Eu peguei Python, abri o Replit e fui do zero absoluto até criar um programa que consulta WHOIS de 100 domínios automaticamente, filtra o proprietário de cada um e processa tudo em loop. Sem slide bonito, sem teoria vazia. Código rodando na tela o tempo todo.

Depois de ler este artigo, você vai conseguir criar variáveis, organizar dados em listas e dicionários, escrever funções reutilizáveis, fazer loops que processam centenas de alvos e importar pacotes prontos do PyPI para dar superpoderes ao seu código. E o mais importante: vai entender por que cada conceito existe, não apenas como escrever a sintaxe.

Se você já tentou aprender a programar e travou — seja na escolha da linguagem, seja na incapacidade de criar algo além do que o professor mostrou — este aulão foi feito para resolver esse problema de uma vez.

Por que fundamentos importam mais que a linguagem de programação

A resposta direta: porque os fundamentos são universais. Variáveis, tipos de dados, listas, dicionários, funções e loops existem em Python, JavaScript, Go, Ruby e praticamente qualquer linguagem que você escolher.

Eu passei anos travado nessa pergunta. "É JavaScript? É C? É Python? É Ruby?" E enquanto eu ficava preso nessa decisão, não aprendia nada. Ou então fazia um curso inteiro de JavaScript e no final só sabia replicar o que o professor fez — não conseguia criar nada novo.

Isso mudou quando eu fiz um bootcamp de programação de 14 dias na Coreia do Sul. O banner nem falava qual linguagem seria. Era "bootcamp de coding para iniciantes" com uma proposta simples: publicar projetos em 14 dias. Paguei absurdamente caro e me matriculei.

E no primeiro dia, quando cheguei em casa, eu falei: "isso aqui mudou minha vida."

O método era diferente de qualquer curso que eu já tinha feito. Não começavam com "variável se cria assim, loop for é assim". Começavam com um problema e iam resolvendo do começo ao fim. Teve sim uma aula inicial de fundamentos, mas era resolvendo desafios o tempo todo.

Antes desse bootcamp, eu já tinha experiência com código. Tenho ferramenta publicada no Arsenal do Kali Linux. Criei o ipinfo, um shell script que viralizou lá em 2013, 2014 — o pessoal adorava para pegar informação de IP. Sempre criei scripts, automações, ferramentas. Mas nunca conseguia sentar e programar um sistema completo, com funções, reusabilidade, estrutura.

A diferença entre script e sistema está nos fundamentos. E são exatamente esses fundamentos que eu vou te passar aqui.

E Python, JavaScript, Go — qualquer linguagem que você escolher depois vai parecer familiar.

Variáveis e tipos de dados em Python para investigação

Uma variável é a habilidade de armazenar e reusar dados. Parece simples demais para ser importante. Não é.

Pensa numa lâmpada inteligente. Dentro dela existe uma variável que guarda a cor atual — "azul". Quando você abre o app e muda para vermelho, o que aconteceu? O programa alterou o valor dessa variável. De "azul" para "vermelho". E a lâmpada respondeu.

Em Python, criar uma variável é tão direto quanto pensar nela:

alvo = "Bruno Fraga"
idade = 20
lampada_ligada = True

Sem declaração de tipo, sem int, sem var. Você escreve como se estivesse falando. E esse é exatamente o motivo pelo qual eu recomendo Python para começar — a linguagem permite que você se expresse de forma livre. Se fosse Java, você teria que meter um int para declarar variável, estudar a sintaxe antes de pensar no problema. Python permite que você só escreva.

Sequence matter: por que a ordem do código importa

Todo código em Python é lido de cima para baixo. Se eu escrever:

a = 10
b = 20
a = 5
resultado = a + b

O resultado é 25, não 30. Porque quando o Python chegou na linha a = 5, o valor 10 deixou de existir. A última atribuição é a que vale.

Esse conceito — sequence matter, sequência importa — é fundamental para não se perder quando o código crescer. Tudo que você ler ou escrever segue essa regra: de cima para baixo, declaração por declaração.

Os três tipos de dados que você precisa agora

Variáveis armazenam dados. Mas que tipos de dados? Em Python, os três fundamentais são:

  • Números inteiros (int): idade = 20, ano = 2024
  • Números decimais (float): preco = 1000.50, dolar = 5.20
  • Strings (texto): nome = "Bruno Fraga" — sempre entre aspas
  • Booleans: lampada_ligada = True ou lampada_ligada = False

Um detalhe que pega muita gente: 10 é número, "10" é string. A diferença importa. Se você tentar somar "Bruno" com 10, Python vai reclamar — não dá para concatenar string com inteiro. Mas "Bruno" + " Fraga" funciona, porque o operador + entre strings junta os textos.

E CPF? Mesmo sendo composto de números, CPF é string. Porque pode ter traço, ponto, e não faz sentido fazer conta com CPF. É uma sequência de caracteres, não um valor matemático.

A função type() confirma o tipo de qualquer valor. type(nome) retorna str. type(idade) retorna int. Ferramenta útil quando você não sabe o que está recebendo de um módulo externo.

Operadores e como automatizar cálculos em investigações

Operadores possibilitam operações entre tipos de dados. Soma, subtração, multiplicação, divisão — funcionam com números exatamente como na matemática.

Mas o operador + entre strings faz concatenação: "Bruno" + " " + "Fraga" resulta em "Bruno Fraga". E se você tentar "Bruno" + 10, erro. Python não mistura tipos sem conversão explícita.

Onde isso é útil em investigação? Imagine que todo dia você precisa calcular o custo de uma operação em dólar. O dólar muda, o IOF muda. Com variáveis e operadores:

dolar = 5.20
valor_compra = 1000
iof = 0.06
total = (valor_compra * dolar) * (1 + iof)

Mudou o dólar? Altera uma linha. O cálculo inteiro se atualiza. Isso é o poder de trabalhar com variáveis — o código fica reutilizável sem reescrever nada.

Listas em Python: organizando alvos de investigação

Uma lista é um tipo de dado que guarda 5, 50 ou 5.000 itens dentro de uma única variável. Colchetes, vírgulas separando cada item. Pronto.

Imagine que você tem 30 alvos para investigar. Criar 30 variáveis separadas — alvo1, alvo2, alvo3 — é insano. Com lista:

alvos = ["Bruno", "Fernando", "Lucas", "Pedro", "Luiz"]

Uma variável. Todos os alvos organizados. E com acesso por índice, começando do zero.

Por que o índice começa do zero

Pensa numa régua. A régua começa no 0, depois 1 centímetro, 2, 3. O primeiro espaço é o zero. Lista é igual. alvos[0] é "Bruno". alvos[1] é "Fernando". alvos[2] é "Lucas".

Se você pedir alvos[2] achando que vai pegar "Fernando", vai receber "Lucas". Porque 0 é Bruno, 1 é Fernando, 2 é Lucas. A régua não começa no 1.

Métodos de lista que desbloqueiam investigação

Quando eu mostrei isso na aula, a galera ficou animada. Uma lista em Python vem com funções prontas:

  • alvos.append("Mike") — adiciona Mike no final da lista
  • alvos.remove("Bruno") — remove o Bruno (pelo valor, não pelo índice)
  • alvos.pop(0) — remove pelo índice e retorna o item
  • alvos.reverse() — inverte a ordem da lista

E tem o operador in para consultar se um valor existe:

print("Bruno" in alvos)   # True
print("Bruno X" in alvos)  # False

Com isso você já consegue: adicionar alvos, remover alvos, verificar se alguém está na lista, inverter ordem de prioridade. E Python tem dezenas de outros métodos prontos para listas.

Dicionários: estruturando dados complexos de alvos

Listas resolvem o problema de organizar dezenas ou centenas de itens. Mas e quando cada alvo tem nome, CPF e e-mail? Aí entra o dicionário — uma estrutura de chave e valor.

Literalmente como um dicionário de português: a palavra (chave) tem sua definição (valor). Em Python, usa-se chaves {}:

alvo = {
    "nome": "Bruno Fraga",
    "cpf": "123.456.789-00",
    "email": "bruno@brunofraga.com"
}

Para acessar um valor, usa-se a chave entre colchetes: alvo["email"] retorna "bruno@brunofraga.com". Sem precisar lembrar posição numérica — você pede pelo nome da informação.

Os métodos .keys() e .values() permitem pegar só as chaves ou só os valores separadamente. Útil quando você precisa listar todos os campos disponíveis de um alvo sem saber a estrutura completa.

Listas de dicionários: o banco de dados da investigação

A combinação mais poderosa para investigação é uma lista onde cada item é um dicionário:

alvos = [
    {"nome": "Bruno Fraga", "cpf": "123.456.789-00", "email": "bruno@brunofraga.com"},
    {"nome": "Pedro Silva", "cpf": "987.654.321-00", "email": "pedro@email.com"},
    {"nome": "Lucas Costa", "cpf": "555.666.777-88", "email": "lucas@email.com"}
]

Para pegar o nome do segundo alvo: alvos[1]["nome"] → "Pedro Silva". Primeiro seleciona o item pela posição, depois consulta a chave. Dois passos, zero complicação.

Com essa estrutura, você tem um banco de dados completo na memória. Pode ter 30, 300 ou 3.000 alvos, cada um com seus dados organizados por chave.

Funções reutilizáveis para automação de investigação

Funções são blocos de código que executam uma tarefa e podem ser reutilizados em qualquer lugar do programa. Se você entendeu f(x) = x² da escola, entendeu funções.

Quando o usuário faz login no sistema, o que aparece? "Olá, Bruno." Quando outro usuário faz login? "Olá, Pedro." O código é o mesmo — muda o nome. Isso é função: escreve uma vez, usa para todos.

def welcome(usuario):
    print(f"Olá, {usuario}")
    print("Hoje faz sol")
 
welcome("Bruno")   # Olá, Bruno / Hoje faz sol
welcome("Pedro")   # Olá, Pedro / Hoje faz sol

O def define a função. O nome é livre — welcome, verifica_vazamento, ataque_alvo, o que fizer sentido para você. Entre parênteses, o que ela recebe. Dentro do bloco (identado), o que ela faz.

Eu não sou engenheiro de software. Eu programo, mas não sou engenheiro de software. Talvez não tenha os termos corretos o tempo todo. Mas é assim que eu me viro — e compartilho com vocês como me viro.

Para investigação, funções são a base da automação. Uma função verifica_vazamento(email) que recebe um e-mail e verifica se tem vazamento pode ser chamada para cada alvo da sua lista, sem reescrever o código de verificação 30 vezes.

Escopo: o código dentro da função é isolado

Tudo que está dentro de uma função vive no bloco identado. Variáveis criadas ali dentro não saem para o código principal (a menos que você retorne elas). Pense como um compartimento: o que entra é o parâmetro, o que sai é o retorno. O resto fica dentro.

A identação em Python não é só estética — ela define o escopo. Se o código está com 4 espaços para dentro, ele pertence àquele bloco. Sem identação, está fora. Python usa espaço em branco como sintaxe, e isso confunde no início. Mas depois de acostumar, torna o código muito legível.

Loops: processando centenas de alvos automaticamente

Loop é a capacidade de interagir com cada item de uma lista separadamente. Não é mágico, não é complicado. É percorrer uma lista, item por item, executando o mesmo bloco de código para cada um.

Se você tem 3 alvos e quer o e-mail de cada um:

for alvo in alvos:
    print(alvo["email"])

O for pega o primeiro item da lista, chama de alvo, executa o bloco. Depois pega o segundo, chama de alvo, executa. Depois o terceiro. Até acabar a lista.

O nome alvo ali é livre. Podia ser item, pessoa, x. O que importa é que dentro do loop, essa variável representa o item atual da iteração — isoladamente. Não é a lista inteira. É só aquele dicionário, aquele valor, naquele momento.

Combinando loop com função: automação real

Aqui é onde tudo se conecta. Você tem uma lista de alvos, uma função que verifica vazamento, e um loop que junta os dois:

def verifica_vazamento(email):
    print(f"Iniciando verificação: {email}")
    print("Não tem vazamento")
 
for alvo in alvos:
    pega_email = alvo["email"]
    verifica_vazamento(pega_email)

O resultado: para cada alvo da lista, o programa pega o e-mail, envia para a função, que executa a verificação e passa para o próximo. Se fosse 1 milhão de alvos, o código seria exatamente o mesmo — muda só o tamanho da lista.

Na aula, quando mostrei isso funcionando ao vivo — "Iniciando verificação: bruno@brunofraga.com, não tem vazamento. Iniciando verificação: pedro@email.com, não tem vazamento" — deu para ver que o conceito clicou para a galera. É simples, mas é poderoso. Se você está em uma investigação com 500 domínios para verificar WHOIS, como descobrimos no Aulão #7 — Como Descobrir o Dono de um Site, um loop resolve em segundos o que levaria horas no braço.

Módulos e pacotes Python: importando habilidades prontas

Módulos são arquivos .py com funções que você pode importar no seu código. Pensa assim: main.py é o seu programa principal. vazamentos.py é outro arquivo com funções de verificação. No main.py, você importa:

import vazamentos
vazamentos.verificaGoogle("bruno@email.com")

Ou importa só o que precisa:

from vazamentos import verificaGoogle
verificaGoogle("bruno@email.com")

Ou dá um apelido:

import vazamentos as vmi
vmi.verificaGoogle("bruno@email.com")

As três formas funcionam. A escolha depende de quantas funções você precisa e de como quer organizar o código.

Mas o verdadeiro poder está nos módulos que outras pessoas já criaram. O PyPI tem mais de 614.000 pacotes prontos para instalar com pip install. Quer baixar vídeo do YouTube? Tem pacote. Quer fazer scraping? Tem pacote. Quer consultar WHOIS? Tem pacote. Se eu quero controlar a minha lâmpada inteligente agora, vai ter um pacote da empresa da luz que eu posso importar e usar as funções prontas.

Você não precisa reinventar a roda. Precisa saber que a roda existe, onde encontrar e como instalar. E PyPI é o lugar onde 614.000 rodas já estão prontas para uso.

Consulta WHOIS automatizada com Python na prática

Na demonstração ao vivo, instalei o pacote whois11 direto no Replit e fiz uma consulta WHOIS no terra.com.br. O resultado? "Terra Networks" como proprietário. Com 5 linhas de código.

import whois11
 
site = "terra.com.br"
resultado = whois11.whois(site)
print(resultado)

Mas a consulta de um site é trivial. A graça começa quando você combina com tudo que aprendeu antes — lista, loop, função:

import whois11
import re
 
alvos = ["tecnicasinvasao.com", "terra.com.br", "globo.com"]
 
for alvo in alvos:
    try:
        resultado = whois11.whois(alvo)
        dono = re.search(r"owner:\s*(.*)", str(resultado))
        if dono:
            print(f"O dono de {alvo} é {dono.group(1)}")
        else:
            print(f"Dono de {alvo} não encontrado")
    except:
        continue

Na aula, gerei uma lista de 100 sites com ajuda de IA e processei todos automaticamente. Cerca de 10 a 15 deram erro de encoding (acentuação no nome do proprietário), outros não retornaram dados completos. É normal. O try/except trata esses erros e pula para o próximo — não é a forma mais elegante, mas funciona para não travar o programa inteiro por causa de um domínio problemático.

Com essa base, dá para expandir: pegar o e-mail do proprietário e verificar vazamentos como ensinei no Aulão #9 — Investigar Vazamentos de Senhas. Pegar o CNPJ e consultar na Receita Federal. Cruzar dados entre domínios. A programação permite escalar o que você já sabe fazer manualmente, como as ferramentas de investigação digital que mostrei no Aulão #4.

Se você está começando agora na investigação digital e quer entender o caminho completo, recomendo assistir o Aulão #22 — Como Começar na Investigação Digital para ter a visão geral antes de mergulhar no código.

O módulo re: filtrando dados com expressões regulares

Para extrair o campo "owner" do resultado WHOIS, usei o módulo re — que já vem instalado no Python. Expressões regulares são padrões de busca dentro de textos. re.search(r"owner:\s*(.*)", texto) procura a palavra "owner:" seguida de qualquer coisa e captura o valor.

Não precisa dominar regex agora. Só saber que existe e que resolve problemas de filtragem de texto. Quando precisar, pesquise o padrão específico — a documentação do módulo re é a referência oficial.

Por onde continuar depois deste aulão

Programação se aprende resolvendo problemas, não assistindo aulas. Agora que você tem os fundamentos — variáveis, tipos, listas, dicionários, funções, loops e módulos — precisa de problemas para resolver.

O Aulão #17 — Desafios Práticos de Investigação Digital traz exatamente isso: exercícios reais para treinar OSINT. Combine esses desafios com Python e você vai evoluir rápido.

Para quem quer dar o próximo passo no ambiente técnico, o Aulão #15 — Linux para Iniciantes é o complemento natural. Linux e Python juntos são a fundação de qualquer investigador digital.

E se quiser usar IA para acelerar seu aprendizado de programação — como eu fiz ao vivo usando o assistente do Replit para gerar código auxiliar — o Aulão #6 — ChatGPT para Investigação Digital mostra como integrar IA no seu fluxo de trabalho.

As técnicas OSINT para investigar pessoas que mostrei no Aulão #5 ficam muito mais poderosas quando você consegue automatizá-las com programação. Um loop que percorre 500 perfis é infinitamente mais eficiente que fazer busca manual.

Nesta aula não cobrimos condicionais (if/else), que ficaram para um próximo aulão. Também não entrei em orientação a objetos para não complicar. Mas com o que você aprendeu aqui, já é possível criar ferramentas funcionais.

Ferramentas Utilizadas Neste Aulão

FerramentaFinalidadeLink
ReplitIDE online gratuita direto no browserReplit
PythonLinguagem de programação principal da aulaPython
PyPIRepositório com 614.000+ pacotes PythonPyPI
python-whoisPacote para consulta WHOIS de domíniospython-whois
VS CodeEditor de código alternativo ao ReplitVS Code
Módulo reExpressões regulares para filtragem de textoDocumentação re
Kali LinuxDistribuição Linux para segurança ofensivaKali Linux
pipGerenciador de pacotes Pythonpip

Perguntas Frequentes

Qual a melhor linguagem de programação para investigação digital?

Python é a mais usada em investigação digital e OSINT pela quantidade de bibliotecas disponíveis e pela sintaxe simples. Mas o mais importante é aprender os fundamentos — variáveis, listas, funções, loops. Esses conceitos são os mesmos em qualquer linguagem. Depois que você entende a lógica, trocar de linguagem é questão de aprender a sintaxe nova.

Preciso saber programar para trabalhar com OSINT?

Não é obrigatório para começar. Existem ferramentas prontas que resolvem a maioria dos casos. Mas programação separa o investigador que depende de ferramentas do que cria suas próprias soluções. Quando você precisa verificar 500 domínios ou cruzar dados de 1.000 e-mails, não existe ferramenta pronta que substitua um script Python customizado.

O Replit é seguro para usar em investigações?

O Replit é uma plataforma educacional na nuvem. Para aprender e testar código, é excelente e gratuito. Para investigações reais com dados sensíveis, recomendo configurar Python no seu computador local com VS Code. Dados de investigação não devem ficar em servidores de terceiros sem necessidade.

Quanto tempo leva para aprender Python do zero?

Os fundamentos que cobri neste aulão — variáveis, tipos, listas, dicionários, funções, loops, módulos — são o suficiente para criar ferramentas funcionais. Isso se aprende em dias, não meses. O que leva tempo é a prática: resolver problemas reais, lidar com erros, ler documentação de pacotes. Programação é como investigação — se aprende fazendo.

Como instalar pacotes Python no meu computador?

Instale Python pelo python.org, abra o terminal e use pip install nome-do-pacote. Por exemplo: pip install python-whois. O pip baixa o pacote do PyPI e instala automaticamente. No Replit, a instalação é automática pelo gerenciador de pacotes da plataforma.

O que é o try/except que apareceu na demonstração?

É uma forma de tratar erros em Python. O código dentro do try é executado normalmente. Se der erro, ao invés de travar o programa, o Python pula para o except e executa o que está ali — no nosso caso, continue para ir para o próximo item do loop. Não é a forma mais correta de tratar erros (o ideal é tratar erros específicos), mas funciona para prototipar rápido.

Posso usar IA para me ajudar a programar?

Sim, e eu usei durante a aula. O assistente do Replit gerou código auxiliar para expressões regulares e para criar listas de teste. IA é uma ferramenta poderosa para acelerar o desenvolvimento, mas você precisa entender os fundamentos para saber se o código gerado faz sentido. IA gera código, mas quem valida e integra é você.

Por que o índice da lista começa do zero e não do um?

É uma convenção herdada de como a memória do computador funciona. O primeiro elemento está no início (deslocamento zero), o segundo está uma posição à frente (deslocamento 1). Na prática, você se acostuma rápido. Pensa na régua: o primeiro centímetro é a marca 0, não a marca 1.

Referências e Recursos

Conteudo Relacionado