Возникла такая проблема.
При чтении из MFT-области каждый 511 и 512 байты не верны.
0: 4649 4c45 3000 0300 110d 7d3b 0000 0000 FILE0.....};....
...
496: 1a21 0113 2231 1f2c c702 2101 07fe 0400 .!.."1.,..!.....
512: 4f0f 310f 34c6 e831 20ef 2de5 4121 33da O.1.4..1 .-.A!3.
...
1008: 0000 0000 0000 0000 0000 0000 0000 0400 ................
А на самом деле должен был быть получен такой результат.
0: 4649 4c45 3000 0300 110d 7d3b 0000 0000 FILE0.....};....
...
496: 1a21 0113 2231 1f2c c702 2101 07fe 2111 .!.."1.,..!.....
512: 4f0f 310f 34c6 e831 20ef 2de5 4121 33da O.1.4..1 .-.A!3.
...
1008: 0000 0000 0000 0000 0000 0000 0000 0000 ................
Если читаю из кластеров не относящихся к MFT-области то эти быйты не портятся.
0: ee3f e70d 573b 8986 24e6 bdf0 c57b c858 .?..W;..$....{.X
...
496: c918 a24c fa0b 20f5 b3a8 e9d1 b90b 7042 ...L.. .......pB
512: 5086 4fc1 60e6 81c6 8d10 fa0b 2a16 9c32 P.O.`.......*..2
...
1008: 7021 3702 22c0 f1d0 038b e105 67a7 0426 p!7.".......g..&
Читаю следующим образом.
HANDLE hDrive = CreateFile(TEXT("\\\\.\\PHYSICALDRIVE0"), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
LARGE_INTEGER n64Pos;
n64Pos.QuadPart = NTFSPartition->startMftLCN + 10809155584;
SetFilePointerEx(hDrive, n64Pos, NULL, FILE_BEGIN);
DWORD dwBytesRead;
BYTE *buf= new BYTE[1024];
ReadFile(hDrive, buf, 1024, &dwBytesRead, NULL);
Сначала подумал, что это винда мне специально портит эти байты. Побробовал прочитать тот же сектор из под линукса — Эффект оказался тем же самым.
Может кто-нибудь уже сталкивался с этой проблемой. Помогите пожалуйста. Уже не знаю что делать.
Здравствуйте, ws37sr2, Вы писали:
W>Возникла такая проблема.
W>При чтении из MFT-области каждый 511 и 512 байты не верны.
W>W> 0: 4649 4c45 3000 0300 110d 7d3b 0000 0000 FILE0.....};....
W> ...
W> 496: 1a21 0113 2231 1f2c c702 2101 07fe 0400 .!.."1.,..!.....
W> 512: 4f0f 310f 34c6 e831 20ef 2de5 4121 33da O.1.4..1 .-.A!3.
W> ...
W> 1008: 0000 0000 0000 0000 0000 0000 0000 0400 ................
W>
W>А на самом деле должен был быть получен такой результат.
W>W> 0: 4649 4c45 3000 0300 110d 7d3b 0000 0000 FILE0.....};....
W> ...
W> 496: 1a21 0113 2231 1f2c c702 2101 07fe 2111 .!.."1.,..!.....
W> 512: 4f0f 310f 34c6 e831 20ef 2de5 4121 33da O.1.4..1 .-.A!3.
W> ...
W> 1008: 0000 0000 0000 0000 0000 0000 0000 0000 ................
W>
W>Если читаю из кластеров не относящихся к MFT-области то эти быйты не портятся.
W>W> 0: ee3f e70d 573b 8986 24e6 bdf0 c57b c858 .?..W;..$....{.X
W> ...
W> 496: c918 a24c fa0b 20f5 b3a8 e9d1 b90b 7042 ...L.. .......pB
W> 512: 5086 4fc1 60e6 81c6 8d10 fa0b 2a16 9c32 P.O.`.......*..2
W> ...
W> 1008: 7021 3702 22c0 f1d0 038b e105 67a7 0426 p!7.".......g..&
W>
W>Читаю следующим образом.
W>W> HANDLE hDrive = CreateFile(TEXT("\\\\.\\PHYSICALDRIVE0"), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
W> LARGE_INTEGER n64Pos;
W> n64Pos.QuadPart = NTFSPartition->startMftLCN + 10809155584;
W> SetFilePointerEx(hDrive, n64Pos, NULL, FILE_BEGIN);
W> DWORD dwBytesRead;
W> BYTE *buf= new BYTE[1024];
W> ReadFile(hDrive, buf, 1024, &dwBytesRead, NULL);
W>
W>Сначала подумал, что это винда мне специально портит эти байты. Побробовал прочитать тот же сектор из под линукса — Эффект оказался тем же самым.
W>Может кто-нибудь уже сталкивался с этой проблемой. Помогите пожалуйста. Уже не знаю что делать.
NTFS использует маркеры в конце каждого сектора. Сами байты хранятся внутри записи. Подробнее можно почитать Brian Carrier "File systems forensic analysis". Там кстати очень хорошо написано про NTFS, советую купить эту книгу, есть ее русская редакция "Криминалистический анализ файловых систем".
Здравствуйте, MShura, Вы писали:
MS>Самое полезное — первоисточник. В сорсах.
Это понятно, я имел ввиду литературу. Хотя сорцы тоже в какой-то мере являются художественным произведением