O que é o WhatsApp Forense
O WhatsApp Forense é uma extensão para Google Chrome que realiza a captura forense de conversas do WhatsApp Web, gerando um pacote de evidências digitais com cadeia de custódia criptográfica, adequado para juntada em processos judiciais.
O sistema foi desenvolvido com foco nas necessidades práticas do cotidiano forense brasileiro, para uso por profissionais jurídicos e periciais.
Base Legal e Normativa
O sistema opera em conformidade com: ISO/IEC 27037:2012 — preservação de evidências digitais; STJ — AgRg no HC 1.014.212-ES — mensagens sem hash criptográfico podem ser consideradas inadmissíveis; Marco Civil da Internet (Lei 12.965/2014) — rastreabilidade e integridade de dados; Resolução CNJ nº 363/2021 — uso de tecnologia em atos judiciais.
Público-alvo
- Oficiais de Justiça e servidores do Poder Judiciário
- Advogados que precisam juntar provas digitais em processos
- Delegados e investigadores de polícia civil
- Peritos judiciais em informática forense
- Departamentos jurídicos corporativos
Capacidades do Sistema
O WhatsApp Forense combina múltiplas camadas de proteção criptográfica para produzir evidências digitalmente irrefutáveis.
Hash SHA-256 por Mensagem
Cada mensagem recebe um hash SHA-256 individual calculado sobre conteúdo, direção, remetente e timestamp. Qualquer alteração produz hash diferente, tornando adulteração matematicamente detectável.
Blockchain OpenTimestamps
O hash SHA-256 do pacote JSON é ancorado na rede Bitcoin via OpenTimestamps, criando prova matemática de existência do documento na data e hora do bloco minerado.
Âncora Temporal NTP Dual
Consulta dois fusos simultâneos no timeapi.io (UTC e UTC-3). Validação cruzada automática confirma diferença de exatamente 3 horas, provando autenticidade de ambas as respostas.
Screenshots Encadeados
Percorre a conversa capturando screenshots progressivos com overlay de hash. Cada imagem referencia o hash da anterior — a cadeia é impossível de fabricar ou reordenar.
Captura do DOM (HTML Bruto)
Extrai o código-fonte HTML da área de conversa com hash SHA-256. Compara hash t=0 (antes do processamento) com hash final — prova que o DOM não foi editado durante a captura.
Log Fotográfico de Sessão
Captura a tela completa do Chrome a cada 2 segundos, incluindo a barra de endereço (web.whatsapp.com). Prova que a operação ocorreu no ambiente real — headless browsers não incluem a barra de endereço.
JID Verificado via data-id
Extrai o número do interlocutor do atributo data-id das mensagens no DOM — gerado pelo servidor do WhatsApp, independente do nome de contato salvo na agenda.
UUID de Sessão Universal
Gera um UUID único que aparece em todos os artefatos (JSON, HTML, log fotográfico, NTP). Vinculação idêntica em contextos de execução separados é impossível de coordenar retroativamente.
Guard de Conversa
Verifica antes de cada screenshot se a conversa do lote de mensagens corresponde à conversa visível no header do DOM. Screenshots de outras conversas são descartados automaticamente.
Pacote de Evidências
Cada operação de registro gera um conjunto de arquivos que compõem o pacote forense. Todos devem ser preservados juntos para verificação completa.
| Arquivo | Conteúdo e Finalidade |
|---|---|
| *.json | Pacote principal de evidências. Contém mensagens com hashes, metadados NTP, integridade DOM, session log (metadados), UUID de sessão e cadeia de custódia completa. É este arquivo que é registrado no blockchain. |
| *.ots | Prova de timestamp OpenTimestamps. Contém o hash SHA-256 do JSON ancorado na rede Bitcoin. Necessário para verificação em opentimestamps.org. |
| *.html | Relatório de cadeia de custódia em HTML. Inclui mensagens renderizadas, prints progressivos inline, dados NTP, DOM capturado e instruções de verificação. |
| *_DOM_CAPTURA.html | Código-fonte bruto da área de conversa no momento da captura. Evidência do estado real da interface do WhatsApp Web. |
| *_print_NNNN.jpg | Screenshots progressivos individuais com overlay de hash SHA-256 encadeado. Necessários para verificar a cadeia de prints referenciada no JSON. |
| *_manifesto.json | Manifesto do sistema de screenshots. Lista todos os prints com hashes, encadeamento (previousHash) e as mensagens do lote que disparou cada captura. |
| wf_console_*.txt | Log completo do console com SHA-256. Registra toda a operação em sequência temporal para auditoria independente. |
.json e .ots não são aceitos pelo sistema e-Proc. Estes arquivos devem ser mantidos à disposição do Juízo e das partes pelo prazo de 30 (trinta) dias a contar da juntada do HTML no processo, podendo ser solicitados para verificação de autenticidade.sessionLog.imageData e progressiveScreenshots.imageData) são removidas do JSON antes do cálculo do hash SHA-256 e do registro OTS. O JSON lean (~100 KB) é o arquivo verificável. Os prints são salvos como arquivos .jpg separados.Como Utilizar
Instalação
- Descompacte o arquivo
.zipda extensão em uma pasta permanente no computador - Abra o Google Chrome e acesse
chrome://extensions - Ative o Modo do desenvolvedor (botão no canto superior direito)
- Clique em Carregar sem compactação e selecione a pasta descompactada
- A extensão aparecerá na barra do Chrome com o ícone de cadeado verde
captureVisibleTab funcione sem necessidade de clicar no ícone antes de cada captura. A extensão só realiza capturas quando a aba ativa é web.whatsapp.com.Ativação da Licença
- Abra o WhatsApp Web no Chrome (
web.whatsapp.com) - Clique no ícone da extensão na barra do Chrome
- Insira a chave de licença no formato
XXXX-XXXX-XXXX-XXXX - Clique em Ativar Licença
- A gravação inicia automaticamente após a ativação
Pipeline Completo ao Clicar em REGISTRAR CONVERSA
O botão ✅ REGISTRAR CONVERSA executa automaticamente o seguinte pipeline:
Como Verificar a Integridade
Verificação do Registro Blockchain
- Acesse opentimestamps.org
- Clique em STAMP & VERIFY
- Arraste o arquivo
*.otspara a área indicada - Arraste o arquivo
*.jsoncorrespondente - O sistema verificará diretamente na rede Bitcoin, sem intermediários
Quando confirmado, o site exibirá a data e hora do bloco Bitcoin — esta é a âncora temporal irrefutável.
Verificação Local do Hash do JSON
| Sistema | Comando |
|---|---|
| Windows (PowerShell) | Get-FileHash -Algorithm SHA256 "arquivo.json" |
| Windows (CMD) | certutil -hashfile arquivo.json SHA256 |
| Linux / macOS | sha256sum arquivo.json |
| Online | emn178.github.io/online-tools/sha256_checksum.html |
Verificação da Cadeia de Screenshots
- Recalcule o SHA-256 de cada arquivo
_print_NNNN.jpg - Compare com o campo
screenshotHashdo print correspondente no manifesto - Verifique se
previousScreenshotHashdo print N+1 corresponde aoscreenshotHashdo print N
Limitações Impostas pelo WhatsApp
As limitações abaixo não são deficiências do sistema — são restrições da plataforma WhatsApp Web que afetam qualquer sistema de captura forense da plataforma.
Sistema @lid — Identificação Indireta
Desde 2024, o WhatsApp adotou o sistema Layer ID (@lid) para identificação de contas. O atributo data-id das mensagens passa a conter um identificador interno, não o número de telefone real.
| Tipo de conta | Identificação disponível |
|---|---|
| Contatos pessoais (@c.us) | Número de telefone completo — verificado diretamente no DOM |
| Contas comerciais / recentes (@lid) | Identificador interno (LID) — número não disponível no DOM |
| Grupos (@g.us) | ID do grupo — membros identificados pelos seus JIDs individuais |
Criptografia de Ponta a Ponta
O WhatsApp utiliza criptografia de ponta a ponta. O sistema captura as mensagens já descriptografadas e renderizadas no navegador — único ponto onde o conteúdo está acessível. Não é possível capturar mensagens que nunca foram recebidas no dispositivo em uso.
Mensagens Apagadas
O sistema preserva mensagens apagadas apenas se a gravação estava ativa no momento exato em que a mensagem era visível. Mensagens apagadas antes do início da gravação não são recuperáveis.
Histórico Limitado ao Dispositivo
O WhatsApp Web exibe apenas o histórico disponível no smartphone vinculado. Mensagens excluídas do dispositivo ou não sincronizadas não estarão disponíveis para captura.
Rate Limit de Capturas de Tela
O Chrome impõe limite de 2 capturas por segundo por extensão. O sistema gerencia automaticamente com espaçamento mínimo de 600ms e retry automático para erros transitórios.
Atualizações da Interface do WhatsApp
Mudanças nos seletores CSS ou estrutura do DOM pelo WhatsApp podem afetar temporariamente a identificação de elementos. O sistema possui múltiplos seletores alternativos (fallbacks) para minimizar este impacto.
Como Refutar Alegações de Manipulação
Esta seção destina-se a peritos, advogados e magistrados que precisem verificar a autenticidade do pacote ou responder a questionamentos técnicos da parte contrária.
"O DOM foi editado antes do cálculo do hash"
O hash SHA-256 do código-fonte da página é calculado em t=0, no primeiro milissegundo da sessão, antes de qualquer processamento. O campo domIntegrity.hashBefore registra este hash. Para que a alegação fosse verdadeira, a edição teria ocorrido em menos de 1ms do clique.
"O timestamp foi fabricado após os fatos"
O sistema consultou o servidor timeapi.io em dois fusos simultâneos (Brasília UTC-3 e UTC) com latência registrada em milissegundos. A validação cruzada confirma diferença de exatamente 3 horas — prova de autenticidade de ambos os resultados. O registro blockchain confirma o momento independentemente. Para contestar, seria necessário provar que o servidor retornou dados falsos em dois fusos coordenados simultaneamente com a rede Bitcoin.
"As imagens do log fotográfico foram geradas artificialmente"
As imagens foram capturadas pela API nativa chrome.tabs.captureVisibleTab do Chrome, que fotografa a aba completa incluindo a barra de endereço mostrando web.whatsapp.com. Imagens geradas por canvas, puppeteer ou renderizadores headless não incluem a barra de endereço. O UUID de sessão aparece em todos os frames e no manifesto — vinculação impossível de coordenar em artefatos separados.
"O scroll pode ter pulado mensagens"
O sistema verifica continuidade temporal das mensagens e documenta qualquer intervalo longo na seção domIntegrity.continuity. O log fotográfico mostra o scroll completo em sequência — qualquer lacuna seria visível nas imagens. Intervalos são esperados em conversas normais e não indicam supressão.
"A captura foi feita de outra conversa"
O identificador da conversa é capturado no momento exato do clique em REGISTRAR, antes de qualquer operação assíncrona. O sistema verifica durante toda a captura se a conversa visível no DOM corresponde à selecionada. Screenshots de outras conversas são descartados automaticamente — este evento é registrado no log de console.
"Como verificar o registro blockchain"
Acesse opentimestamps.org → Verify → carregue o arquivo proof.ots incluído no pacote. O sistema verificará diretamente na blockchain Bitcoin, sem intermediários, confirmando que o hash existia na data registrada neste documento.
Arquitetura e Protocolos
Algoritmos e Serviços
| Componente | Especificação |
|---|---|
| Hash de mensagens | SHA-256 via Web Crypto API |
| Hash do pacote JSON | SHA-256 calculado após strip de imagens (JSON lean) |
| Hash de screenshots | SHA-256 encadeado (previousHash → hash → próximo frame) |
| Registro blockchain | OpenTimestamps v1 — calendário Bitcoin |
| Âncora temporal | timeapi.io — UTC e UTC-3 com validação cruzada |
| Armazenamento temporário | IndexedDB (screenshots) + chrome.storage.local (mensagens) |
Estrutura do Pacote JSON
| Campo raiz | Conteúdo |
|---|---|
| packageInfo | Identificadores da sessão, versão, telefone, data de geração |
| messages[] | Array de mensagens com hash individual, texto, direção, timestamp |
| chainOfCustody[] | Blocos da cadeia de custódia com tipo, timestamp e hash de dados |
| rootHash | Hash SHA-256 da cadeia de custódia completa |
| sessionUUID | UUID único gerado no clique — presente em todos os artefatos |
| sessionLog[] | Frames do log fotográfico — metadados e hashes (sem imageData) |
| progressiveScreenshots[] | Metadados dos prints progressivos — hashes encadeados (sem imageData) |
| domCapture | Hash, timestamp e código HTML do DOM capturado |
| domIntegrity | Hashes DOM t=0 e t=final com flag unchanged |
| ntpData | Resultados NTP dual com validação cruzada e hash do conjunto |
| verifiedPhone | JID verificado via data-id DOM com amostra de evidências |
| captureEnvironment | User agent, plataforma, idioma, fuso horário, resolução de tela |
Requisitos de Sistema
| Requisito | Especificação |
|---|---|
| Navegador | Google Chrome versão 109 ou superior |
| Sistema Operacional | Windows 10/11, macOS 12+, ou Linux com Chrome |
| Internet | Conexão ativa (NTP, OpenTimestamps e validação de licença) |
| Permissões Chrome | activeTab, storage, downloads, tabs, scripting, <all_urls> |
| WhatsApp Web | Conta ativa em web.whatsapp.com com smartphone vinculado |
FAQ
@lid do WhatsApp (introduzido em 2024), o número real não está disponível no DOM — apenas o identificador interno (LID). O LID é permanente e rastreável pelo WhatsApp/Meta mediante ordem judicial. Veja a seção de Limitações para detalhes.conversationName de cada batch de screenshots, capturado no header visível do DOM no momento da captura. O log de console registra qualquer batch que foi descartado por inconsistência de conversa. O UUID de sessão vincula todos os artefatos ao mesmo momento de captura.Histórico de Versões
- Versão unificada em todos os arquivos (manifest, background, popup, content)
- Guard de conversa no
processBatch()— elimina screenshots de conversas erradas - Debounce de 300ms no MutationObserver — elimina observer flood no carregamento
- Strip de
imageDatado JSON antes do cálculo de hash (103 KB vs 3 MB) captureVisibleTabSafe()com rate limiter de 600ms e retry para erros transitórios<all_urls>no manifest — captura autônoma sem gesto do usuárioclearAll()garantido por sessão dentro destartRecording()- UUID de sessão em todos os artefatos — vinculação criptográfica
- NTP dual com validação cruzada automática (Δ=3h esperado)
- JID verificado via
data-idDOM com amostra de evidências - Session log fotográfico a cada 2 segundos com encadeamento de hashes
- Telefone da conversa ancorado no momento do clique (não após o scroll)
- Remoção de chamada duplicada a
captureFullConversation() - Auto-reinjeção do content script via
scripting APIem caso de erro de conexão - Fix do loop progressivo em conversas de tela única
- Heurística
temPrintsProgressivoscorrigida