W oparciu o odpowiedź @ derobert napisałem program ( gist ), który przeanalizuje strumień wejściowy zi dd
skanuje każdy sektor w poszukiwaniu czegoś, co wygląda jak początek partycji ext.
Będzie działać co najmniej tak szybko, jak dd
można odczytać z dysku twardego. Skrócona wersja znajduje się poniżej.
Najprostsze użycie jest po prostu sudo dd if=/dev/xxx | ext2scan
, chociaż prawdopodobnie będziesz chciał zmodyfikować dd
polecenie, aby poprawić rozmiar bloku lub wybrać region do przeszukania.
#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++;
}
}
Uwaga: znajdzie nie tylko początek partycji, ale także superbloki w nich.
W obu przypadkach polecam użycie dumpe2fs
do analizy wyników. Możesz zrzucić początek podejrzanego superbloku do pliku (co najmniej pierwszych sześciu sektorów, zgodnie z moim nieformalnym testem), a jeśli jest to superblok, dumpe2fs
powiesz (między innymi) względne lokalizacje innych superbloków .