Recuperar mensagens apagadas do WhatsApp
Recuperar mensagens apagadas do WhatsApp usando o incremento Msgstore

Recentemente, ao analisar um smartphone Android , foi necessĂĄrio recuperar mensagens apagadas pertencentes a um chat excluĂdo do aplicativo WhatsApp . AtĂŠ recentemente, mesmo realizando uma anĂĄlise usando softwares profissionais como Cellebrite UFED, Oxygen Forensic Detective e Magnet Axiom, nĂŁo era possĂvel recuperar esse chat porque ele foi excluĂdo antes de ser inserido no backup periĂłdico local clĂĄssico do banco de dados âmsgstore.dbâ e, portanto, nĂŁo era visĂvel com mĂŠtodos padrĂŁo de recuperação de dados.
Recentemente, foi adicionada aos softwares de perĂcia forense mĂłvel a funcionalidade de recuperar chats nĂŁo presentes em backups periĂłdicos, mas acreditamos ser Ăştil ilustrar em detalhes como era possĂvel, mesmo antes da adição, â e ainda ĂŠ â proceder manualmente Ă inspeção dos arquivos relacionados ao aplicativo WhatsApp e recuperar chats excluĂdos.
Especificamente, ilustraremos como recuperar uma parte do chat â nĂŁo presente no BD ou em backups tradicionais â graças Ă anĂĄlise de outro arquivo de backup, incremental e nĂŁo completo: o â msgstore-increment.db â.
O que ĂŠ msgstore-increment.db e para que ele ĂŠ usado?
O aplicativo WhatsApp, quando instalado em dispositivos Android, faz backups periĂłdicos do banco de dados principal âmsgstore.dbâ , que contĂŠm todas as informaçþes relacionadas Ă conta do WhatsApp, incluindo mensagens.
Infelizmente, criar backups e gerenciĂĄ-los, em alguns casos, pode ser difĂcil para o aplicativo, especialmente em situaçþes em que os dados gerenciados tĂŞm centenas de MB, se nĂŁo GB. Por isso, para minimizar a perda de dados e otimizar o gerenciamento de memĂłria do aparelho, o WhatsApp realiza backups incrementais entre cada backup completo, nos quais sĂŁo salvas apenas as alteraçþes ocorridas no aplicativo : por exemplo, se cem mensagens forem enviadas no dia seguinte ao backup completo, elas serĂŁo incluĂdas no backup incremental realizado naquele dia.
Isso significa que se cem mensagens forem enviadas apĂłs o backup completo ter sido criado e depois excluĂdas, elas poderĂŁo ser recuperadas do backup incremental, desde que nĂŁo tenham sido excluĂdas antes de sua criação.
Atualmente, softwares profissionais como o Cellebrite UFED ou o Oxygen Forensics oferecem suporte Ă anĂĄlise do backup incremental msgstore-increment, mas atĂŠ alguns meses atrĂĄs esse provavelmente era um recurso em andamento, pois apareceu recentemente. Consequentemente, antigamente, para tentar recuperar mensagens apagadas, era necessĂĄrio entender a lĂłgica por trĂĄs desse tipo de dado e criar um script capaz de automatizar a extração de quaisquer mensagens apagadas, mas ainda presentes no incremento , enquanto hoje, quem tem um software profissional disponĂvel pode realizar a recuperação diretamente pelas funçþes internas.
Como funciona e como extraio dados do arquivo msgstore-increment.db ?
O primeiro passo foi nos aprofundar em como o backup incremental funciona, tendo primeiro replicado um cenĂĄrio em que esse recurso gerava incrementos. Ao analisar os dados gerados pelo aplicativo WhatsApp, foram identificados e analisados ââdiversos arquivos denominados âmsgstore-increment.db.crypt14â, que sĂŁo arquivos compactados e criptografados. Esses arquivos foram descriptografados utilizando a ferramenta âwa-crypt-toolsâ ( https://github.com/ElDavoo/wa-crypt-tools ) e, posteriormente, descompactados, obtendo-se arquivos estruturados em formato JSON e um arquivo binĂĄrio denominado âmessages.binâ.

ConteĂşdo do arquivo msgstore-increment.db.crypt14, backup incremental
Entre os arquivos JSON, hĂĄ um chamado âheader.jsonâ que contĂŠm informaçþes Ăşteis relacionadas aos outros arquivos na pasta, incluindo âmessages.binâ. AlĂŠm disso, a partir da anĂĄlise realizada no arquivo binĂĄrio, foi possĂvel determinar o formato utilizado para codificação dos dados, ou seja, o protocolo protobuf.
Protobuf Ê um formato de serialização de dados desenvolvido pelo Google e Ê frequentemente usado na transmissão de informaçþes entre aplicativos ou para armazenar dados em formato binårio porque Ê mais leve e tem melhor desempenho que JSON ou XML.
O funcionamento ĂŠ relativamente simples, ĂŠ necessĂĄrio definir a estrutura dos dados criando um arquivo â.protoâ e utilizar um compilador para criar um script capaz de codificar os dados com base no protocolo definido. Abaixo estĂĄ um exemplo de uma definição de protocolo:

Exemplo de definição para protobuf
Neste caso, um script baseado nesta definição serĂĄ capaz de criar um arquivo binĂĄrio contendo os dados de ânomeâ e âidadeâ informados no arquivo protobuf.
O mesmo acontece no aplicativo WhatsApp: o arquivo binĂĄrio âmessages.binâ ĂŠ criado a partir de um trecho de cĂłdigo contido no aplicativo e tem como base um arquivo âprotoâ dentro do qual ĂŠ definida a estrutura das mensagens e conversas.
AlĂŠm disso, o arquivo binĂĄrio âmessages.binâ ĂŠ estruturado com uma ou mais porçþes de dados binĂĄrios codificados em protobuf, tais porçþes tambĂŠm sĂŁo chamadas de segmentos ou âdelimitados por comprimentoâ ( https://protobuf.dev/programming-guides/encoding/#length-types ). Portanto, para ler o conteĂşdo do arquivo ĂŠ necessĂĄrio primeiro separar os vĂĄrios segmentos e depois prosseguir com a leitura.

Representação de segmentos contidos no arquivo messages.bin
Para separar cada segmento individual presente no arquivo âmessages.binâ criamos um script python, que disponibilizamos em nosso repositĂłrio GitHub ( https://github.com/Forenser-lab/wa-increment-decoder/blob/main/splitter.py ), capaz de ler o arquivo âmessages.binâ e criar diferentes arquivos binĂĄrios, cada um contendo os dados protobuf (segmento) a serem lidos.
Em seguida, para ler cada arquivo individual, usamos a ferramenta âprotobuf inspectorâ ( https://github.com/mildsunrise/protobuf-inspector ), um script capaz de ler um arquivo binĂĄrio codificado com protobuf:

SaĂda da ferramenta protobuf_inspector
Embora tenha sido possĂvel extrair as diversas mensagens contidas nos segmentos, elas acabaram sendo uma agregação de dados âanĂ´nimosâ. Embora alguns dos dados obtidos na extração do bate-papo contivessem campos com significado intuitivo, como o texto da mensagem ou o registro de data e hora, outros eram desconhecidos, dificultando a determinação de seu significado real. Isso acontece porque nĂŁo temos a definição do protocolo âprotoâ utilizado pelo Meta e capaz de ler corretamente os dados contidos no arquivo binĂĄrio.
No entanto, existem vĂĄrios projetos de engenharia reversa online que visam definir o protocolo usado no WhatsApp, incluindo o do repositĂłrio Wa-Proto GitHub ( https://github.com/wppconnect-team/wa-proto ) realizado na versĂŁo web do software. Posteriormente, tentando adaptar sua definição ao nosso propĂłsito, conseguimos decodificar corretamente todo o conteĂşdo do arquivo binĂĄrio âmessages.binâ obtendo todos os dados em texto simples com seu significado relativo.
Neste ponto, era simples criar um script que pudesse gerar um arquivo CSV contendo todas as mensagens no binĂĄrio , indicando se uma mensagem havia sido excluĂda. Observe que foram realizados alguns testes que tambĂŠm consideraram mĂdias (imagens, vĂdeos, etc.) e em alguns casos na pasta descriptografada e descompactada relacionada ao incremento hĂĄ a pasta âmessages.binâ contendo miniaturas de imagens excluĂdas (as atualizaçþes subsequentes terĂŁo como objetivo verificar atĂŠ que ponto ĂŠ possĂvel recuperar mĂdias ou vestĂgios delas).
Prova de conceito de descriptografia e anĂĄlise de msgstore-increment.db
Primeiro, o cenĂĄrio foi reproduzido: inicializamos um novo chat, o utilizamos por alguns dias e entĂŁo finalmente o excluĂmos, evitando que ele ficasse armazenado no backup âmsgstore.dbâ. Graças a essa reprodução, embora as mensagens de bate-papo nĂŁo tenham sido incluĂdas no backup semanal, elas ainda foram incluĂdas no backup incremental diĂĄrio.
A imagem a seguir mostra uma ilustração do cenĂĄrio reproduzido. Especificamente, vocĂŞ pode ver como o backup principal ĂŠ criado Ă s 02:00 da manhĂŁ do dia 01/10 e, Ă s 01:35 da tarde do mesmo dia, uma conversa com o ID 123 ĂŠ criada, a qual serĂĄ incluĂda no backup incremental Ă s 02:00 da manhĂŁ do dia 01/11. Por fim, Ă s 16:00 do dia 01/11 o chat com ID 123 ĂŠ deletado (mas ainda estĂĄ presente no backup incremental criado anteriormente):

Cronograma do cenĂĄrio de referĂŞncia
Posteriormente, os backups incrementais foram extraĂdos do dispositivo Android, geralmente contidos no diretĂłrio â/data/media/0/Android/media/com.whatsapp/WhatsApp/Databases/â e devidamente descriptografados utilizando a chave de criptografia apropriada, obtendo-se assim os seguintes arquivos:
- msgstore-incremento-1-2025-01-16.1.db;
- msgstore-incremento-2-2025-01-16.1.db;
- msgstore-incremento-3-2025-01-16.1.db;
- msgstore-incremento-4-2025-01-16.1.db.
Os vĂĄrios backups foram todos inseridos na mesma pasta e entĂŁo o script que criamos para recuperar as mensagens foi executado, o que gerou um arquivo CSV contendo a lista de todas as mensagens extraĂdas:

Gerar arquivo CSV contendo mensagens recuperadas
ConclusĂľes
Graças a uma anĂĄlise aprofundada do gerenciamento de backup no aplicativo WhatsApp para dispositivos Android, conseguimos entender como eles sĂŁo estruturados por meio do conceito de backups incrementais . A anĂĄlise nos levou a criar uma pequena ferramenta, escrita em python, capaz de extrair mensagens do backup incremental â msgstore-increment.db â de forma estruturada e eficiente, com detalhes relevantes como o timestamp e sem a necessidade de utilizar outras ferramentas.
O recurso de backup incremental permite a recuperação de mensagens excluĂdas entre a criação de um backup local completo, âmsgstore.db.crypt14â e outro, portanto nĂŁo recuperĂĄveis ââpor meio de tĂŠcnicas tradicionais de anĂĄlise forense e nĂŁo excluĂdas do banco de dados sqlite ou de backups.
Para quem quiser experimentar ou tentar a extração dessas mensagens, deixamos abaixo o link do script para download no nosso repositório no GitHub ( https://github.com/Forenser-lab/wa-increment-decoder ).
ComentĂĄrios
Postar um comentĂĄrio