#!/bin/bash
#-------------------------------------------------------------------------------
# seekdisk.sh                                    (C) 2006 T.Birnthaler OSTC GmbH
# Gelöschte Textdateien über ihren Inhalt auf Festplatte wiederfinden.
#-------------------------------------------------------------------------------
# Verfahren: Festplatte in Form von 1-MByte großen "Chunks" auslesen. Ein Chunk
# ist dann relevant, wenn er 2 bestimmte Texte ($SEARCH1 + $SEARCH2) enthält.
# Solche Blöcke werden unter "/tmp/dump.CHUNKNR" abgelegt (CHUNKNR=1..). Daraus
# dann mit einem Editor (z.B. "vim") die Textdatei manuell extrahieren. Die
# beiden Suchtexte sollten möglichst signifikant sein, damit nur wenige
# "Kandidaten-Blöcke" gefunden werden.
# Achtung: Wurde die Datei mit einem Editor häufig editiert,
# können auch mehrere Versionen davon gefunden werden.
#-------------------------------------------------------------------------------
# Konfiguration (anpassen!)
      DISK="/dev/sda9"
      USER="tsbirn"
     GROUP="tsbirn"
   SEARCH1="Social Engineering"
   SEARCH2="PIN"
   SEARCH3="TAN"
   SEARCH1="Trojaner"
   SEARCH2="Cookies"
   SEARCH3="videolan"
   OVERLAP=1
   OVERLAP=
IGNORECASE=
IGNORECASE="-i"

# Interne Variablen
   DUMPFILE="/tmp/dump"
  LASTBLOCK="$(df | grep "^$DISK " | awk '{ print $2 }')"
 STARTBLOCK=0
  BLOCKSIZE="1024"
CHUNKBLOCKS="5000"
 STEPBLOCKS="5000"
[ -n "$OVERLAP" ] && STEPBLOCKS=$(expr $STEPBLOCKS / 2)
TOTALCHUNKS=$(expr $LASTBLOCK / $CHUNKBLOCKS)

echo "    SEARCH1=$SEARCH1"
echo "    SEARCH2=$SEARCH2"
echo "    SEARCH3=$SEARCH3"
echo "   DUMPFILE=$DUMPFILE"
echo "  LASTBLOCK=$LASTBLOCK"
echo " STARTBLOCK=$STARTBLOCK"
echo "  BLOCKSIZE=$BLOCKSIZE"
echo "CHUNKBLOCKS=$CHUNKBLOCKS"
echo " STEPBLOCKS=$STEPBLOCKS"
echo "TOTALCHUNKS=$TOTALCHUNKS"
echo "Anfangen? (Return)"
read

# Keine Root oder kein Block-Gerät? -> Abbruch
[ $(id -u) != 0 ] && echo "you have to be root!"        && exit
[ ! -b "$DISK" ]  && echo "'$DISK' not a block device!" && exit

# Alte Dumps löschen
rm $DUMPFILE* 2> /dev/null

# Blöcke von Festplatte lesen und Text darin suchen
CHUNK=0
while [ $STARTBLOCK -le $LASTBLOCK ]
do
	PERCENT=$(expr $CHUNK \* 100 / $TOTALCHUNKS)
	echo "reading from $DISK chunk $CHUNK of $TOTALCHUNKS ($PERCENT%)..."

	# Pipe ist wichtig, nicht mit "&&" verketten!
	if dd if=$DISK bs=$BLOCKSIZE skip=$STARTBLOCK count=$CHUNKBLOCKS 2> /dev/null |
	   grep $IGNORECASE "$SEARCH1" > /dev/null 2> /dev/null &&
	   dd if=$DISK bs=$BLOCKSIZE skip=$STARTBLOCK count=$CHUNKBLOCKS 2> /dev/null |
	   grep $IGNORECASE "$SEARCH2" > /dev/null 2> /dev/null &&
	   dd if=$DISK bs=$BLOCKSIZE skip=$STARTBLOCK count=$CHUNKBLOCKS 2> /dev/null |
	   grep $IGNORECASE "$SEARCH2" > /dev/null 2> /dev/null  
	then
		echo "found $SEARCH1 + $SEARCH2 at $CHUNK!"
		dd if=$DISK bs=$BLOCKSIZE skip=$STARTBLOCK count=$CHUNKBLOCKS > "${DUMPFILE}$CHUNK" 2> /dev/null
		chown $USER.$GROUP "${DUMPFILE}$CHUNK"
	fi
	sleep 0.1
	CHUNK=$(expr $CHUNK + 1)
	STARTBLOCK=$(expr $STARTBLOCK + $STEPBLOCKS)
done

# Ergebnis anzeigen
ls $DUMPFILE*
echo $(ls $DUMPFILE* 2> /dev/null | wc -l) "dumps found"

