Poloha File recordu v MFT (NTFS)

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod Fantom007 20. 11. 2017 08:43

Jen úvodem - chci napsat software, který přiřadí k souborům na disku příslušnou oblast zabraných sektorů (setříděno podle sektorů), abych věděl, které soubory při vadných sektorech po testu disku a jeho opravě jsou nakopnuté. Pro soubory větší než 700 bytů používám FSCTL_GET_RETRIEVAL_POINTERS, ale menší jsou rezidentní přímo v MFT tabulce. Pomocí FSCTL_GET_NTFS_FILE_RECORD mohu vypsat/zkopírovat obsah souboru, ale spíš bych potřeboval vědět, kde daný FileRecord leží, když znám jeho Id (FileIndex z GetFileInformationByHandle). U prvního testovaného souboru to vychází: začátek MFT je na sektoru 0x600000, FileIndex * SektorsPerFileRecord = 0x4D * 2 = 0x9A, začátek file recordu je tedy na sektoru 0x60009A. Jenže u vyšších Id to neplatí: FileIndex = 124527, *2 = 249054 = 0x3CCDE. Očekával bych začátek File recordu na sektoru 0x63CCDE, jenže ten je až na 0x764B93E. Po dlouhém studiu NTFS vím, že MFT je nafukovací až do 65535 File recordů, a když to nestačí, stane se z této MTF bázová MFT, a pro nerezidentní záznam, který se tam už nevejde, je vytvořena další instance MFT. Bohužel jsem nezjistil způsob napojení jednotlivých MFT, jak je procházet, a zjistit, kde leží začátek File recordu v jiné než bázové MFT. Poradí někdo?
Fantom007
Junior

Odeslat příspěvekod JirkaVejrazka 20. 11. 2017 10:03

Myslim, zes to spatne pochopil MFT je jen jedna.

Vyhrabal jsem z knihovny File System Forensic Analysis (Brian Carrier, ISBN 0-321-26817-2). Na strane 284 je napsano, se jeden File zaznam v MFT muze mit as 65535 atributu a pokud to nestaci, stava se z nej "base entry". Ta bude obsahovat atribut typu $ATTRIBUTE_LIST, obsahujici seznam vsech atributu a adresu MFT, kde je ten atribut ulozeny. Ostatni MFT zaznamy vztahujici se ke stejnemu File zaznamu (tj. ty co navazuji na dany "base entry" se poznaji podle toho, ze jim chybi atributy $FILE_NAME a $STANDARD_INFORMATION.

Od strany 320 je pak popsan atribut $ATTRIBUTE_LIST. Jasne se tam rika, ze jeho identifikator je 32 a ze je pouzit, pokud soubor nebo adresar potrebuje vic nez 65535 atributu, takze se nevejde do jednoho MFT zaznamu. Kazda polozka $ATTRIBUTE_LIST obsahuje typ ulozeneho atributu a adresu MFT, kde je realne ulozen.

EDIT: jen pro info - kdysi davno jsem se podobnym problemem zabyval - pocitej s tim, ze ti to zabere opravdu hodne pameti. Neni to jednoducha uloha.
JirkaVejrazka
Mírně pokročilý

Odeslat příspěvekod Fantom007 20. 11. 2017 10:47

Moje $MFT začíná na sektoru 0x600000 a má velikost 566784 = 0x8A600. V počátečním sektoru jsou tyto čtyři atributy:
0x10 - $STANDARD_INFORMATION
0x30 - $FILE_NAME
0x80 - $DATA se dvěma Data run:
Size=0x32, Cluster count=2912=0xB60, First cluster=786432=0xC0000
Size=0x43, Cluster count=72288=0x11A60, First cluster=15476972=0xEC28EC
0xB0 - $BITMAP (bitová mapa alokovaných clusterů)

Žádný atribut $ATTRIBUTE_LIST tu nevidím (prohlížím pomocí Active@ Disk Editor).

Dále pokaždé o 2 sektory dál je na začátku FILE0 (File recordy jednotlivých souborů).

Prosím pomohl bys mi se v této MFT zorientovat? (kde najdu další MTF záznamy?).
Fantom007
Junior

Odeslat příspěvekod JirkaVejrazka 20. 11. 2017 10:52

Kazdy zaznam, ma 1024 bytu. Mohl by mit teoreticky i jiny rozmer (a ten by byl zapsan v boot sektoru).

Takze se proste posun o 1024 bytu dal (tve dva sektory, pokud ma tvuj sektor 512 bytu) a najdes tam zaznam cislo dve. Zadna hlubsi veda v tom neni.

$ATTRIBUTE_LIST najdes pouze v pripade, ze ten zaznam bude typu "base_entry", jak jsem psal nahore. Pokud se kompletni popis souboru vejde do jednoho MFT zaznamu, tak ten zaznam zadny $ATTRIBUTE_LIST nepotrebuje a tim padem ani neobsahuje.
JirkaVejrazka
Mírně pokročilý

Odeslat příspěvekod Fantom007 20. 11. 2017 11:36

Proč tedy soubor se záznamem 77 je na místě, které mi vyjde při posunu MFT tabulkou o 2x77 sektorů (což jsem očekával) a soubor se záznamem 124527 je úplně jinde? (jinde ho vidí více programů, např NTFSWalker nebo Active@ Disk Editor) - viz můj první příspěvek.
Fantom007
Junior

Odeslat příspěvekod JirkaVejrazka 20. 11. 2017 11:49

Predpokladam ze je dal, nez bys ho cekal, ze? Proste jsou mezitim vlozene nejake bloky, ktere navazuji na "base entry" bloky a primo neadresuji zadny novy soubor. Takze se ti ty "normalni" zaznamy proste posunou dal, nez spocitas prostym vynasobenim poctu zaznamu velikosti zaznamu.

Laicky receno - nektere soubory potrebuji vic nez jeden MFT zaznam.
JirkaVejrazka
Mírně pokročilý

Odeslat příspěvekod Fantom007 20. 11. 2017 13:30

Dlouho jsem přemýšlel, do kolika oblastí je MFT rozdělená a kde jsou, a pak mě to trklo. Počet částí MFT, jejich začátky a délky jsou v attributu 0x80 - $DATA - počet částí Data run. Ovšem hodnoty jsou v clusterech. Do jednoho clusteru se vejdou 4 recordy po 1024 bytech. Délka první části MFT je 2912 * 4 = 11648 záznamů. Hledaný File record je 124527, to znamená, že leží ve druhé části MFT. 124527-11648=112879 - toto je index ve druhé části MFT, která začíná na clusteru EC28EC, tedy sektoru 0x7614760. Pokud k této hodnotě přičteme 2 * 112879, dostaneme správnou adresu 0x764B93E. Díky Jirkovi Vejražkovi za vysvětlení i za inspiraci :tleskani .
Fantom007
Junior

Odeslat příspěvekod JirkaVejrazka 20. 11. 2017 13:49

Promin, ale mas to cele spatne. Nechces si o tom precist nejakou knihu? Zatim jenom hadas a cekas, kde ti to vyjde.

MFT je *jedna* tabulka obsahujici blize neurceny pocet zaznamu. Kazdy zaznam ma (v implementaci Microsoftu) 1024 bytu. Kazdy zaznam bud primo obsahuje informaci o tom, kde je soubor ulozen a jake ma atributy (jmeno, prava atd.), nebo jde o doplnkovy zaznam k jinemu, nadrazenemu zaznamu - v tom pripade mu chybi atributy $FILE_NAME a $STANDARD_INFORMATION.

$DATA je jeden z atributu MFT zaznamu. Rika, kde na disku lezi bloky, ktere realne obsahuji data toho souboru, jez ten zaznam popisuje.
JirkaVejrazka
Mírně pokročilý

Odeslat příspěvekod JirkaVejrazka 21. 11. 2017 11:12

Jestli ti to pomuze, mrkni se na tohle:

https://github.com/williballenthin/INDX ... le_info.py

a k tomu kod pro parsovani MFT:

https://github.com/williballenthin/INDX ... ter/MFT.py

Je to v Pythonu, coz je pro tohle idealni jazyk - je dobre citelny a muzes si ho jednoduse sam upravovat.
JirkaVejrazka
Mírně pokročilý

Odeslat příspěvekod Fantom007 23. 11. 2017 16:24

Trošičku mě urazilo, že jenom hádám a čekám, jak mi to vyjde. Tak jsem se ujistil, že fragmentované soubory mají v atributu Data pod částmi Data run zaznamenány začátky a délky jednotlivých částí souboru. Takto k nim lze rychle přistupovat. A podobně je to s MFT, pokud je rozdělená na několik částí. V nultém "File recordu" bázové MFT v atributu Data pod částmi Data run jsou zaznamenány začátky a délky jednotlivých částí MFT. Napsal jsem si prográmek v Delphi, otestoval ho na svém a kolegově počítači na systémovém i datovém disku, FileIndexy u začátku i u konce MFT, a pro malé soubory do 700 bytů (rezidentní v MFT) všechno přesně sedí. Takže si nemyslím, že to mám celé špatně. Můj dříve uvedený příklad je taky dobře. Mohu zaslat zdroják i přeložený program. Ale stejně oceňuji snahu pomoci a děkuji.
(Omlouvám se, že píšu až teď, ale neměl jsem vůbec čas).
Fantom007
Junior

Odeslat příspěvekod JirkaVejrazka 23. 11. 2017 18:09

OK, omlouvam se. Kniha se o tom nezminovala, ale ted jsem trochu pohledal online a MFT muze byt ulozena ve vice castech. Nemelo by se to stavat casto, ale stat se to muze.

Mea culpa.
JirkaVejrazka
Mírně pokročilý


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků