Decodificando Varints: Uma habilidade crítica em SQLite Forensics

Introdução

O meu primeiro encontro com varints foi há muitos anos, durante um exame forense digital de um iPhone 3GS numa investigação de homicídio e fogo posto. Até então, o meu trabalho forense envolvia principalmente telemóveis, particularmente dispositivos CDMA com BREW. Cada mensagem de texto era armazenada no seu próprio ficheiro, com um offset consistente e um valor hexadecimal simples que indicava o comprimento da mensagem. Era um processo previsível e familiar.

No entanto, o iPhone apresentou-me um desafio totalmente novo. As mensagens já não eram armazenadas como ficheiros individuais, mas sim como registos numa base de dados. Ao contrário da simplicidade dos telemóveis, o comprimento de uma cadeia de mensagens não era definido por um valor hexadecimal claro. Em vez disso, dei por mim a navegar em bases de dados SQLite e a aprender a analisar as cargas úteis dos registos. Foi aqui que me deparei com varints-inteiros de comprimento variável-uma forma compacta e eficiente de codificar dados. A compreensão dos varints tornou-se crucial à medida que eu desvendava a estrutura da base de dados e extraía provas importantes. Neste caso, o domínio dos varints levou a descobertas incriminatórias que, em última análise, ajudaram a garantir a condenação do arguido por fogo posto e homicídio.

Os varints são um componente fundamental das bases de dados SQLite, permitindo a codificação eficiente de números inteiros que definem o comprimento de células, registos e campos específicos. Para os profissionais de investigação forense digital, a descodificação de varints é essencial para descobrir informações críticas nos ficheiros de bases de dados. Estes números inteiros compactos desempenham um papel importante no mapeamento de estruturas de tabelas, na identificação de cargas úteis de registos e na recuperação de dados eliminados ou ocultos.

Esta publicação do blogue explora o papel vital que os varints desempenham na análise forense do SQLite. Irei apresentar o meu VarInt Calculadora, uma ferramenta que desenhei para simplificar o processo de descodificação, e guiá-lo através de um tutorial para o ajudar a aplicar este conhecimento nas suas investigações. Desde a análise de entradas de bases de dados SQLite até à reconstrução de registos eliminados, a compreensão de varints é uma competência que qualquer examinador forense deve ter no seu conjunto de ferramentas.

Compreender as varetas: Identificando e decodificando-os

Para se aprofundar no SQLite e na análise forense digital, uma competência essencial é compreender números inteiros de comprimento variável (varints). Estes números compactos estão por todo o lado nas bases de dados SQLite, ajudando o sistema a poupar espaço ao utilizar o menor número possível de bytes para armazenar valores. Mas também podem ser difíceis de detetar e descodificar se não souber o que procurar. Vamos explicar passo a passo.

O que é um Varint?

Um varint é uma forma especial de armazenar números em que o tamanho do número determina quantos bytes são utilizados. Ao contrário dos números inteiros de comprimento fixo (por exemplo, 4 bytes ou 8 bytes), um varint pode ser tão pequeno como 1 byte ou tão grande como 9 bytes. Esta flexibilidade torna os varints eficientes em termos de espaço, mas também mais difíceis de interpretar.

Onde encontrar Varints?

Nas bases de dados SQLite, os varints são utilizados para codificar:

  • O comprimento das células ou registos numa página da base de dados.
  • IDs de linha que identificam os registos de forma única.
  • O comprimento dos dados na carga útil de um registo.
  • Vários outros valores relacionados com a estrutura da base de dados.

A chave para a leitura de Varints: O bit marcador

A primeira coisa que precisa de saber ao ler um varint é como descobrir o seu comprimento. Cada byte em um varint tem um bit marcador (o bit mais significativo, ou MSB) que diz se há outro byte à direita que faz parte da mesma varint:

  • Se o bit de marcador for 1o byte seguinte também faz parte do varint.
  • Se o bit de marcador for 0, chegou ao fim do varint.

Duas formas de descodificar o comprimento das varetas

Existem dois métodos para descobrir o comprimento de um varint: o método longo (usando binário) e o método fácil (usando o nibble hexadecimal). Vamos analisar ambos.

O caminho mais longo: Usando Binário

    1. Começa com o primeiro byte do varint.
    2. Converta o byte em binário. Olha para o bit mais significativo (o bit mais à esquerda).
      • Se o bit for 1, o byte à direita faz parte do varint.
      • Se o bit for 0, chegou ao fim.
    3. Repita este processo para cada byte até encontrar um byte com um MSB de 0.

Exemplo:

  • Byte: 0xC2 → Binário: 11000010 → MSB: 1 → Continuar.
  • Byte: 0x7F → Binário: 01111111 → MSB: 0 → Paragem aqui.

A maneira fácil: Usando o Nibble Esquerdo

  1. Observe o nibble esquerdo (o primeiro dígito hexadecimal do byte).
  2. Se o nibble esquerdo for 8 ou superior (8, 9, A, B, C, D, E ou F), o byte seguinte faz parte do varint.
  3. Se o nibble esquerdo for 7 ou inferior (0 a 7), chegou ao fim do varint.

Porque é que isto funciona: Um nibble esquerdo de 8 ou mais significa que o MSB é 1, enquanto um nibble esquerdo de 7 ou menos significa que o MSB é 0.

Exemplo:

  • Byte: 0xC2 → Nibble esquerdo: C (maior que 8) → Continuar.
  • Byte: 0x7F → Nibble esquerdo: 7 (menos de 8) → Paragem aqui.
A varint (assinalada a vermelho) identifica o comprimento do quadro de mensagens

Compreender as variações nos comprimentos das células: um exemplo prático

Os varints são utilizados no SQLite para identificar o tamanho de células nas páginas da base de dados. Estas células podem conter qualquer coisa, desde tabelas a registos de tabelas, e o(s) primeiro(s) byte(s) de uma célula indica(m) o tamanho da célula. Este indicador de comprimento é ele próprio um varint, que pode variar de 1 a 9 bytes de comprimento.

Exemplo do mundo real: Ficheiro WAL

Neste exemplo, a célula contém o quadro de mensagens. O primeiro byte da célula é 0x81, indicando um varint de dois bytes.

  • Repartição:
    • Byte 1: 0x81 → Binário: 10000001 → Bit de marcação: 1 → Continuar.
    • Byte 2: 0x07 → Binário: 00000111 → Bit de marcação: 0 → Stop.

Descodificaro Varint

Agora, precisamos de descodificar o varint. Se simplesmente convertermos o valor 0x8107 para um número inteiro, calcularíamos erradamente um valor enorme, 33,031, que claramente não corresponde ao tamanho real da célula.

Porquê?
Os bits do marcador não contribuem para o valor real do varint. Para descodificar corretamente o varint, precisamos de retirar os pedaços de marcador e interpretar apenas as partes significativas da representação binária. Eis como isso é feito:

  • Descodificar:
    • Remover os bits de marcação: 0000001 e 0000111.
    • Combinar os dois septetos: 00000000 10000111 → Decimal: 135.
  • O comprimento da célula é de 135 bytes (excluindo o varint e o ROWID).

Utilização do calculador Varint para eficiência

O Calculadora Varint simplifica este processo. Introduza o valor hexadecimal (por exemplo, 8107) para descodificar rapidamente o varint. No exemplo acima, a calculadora devolve 135, confirmando o comprimento.

Converter o varint 0x8107 em decimal 135

Descodificação de variáveis em cabeçalhos de registos

Em SQLite, os cabeçalhos de registo utilizam varints para definir:

  1. Comprimento: A quantidade de dados a ler.
  2. Tipo: Como interpretar os dados (número inteiro, cadeia de caracteres, BLOB, etc.).
O varint 0x25 no cabeçalho deste registo indica o comprimento da cadeia na carga útil

Exemplo: Comprimento da cadeia de caracteres

Vamos descodificar uma varint num cabeçalho de registo:
  • Varint: 0x25
    • Nibble esquerdo: 2 (menos de 8) → Varint de byte único.
    • Decimal: 37.
  • Carga útil: Comprimento da cadeia = 12 bytes (+97444455667).
A calculadora Varint converte varints em comprimentos de Strings e BLOBs

Reflexões finais

Compreender e descodificar varints é uma competência fundamental para qualquer investigador forense digital que trabalhe com bases de dados SQLite. Estes números inteiros compactos são fundamentais para interpretar as estruturas da base de dados, determinar o tamanho das células e recuperar dados de forma eficiente.

Com ferramentas como a Calculadora Varint, o processo torna-se mais acessível, permitindo que os profissionais forenses se concentrem em descobrir a verdade escondida nas provas digitais. O domínio dos varints é mais do que uma competência técnica - é uma capacidade vital que pode afetar diretamente o resultado das investigações.

Pode ler mais e descarregar a Calculadora Varint aqui:

Facebook
Twitter
Correio eletrónico
Imprimir

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *