Introdução
As bases de dados SQLite são tesouros de provas digitais que se encontram em muitas aplicações, desde mensagens de conversação a registos de transacções. Mas o que acontece quando os registos são eliminados? Introduzir bloqueios livres-secções ocultas de espaço não utilizado nas páginas da base de dados que retêm vestígios de dados eliminados. Estes freeblocks são uma mina de ouro para os investigadores forenses, permitindo a recuperação de registos críticos e a descoberta de provas ocultas.
Este blogue desmistifica os freeblocks do SQLite, explicando-lhe como funcionam, como localizá-los com ferramentas como os editores hexadecimais e como recuperar registos eliminados. Quer seja um investigador ou um entusiasta da investigação forense digital, este guia fornecer-lhe-á as técnicas essenciais para extrair dados ocultos.
O que são Freeblocks no SQLite?
Os freeblocks são secções de espaço não utilizado numa página de uma base de dados SQLite. Quando um registo é apagado, o espaço correspondente não é imediatamente substituído, a menos que um mecanismo de apagamento seguro esteja ativado. Em vez disso, ele é marcado como um bloco livredisponível para futuras escritas.
Neste processo:
- O ponteiro para o registo eliminado é removido.
- O cabeçalho da página é atualizado para refletir a remoção.
- Se aplicável, o desvio que aponta para o primeiro bloco livre é ajustado.
Estes freeblocks retêm frequentemente vestígios dos dados originais, o que os torna um foco crítico para os investigadores forenses que pretendem recuperar registos eliminados.
Exemplo:
Na captura de ecrã abaixo, examinamos uma base de dados SQLite utilizando o DB Browser. A tabela "messages" mostra dois registos activos, mas as pistas forenses sugerem a presença de registos adicionais eliminados.

Como os Freeblocks se encaixam nos cabeçalhos de página do SQLite
Para localizar e analisar freeblocks, precisamos primeiro de compreender a estrutura das páginas da base de dados SQLite. Cada página contém um cabeçalho que fornece metadados críticos, incluindo ponteiros para freeblocks.
O quadro seguinte apresenta a estrutura do cabeçalho para um tipo de página 0D:
Desvio | Tamanho | Descrição |
---|---|---|
0 | 1 Byte | Tipo de página |
1 | 2 Bytes | Deslocação de bytes para o primeiro bloco livre |
3 | 2 Bytes | Número de células na página |
5 | 2 Bytes | Deslocação para o primeiro byte do conteúdo da célula |
7 | 1 Byte | Número de bytes livres fragmentados em células |
Principais conclusões:
O valor no offset 1 no cabeçalho da página aponta para o primeiro bloco livre. Se este valor for 0x0000
não há bloqueios gratuitos na página.
Usando Editores Hexadecimais para Analisar Freeblocks
Para localizar o primeiro freeblock, abrimos a base de dados num editor hexadecimal. O valor de dois bytes no offset 1 do cabeçalho da página fornece o offset para a localização do freeblock.
No exemplo abaixo:
- O editor hexadecimal destaca o deslocamento
0x03A9
(decimal 937) a vermelho, que indica a localização do primeiro bloco livre.

Navegar para este offset revela o início do bloco livre. De seguida, examinamos a célula situada no desvio 937.

Descodificação de cabeçalhos Freeblock
Cada freeblock contém um cabeçalho de quatro bytes que inclui:
- Primeiros 2 bytes: Desvio para o bloco livre seguinte (
0x0000
se não existir nenhum). - Segundo 2 bytes: Tamanho total do bloco livre, incluindo o próprio cabeçalho.
Exemplo:
No desvio 0x03A9
O cabeçalho do bloco livre indica:
- O próximo bloco livre está em offset
0x03EA
(decimal 1002). - O tamanho do bloco livre é
0x0024
(36 bytes, incluindo o cabeçalho).
Recuperação de registos eliminados utilizando Freeblocks
Os freeblocks contêm frequentemente restos de registos eliminados, permitindo aos investigadores forenses recuperar dados parciais ou completos. Na captura de ecrã abaixo, a carga útil de um registo eliminado está intacta e pode ser recuperada apesar de o seu ponteiro ter sido removido.
Exemplo:
- O registo eliminado no offset
0x03A9
contém a mensagem: "Não muito. Como estás?" - Os campos-chave permanecem intactos, incluindo o conteúdo da mensagem, mesmo que outros metadados tenham sido substituídos.

Analisamos os freeblocks subsequentes para descobrir registos adicionais eliminados. No offset 0x03EA
, revela o cabeçalho do bloco livre:
- O tamanho do bloco livre é
0x0016
(22 bytes). - Este é o último bloco livre da cadeia, como indicado por
0x0000
no campo do ponteiro do bloco livre seguinte.

A captura de ecrã abaixo destaca toda a área da célula do segundo bloco livre na cadeia onde a mensagem eliminada era "Hi Andy!".

Identificação de registos eliminados adicionais
Mas acontece que há mais um registo apagado nesta página não referenciado pela cadeia de blocos livres. Olhando para trás no cabeçalho da página, havia apenas 2 registos nesta página de acordo com o valor de dois bytes no offset 3 (0x00002
). E como só há 2 registos, só há dois ponteiros na matriz de ponteiros. Esses dois ponteiros apontam para o registo #2 - "Hey, what's up?" e para o registo #4 - "Hey, I was wondering if you have any Scooby snax." Podes reparar que há outra mensagem longa localizada mais acima na página.
O valor de dois bytes no offset 5 no cabeçalho da página é o offset para a área de conteúdo da célula, essencialmente onde o próximo registo será escrito, isto é, a menos que caiba num dos freeblocks. Esse valor é 0x0363
que é o deslocamento decimal 867.

A seta na captura de ecrã acima aponta para o deslocamento de página 867. Este é o início do conteúdo da célula, o que significa que o registo seguinte será adicionado imediatamente acima deste registo. O registo eliminado acima deste contém a mensagem: "Recebi um novo fornecimento ontem à noite. Está com sorte. De quanto precisas?"
A base de dados considera estes dados como espaço não atribuído. Também pode ser preenchido com 0x00
uma vez que não existe nenhum ponteiro na matriz de ponteiros que o enderece.
Se um registo demasiado grande para caber nos dois freeblocks da página for adicionado à tabela a que esta página pertence, substituirá a mensagem, que por acaso é o registo #5.
Vejamos como fica agora que identificámos os dois freeblocks juntamente com o terceiro registo eliminado que está à espera de ser substituído:

Depois de analisar a base de dados no seu formato bruto, podemos concluir que continha mais do que apenas os 2 registos "vivos" que o visualizador da base de dados apresentava.
O registo #1 era provavelmente a mensagem "Hi Andy!", enquanto o registo #3 era provavelmente a mensagem "Not much. Como estás?". O registo #5 ainda tem o seu número de registo na célula identificada como a mensagem "Por acaso recebi um novo fornecimento ontem à noite. Estás com sorte. De quanto precisas?"
Conclusão
Os freeblocks são uma ferramenta poderosa nas investigações forenses, oferecendo uma janela para registos eliminados e dados não atribuídos. Ao dominar estas técnicas, os investigadores podem descobrir os vestígios digitais que as bases de dados deixam para trás.
Pronto para levar as suas competências forenses em SQLite para o próximo nível? Explore os nossos programas de formação avançada ou contacte-nos para saber como o podemos ajudar a tornar-se um perito forense.