Recuperar archivos eliminados de discos relativamente grandes produce enormes cantidades de falsos positivos. Se recuperan muchos archivos que, en realidad, no contienen información útil y, en muchos casos, no se pueden abrir porque no tienen la estructura adecuado. El «sufrido» perito se tiene que pasar horas revisando archivos ilegibles hasta encontrar algún fichero válido con información útil.
Esta misma semana un «conocido» (persona que te hace trabajar como si fuera un cliente pero al que no puedes facturar) me «pidió» que recuperase las fotografías desaparecidas del disco duro de su portátil (230 GB). En realidad, el «conocido» había reinstalado el sistema operativo borrando todos los archivos de su usuario. Quería recuperar su valiosa colección de fotografías.
Arranqué el equipo con una distribución Linux desde un disco externo, cloné el disco duro en otro disco externo «de trabajo» y usé foremost para recuperar archivos JPG (las «valiosas» fotos estaban en formato JPG). Resultado: 135.000 archivos JPG recuperados ocupando 70 GB. Evidentemente, la mayoría de estos archivos (el 60%) no son archivos JPG válidos; son «falsos positivos» de foremost.
Ante esta situación mi objetivo era filtrar los 81.000 falsos positivos y quedarme con los archivos que realmente son imágenes correctas (que se abren con un visor de imágenes y muestran «algo»). El siguiente paso (fuera del contexto de esta entrada) sería ordenar los archivos resultantes por resolución, tamaño o cualquier otro criterio y quedarme sólo con las imágenes buscadas.
Foremost, Scalpel, PhotoRec
Foremost (http://foremost.sourceforge.net/), Scalpel y PhotoRec (http://www.cgsecurity.org/wiki/PhotoRec) son algunas de las utilidades que permiten recuperar archivos borrados de un disco mediante «carving». Esto es, recorren todo el espacio libre (sin uso) del disco buscando secuencias de datos que coincidan con la estructura de tipos de archivos conocidos. Para recuperar ficheros JPG, por ejemplo, buscan la secuencia «0xFFD8» (marca de inicio) y, una vez encontrada esta secuencia buscan la marca de final de archivo (0xFFD9). Si no hay marca de final el programa extrae un número máximo de bytes (prefijado) a partir de la posición de la cabecera.
Como se comentó antes, la probabilidad de encontrar «0xFFD8» sin tratarse de una imagen es muy alta, produciéndose un montón de falsos positivos. También se producen falsos positivos cuando un archivo borrado es sobreescrito parcialmente con nuevos datos y el resultado resulta irreconocible.
La aparición de falsos positivos es, de alguna manera, deseable ya que lo que el perito necesita habitualmente es localizar cualquier información útil. Es laborioso obtener muchos falsos positivos pero peor sería que el programa de recuperación generase «falsos negativos» y dejase fuera de la extracción los archivos realmente relevantes.
ImageMagick
ImageMagick (http://www.imagemagick.org/script/index.php) es un «editor de imágenes orientado a la línea de comandos». Se presenta como un conjunto de programas que se pueden invocar desde la línea de comandos y permiten, entre otras funciones, redimensionar imágenes, convertir formatos, aplicar efectos, combinar varias imágenes en una, etc.
Parece un contrasentido pero es muy útil cuando hay que realizar una operación simple (o no tan simple) sobre muchas imágenes y se quiere automatizar el proceso sin tener que ejecutar manualmente las operaciones usando un editor gráfico (tipo Photoshop, GIMP, etc.).
En el caso que nos ocupa usé el comando «identify» que permite obtener información de una imagen y, como resultado añadido, devuelve un código de error cuando el fichero no es una imagen válida.
Filtrar-falsos-positivos.ps1
# 2014-01-08
# Script para separar en un directorio ficheros JPG válidos de JPG no válidos.
# Muy útil para descartar falsos positivos de SCALPEL / FOREMOST, etc.
#
# Para ejecutar scripts en Powershell hay que dar permisos de ejecución.
# Set-ExecutionPolicy Unrestricted
#
# Utiliza el comando «identify» de la librería http://www.imagemagick.org/# Parámetros
param (
[string]$extension = «*.JPG»,
[string]$idir = «.»
)$comando= «Filtrar-falsos-positivos.ps1»
$buenos= «.buenos»
$malos= «.malos»write-host -NoNewLine Filtrar-falsos-positivos.ps1
write-host
write-host -NoNewLine «Uso: » $comando » extension»
write-host -NoNewLine Ejemplo: $comando -extension *.jpg [-idir directorio]
write-host -NoNewLine Parseando $extension en $idir
write-hostNew-Item -ItemType directory -Path $buenos 2> $null
New-Item -ItemType directory -Path $malos 2> $nullGet-ChildItem $idir -Filter $extension | `
Foreach-Object{
$archivo = $_.FullNamewrite-host $archivo
identify -quiet $archivo | out-null
if ( $LASTEXITCODE -eq 0) {
# es un JPG correcto, lo muevo a buenos
mv $archivo $buenos
}
else{
# en un JPG inválido, lo borro (o lo muevo)
mv $archivo $malos
}
}write-host
write-host -NoNewLine ***
<Usos de ImageMagick: filtrar falsos positivos de imágenes recuperadas con Foremost />