Descifrando Varints: Una habilidad crítica en el análisis forense de SQLite

Introducción

Mi primer encuentro con varints fue hace muchos años durante un examen forense digital de un iPhone 3GS en una investigación de asesinato e incendio provocado. Hasta entonces, mi trabajo forense se había centrado principalmente en los teléfonos móviles, sobre todo en los dispositivos CDMA con BREW. Cada mensaje de texto se almacenaba en su propio archivo, con un desplazamiento coherente y un valor hexadecimal directo que indicaba la longitud del mensaje. Era un proceso predecible y familiar.

Sin embargo, el iPhone me planteó un reto totalmente nuevo. Los mensajes ya no se almacenaban como archivos individuales, sino como registros dentro de una base de datos. A diferencia de la simplicidad de los teléfonos con funciones, la longitud de una cadena de mensajes no estaba definida por un valor hexadecimal claro. En su lugar, me encontré navegando por bases de datos SQLite y aprendiendo a analizar las cargas útiles de los registros. Fue aquí donde me encontré con varints-enteros de longitud variable-una forma compacta y eficaz de codificar datos. Comprender los varints fue crucial para desentrañar la estructura de la base de datos y extraer pruebas clave. En este caso, el dominio de los varints condujo a hallazgos incriminatorios que, en última instancia, ayudaron a condenar al acusado por incendio provocado y asesinato.

Los varints son un componente fundamental de las bases de datos SQLite, ya que permiten la codificación eficiente de enteros que definen la longitud de celdas, registros y campos específicos. Para los forenses digitales, descifrar los varints es esencial para descubrir información crítica dentro de los archivos de bases de datos. Estos enteros compactos desempeñan un papel importante en el mapeo de estructuras de tablas, la identificación de cargas útiles de registros y la recuperación de datos eliminados u ocultos.

Esta entrada del blog explora el papel vital que desempeñan las varints en el análisis forense de SQLite. Presentaré mi Calculadora VarIntuna herramienta que diseñé para simplificar el proceso de descodificación, y guiarte a través de un tutorial para ayudarte a aplicar estos conocimientos en tus investigaciones. Desde el análisis sintáctico de entradas de bases de datos SQLite hasta la reconstrucción de registros eliminados, la comprensión de varints es una habilidad que todo examinador forense debería tener en su caja de herramientas.

Entender las varintas: Detectarlos y descifrarlos

Para profundizar en SQLite y en el análisis forense digital, una habilidad clave que necesitarás es comprender enteros de longitud variable (varints). Estos números compactos están presentes en todas las bases de datos SQLite y ayudan al sistema a ahorrar espacio utilizando el menor número posible de bytes para almacenar valores. Pero también pueden ser difíciles de detectar y descifrar si no sabes qué buscar. Veámoslo paso a paso.

¿Qué es un Varint?

Un varint es una forma especial de almacenar números en la que el tamaño del número determina cuántos bytes se utilizan. A diferencia de los números enteros de longitud fija (por ejemplo, 4 u 8 bytes), un varint puede ser tan pequeño como 1 byte o tan grande como 9 bytes. Esta flexibilidad hace que los varint ocupen poco espacio, pero también que sean más difíciles de interpretar.

¿Dónde encontrará Varints?

En las bases de datos SQLite, se utilizan varints para codificar:

  • Longitud de las celdas o registros de una página de base de datos.
  • Identificadores de fila que identifican unívocamente los registros.
  • La longitud de los datos dentro de la carga útil de un registro.
  • Otros valores relacionados con la estructura de la base de datos.

La clave para leer Varints: El bit marcador

Lo primero que hay que saber al leer un varint es cómo averiguar su longitud. Cada byte de un varint tiene un marcador bit (el bit más significativo, o MSB) que te indica si hay otro byte a la derecha que forma parte del mismo varint:

  • Si el bit de marcador es 1el siguiente byte también forma parte del varint.
  • Si el bit de marcador es 0has llegado al final de la varint.

Dos maneras de descifrar la longitud de las varints

Existen dos métodos para averiguar la longitud de un varint: el método largo (utilizando el binario) y el método fácil (utilizando el nibble hexadecimal). Repasemos ambos.

El camino más largo: Utilizar el binario

    1. Empieza con el primer byte del varint.
    2. Convierte el byte en binario. Mira el bit más significativo (el bit situado más a la izquierda).
      • Si el bit es 1, el byte de la derecha forma parte del varint.
      • Si el bit es 0, has llegado al final.
    3. Repita este proceso para cada byte hasta que encuentre un byte con un MSB de 0.

Ejemplo:

  • Byte: 0xC2 → Binario: 11000010 → MSB: 1 → Continúa.
  • Byte: 0x7F → Binario: 01111111 → MSB: 0 → Deténgase aquí.

La manera fácil: Utilizar el Mordisco Izquierdo

  1. Mira el nibble izquierdo (el primer dígito hexadecimal del byte).
  2. Si el nibble izquierdo es 8 o superior (8, 9, A, B, C, D, E o F), el siguiente byte forma parte del varint.
  3. Si el nibble izquierdo es 7 o inferior (0 a 7), has llegado al final del varint.

Por qué funciona: Un nibble izquierdo de 8 o más significa que el MSB es 1, mientras que un nibble izquierdo de 7 o menos significa que el MSB es 0.

Ejemplo:

  • Byte: 0xC2 → Mordisco izquierdo: C (mayor que 8) → Seguir.
  • Byte: 0x7F → Mordisco izquierdo: 7 (menos de 8) → Deténgase aquí.
El varint (subrayado en rojo) identifica la longitud de la tabla de mensajes

Comprender las variaciones en la longitud de las células: un ejemplo práctico

Los varints se utilizan en SQLite para identificar el tamaño de células en las páginas de bases de datos. Estas celdas pueden contener cualquier cosa, desde tablas hasta registros de tablas, y el primer byte de una celda nos indica el tamaño de la misma. Este indicador de longitud es a su vez un varint, que puede variar entre 1 y 9 bytes de longitud.

Ejemplo real: Fichero WAL

En este ejemplo, la celda contiene el tabla de mensajes. El primer byte de la celda es 0x81que indica un varint de dos bytes.

  • Desglose:
    • Byte 1: 0x81 → Binario: 10000001 → Bit de marcador: 1 → Continuar.
    • Byte 2: 0x07 → Binario: 00000111 → Bit de marcador: 0 → Parada.

Descodificaren el Varint

Ahora, necesitamos decodificar el varint. Si simplemente convertimos el valor 0x8107 a un número entero, calcularíamos erróneamente un enorme, 33.031, que claramente no coincide con el tamaño real de la celda.

¿Por qué?
Los bits marcadores no contribuyen al valor real del varint. Para decodificar el varint correctamente, necesitamos quitar los trozos de marcador e interpretar sólo las partes significativas de la representación binaria. Así es como se hace:

  • Descodifica:
    • Quita los bits marcadores: 0000001 y 0000111.
    • Combina los dos septetos: 00000000 10000111 → Decimal: 135.
  • La longitud de la celda es de 135 bytes (excluyendo el varint y el ROWID).

Uso de la calculadora Varint para la eficiencia

En Calculadora Varint simplifica este proceso. Introduzca el valor hexadecimal (por ejemplo, 8107) para descodificar rápidamente el varint. En el ejemplo anterior, la calculadora devuelve 135, lo que confirma la longitud.

Conversión del varint 0x8107 a decimal 135

Descodificación de varints en las cabeceras de los discos

En SQLite, las cabeceras de registro utilizan varints para definir:

  1. Longitud: Cuántos datos hay que leer.
  2. Tipo: Cómo interpretar los datos (entero, cadena, BLOB, etc.).
Varint 0x25 dentro de esta cabecera de registro indica la longitud de la cadena en la carga útil

Ejemplo: Longitud de la cadena

Descodifiquemos un varint en la cabecera de un registro:
  • Varint: 0x25
    • Mordilla izquierda: 2 (menos de 8) → Varint de un byte.
    • Decimal: 37.
  • Carga útil: Longitud de la cadena = 12 bytes (+97444455667).
La calculadora Varint convierte varints en cadenas y longitudes BLOB

Reflexiones finales

Comprender y descodificar los varints es una habilidad fundamental para cualquier investigador forense digital que trabaje con bases de datos SQLite. Estos números enteros compactos son fundamentales para interpretar las estructuras de las bases de datos, determinar el tamaño de las celdas y recuperar datos de forma eficaz.

Con herramientas como Varint Calculator, el proceso resulta más accesible, lo que permite a los forenses centrarse en descubrir la verdad oculta en las pruebas digitales. Dominar los varints es más que una habilidad técnica: es una capacidad vital que puede influir directamente en el resultado de las investigaciones.

Puede obtener más información y descargar la calculadora Varint aquí:

Facebook
Twitter
Correo electrónico
Imprimir

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Suscríbase para estar al día

No se pierda ni una entrada: reciba notificaciones cada vez que publiquemos un nuevo artículo en el blog, una guía forense o compartamos actualizaciones importantes.

Última publicación