La receta del artículo de antes:Arranco un SO (Linux) desde un disco (OUTPUT) distinto del que quiero analizar (disco INPUT). Leo (dd_rescue) el primer bloque del disco INPUT (el disco donde estuvo mi fichero) y lo guardo en un fichero en el filesystem de OUTPUT. Hago una búsqueda (grep) en ese fichero de la cadena (o cadenas) que contenía mi código (búsqueda en datos binarios, del estilo que he comentado antes). Si el grep encuentra coincidencia mantengo el fichero (aunque renombrado con un número de secuencia). Si no encuentra coincidencia borro el fichero. Pasamos al siguiente bloque de disco INPUT, y repetimos el proceso. Así sucesivamente hasta que haya analizado todos los bloques del disco INPUT. Al final tendré una colección de ficheros en el disco OUTPUT que coinciden con la cadena (o cadenas) que haya utilizado para buscar con grep. Sólo me queda cruzar los dedos, abrir esos ficheros con mi editor favorito y esperar que las las líneas del código perdido se encuentre en alguno (o algunos) de ellos.
La explicación anterior en código bash:
#/bin/bash
export OUTPUT=/root/match/match
export INPUT=/dev/sdc1
export BYTES=320072933376
export NEXT=10485760
export MY_STRING="foreach"
export UNITS=`expr $BYTES \/ $NEXT`
export UNIT=0
export BYTE=0
while true
do
ddrescue -b $NEXT -n -i $BYTE -o 0 -s $NEXT -v -t $INPUT $OUTPUT
#un ejemplo comentado de busqueda tipo OR con grep
#grep -aq '\(iconv\|foreach\)' $OUTPUT && mv $OUTPUT $OUTPUT.$UNIT || rm -f $OUTPUT
grep -aq $MY_STRING $OUTPUT && mv $OUTPUT $OUTPUT.$UNIT || rm -f $OUTPUT
if [ $BYTE -gt $BYTES ] ; then
exit
fi
UNIT=`expr $UNIT + 1`
BYTE=`expr $UNIT \* $NEXT`
DATE=`date` echo ----- $DATE --- $UNIT/$UNITS --- $BYTE/$BYTES -----
done
En el código anterior, OUTPUT no es exactamente el disco OUTPUT, sino la ruta y prefijo de salida utilizados para ir guardando los ficheros-coincidencia. Al final del proceso se obtienen en la ruta /root/match/ ficheros cuyos nombres son del tipo match.101, match.2122, match.6160...
INPUT sí que es un dispositivo, aquel desde donde leemos. BYTES es el número total de bytes que hay que leer (en condiciones normales el número total de bytes de ese disco o partición). MY_STRING es la cadena de búsqueda, en mi caso la palabra "foreach".
Finalmente NEXT es la longitud en bytes que queremos leer en cada bloque, en el ejemplo son 10485760 bytes (10 MBytes).
La suerte, que se había reído de mí horas antes, esta vez me sonrió. Dentro de uno de los ficheros match.* que obtuve con el script anterior, encontré el código que buscaba.


Inglés a castellano
Anglès a català
Deja tu comentario