Dựa trên câu trả lời của @ derobert , tôi đã viết một chương trình ( ý chính ) sẽ phân tích luồng đầu vào từ đó dd
và quét từng khu vực để tìm thứ gì đó giống như bắt đầu phân vùng mở rộng.
Nó sẽ hoạt động ít nhất là nhanh như dd
có thể đọc từ đĩa cứng của bạn. Một phiên bản rút gọn dưới đây.
Cách sử dụng đơn giản nhất chỉ là sudo dd if=/dev/xxx | ext2scan
, mặc dù bạn có thể muốn sửa đổi dd
lệnh để cải thiện kích thước khối hoặc chọn một khu vực để tìm kiếm.
#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++;
}
}
Lưu ý: nó sẽ không chỉ tìm thấy sự bắt đầu của các phân vùng, mà còn cả các siêu khóa trong chúng.
Trong cả hai trường hợp, tôi khuyên bạn nên sử dụng dumpe2fs
để phân tích kết quả. Bạn có thể đổ phần bắt đầu của siêu khối bị nghi ngờ vào một tệp (ít nhất là sáu lĩnh vực đầu tiên, theo thử nghiệm không chính thức của tôi) và nếu đó là siêu khối, thì dumpe2fs
sẽ cho bạn biết (trong số những thứ khác) vị trí tương đối của các siêu khóa khác .