\\ Home Page : Articolo : Stampa
MultiFat Detector - per i pen drive multistrato FAT
Di Admin (del 07/01/2009 @ 21:13:21, in Computer Forensics, linkato 2586 volte)

Dall'esercizio proposto da Mario Pascucci (QUI), mi è venuta l'ispirazione per scrivere questo scriptino, che non fa altro che cercare, tramite sigfind, le signature 55AA delle partizioni FATx, e poi dagli offset, ricavati dalla moltiplicazione del numero di settore, trovato da sigfind, per 512 bytes, ricava il valore dei byte 32,33,34,35 delle FATx trovate e li converte in Big Endian, per poi calcolare la lunghezza totale della partizione in settori.
Infine, crea tutte le immagini dd contenenti le possibili partizioni nascoste. 

Sicuramente è grezzo, però abbastanza veloce, su 2Gb di pen-drive con tre strati, ci ha messo poco più di 20 minuti.

Mi piacerebbe renderlo multi File System, ma c'è da studiarsi bene i bytes che contengono i total sectors, dei vari file systems....e poi si potrebbe espanderlo con più features...comunque è un inizio ;)

 

#!/bin/bash
# MultiFat detector by Nanni Bassetti - http://www.nannibassetti.com
# It runs in this way: sh multiFat.sh disk.dd fat (e.g.)
file=$1
fs=$2
# looking for the signatures
date
sigfind -t $fs $file > sigs.txt
# taking only the sectors
for i in $(cat sigs.txt | awk -F "Block:" '{print $2}'|awk '{print $1}')
do
offset=$(( $i*512 ))
j=$(( j+1 ))
start_byte_fat_len=$(echo $offset + 32 | bc)
# controlling the word "FAT" inside the target partition
fat_flag=$(xxd -s $offset -l 512 $file| grep -i FAT)
if [ "$fat_flag" ]
then
# extracting bytes 32-35 from FAT
xxd -s $start_byte_fat_len -l 4 $file | awk -F ":" '{print $2}' | xxd -p -r >lung.bin
#converting in big endian
dd if=lung.bin of=l1 skip=3 count=1 bs=1c
dd if=lung.bin of=l2 skip=2 count=1 bs=1c
dd if=lung.bin of=l3 skip=1 count=1 bs=1c
dd if=lung.bin of=l4 skip=0 count=1 bs=1c
cat l1 l2 l3 l4 > l.dat
rm l1
rm l2
rm l3
rm l4
rm lung.bin
#calculating the partition length
len=$(cat l.dat|xxd -p | tr [:lower:] [:upper:])
# converting in decimal
len2=$(echo "obase=10; ibase=16; $len" | bc)
dd if=$file of=hidden$j.dd skip=$i count=$len2 bs=512
rm l.dat
fi
done
ls -l *.dd
date
exit

Non scagliate i pomodori...è solo un piccolo esercizio ;) ! (Test sono graditi)

QUI c'è l'evoluzione del programmino...