terughalen van verloren gewaande bestanden met Linux en foremost

recover deleted file with foremost

Voor iedereen die wat met computers doet is het bijna een bekend probleem, een kennis heeft een digitale camera en om een of andere reden zijn alle foto’s van zijn geheugenkaartje verdwenen, of je ze even terug wilt halen.
Met de juiste tools is dit vaak vrij gemakkelijk. Het kaartje is bijvoorbeeld geformatteerd en dan lijkt het leeg, maar gelukkig staan alle bestanden er nog gewoon op.
Soms komen ook de standaard tools er niet uit en dan zijn er voor Linux altijd nog een aantal speciale forensische programma’s die je kan proberen. Een daarvan is foremost een programma dat het medium in kwestie afscant op bekende headers, footers en data structuren en vervolgens de bijbehorende bestanden weer terughaalt. Foremost is ontwikkeld door Air Force Office of Special Investigations en The Center for Information Systems Security Studies and Research.

Normaliter staat op een opslagmedium zoals harddisk of smartcard een zogenaamde “File Allocation Table”, in deze FAT is te vinden welke bestanden er op het medium staan en waar ze te vinden zijn (vergelijk het met een kaartenbak). Als de FAT afwezig of corrupt is, kan het besturingssysteem geen bestanden meer vinden en biedt het meestal aan om het medium te formatteren zodat het weer bruikbaar wordt.
Foremost kijkt niet naar de FAT maar begint het medium byte voor byte te lezen en vergelijkt de informatie met bekende headers. Zo begint een jpg bestand bijvoorbeeld met:
FF D8 FF
en eindigt het met:
FF D9
Ook (bijna) alle andere bestanden hebben dit soort unieke headers. In Linux gebruikt b.v. het file commando deze informatie om terug te geven wat voor soort bestand het is, dus zonder te kijken naar de extensie.

Om het xD kaartje te kunnen uitlezen op mijn fedora core 5 laptop sloot ik een Medion USB2 16-card reader aan van de aldi. Helaas ging dat niet onmiddelijk goed, de blauwe leesled bleef maar knipperen en dmesg | tail gaf foutmeldingen als:

usb 1-7: new high speed USB device using ehci_hcd and address 11
usb 1-7: device descriptor read/all, error -71

Dit lijkt een of andere bug te zijn is het USB2 subsysteem van linux. Onder Windows zou dit meteen einde oefening zijn, maar met Linux kan je b.v. het USB2 gedeelte uit de kernel verwijderen met:
rmmod ehci_hcd
en dan komt het kaartje alsnog netjes via USB1 beschikbaar:

[super@zorax ~]# fdisk -l /dev/sdd

Disk /dev/sdd: 65 MB, 65536000 bytes
8 heads, 32 sectors/track, 500 cylinders
Units = cylinders of 256 * 512 = 131072 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sdd1   *           1         500       63972+   1  FAT12

mounten wilde niet lukken (bekende melding:
mount: wrong fs type, bad option, bad superblock on /dev/sdd1, )
dus heb ik eerst maar eens een kopie gemaakt op harddisk om alle info
veilig te stellen:

dd if=/dev/sdd1 of=m-xd-card.iso

Met:

hexview -C m-xd-card.iso | less

kan je een indruk krijgen of er nog wat te redden valt. Als je allemaal 00 ziet dan is er niets meer van te maken. Of:

strings m-xd-card.iso | grep -i jpg

Foremost stond nog niet op mijn systeem, dus ik heb het eerst geinstalleerd met:

yum install foremost

en daarna was het een kwestie van:

foremost -t jpg m-xd-card.iso

en alle jpg plaatjes kwamen boven water in de directory output/jpg

[super@zorax ~]# ls output/jpg/
00000105.jpg  00006729.jpg  00013225.jpg  00018665.jpg  00024073.jpg  00029737.jpg  00035113.jpg
00001449.jpg  00008041.jpg  00014601.jpg  00019881.jpg  00025417.jpg  00031081.jpg  00036457.jpg
00002857.jpg  00010665.jpg  00016009.jpg  00021321.jpg  00026857.jpg  00032425.jpg  00037737.jpg
00005609.jpg  00012041.jpg  00017449.jpg  00022729.jpg  00028297.jpg  00033833.jpg