Basierend auf der Antwort von @ derobert habe ich ein Programm ( Gist ) geschrieben, das einen Eingabestream von dd
jedem Sektor analysiert und nach etwas durchsucht , das wie der Start einer ext-Partition aussieht.
Es funktioniert mindestens so schnell, wie dd
es von Ihrer Festplatte gelesen werden kann. Eine gekürzte Version ist unten.
Die einfachste Verwendung ist nur sudo dd if=/dev/xxx | ext2scan
, obwohl Sie wahrscheinlich den dd
Befehl ändern möchten , um die Blockgröße zu verbessern, oder eine Region für die Suche auswählen möchten .
#include <unistd.h>
#include <stdio.h>
#include <string.h>
int main() {
unsigned char const MAGIC[2] = {0x53, 0xef};
unsigned char const ZEROS[512] = {0};
long long int sector = 0;
char buf[4][512];
int empty1, empty2;
while (read(STDIN_FILENO, buf[sector&3], 512) > 0) {
if (!memcmp(buf[sector&3] + 0x38, MAGIC, 2)) {
printf("Found a possible ext2 partition at sector %lld", sector-2);
empty1 = !memcmp(buf[(sector-2)&3], ZEROS, 512);
empty2 = !memcmp(buf[(sector-1)&3], ZEROS, 512);
if (empty1 && empty2) printf(" (first two sectors are empty :)\n");
}
sector++;
}
}
Hinweis: Es werden nicht nur der Anfang von Partitionen, sondern auch Superblocks darin gefunden .
In beiden Fällen würde ich empfehlen dumpe2fs
, die Ergebnisse zu analysieren. Sie können den Start des Verdacht Supers in eine Datei Dump (zumindest in den ersten sechs Sektoren, nach meinem informellen Test), und wenn es ein Superblock ist, dann dumpe2fs
werden Sie sagen , (unter anderem) den relativen Positionen der anderen Super .