Baszki, komolyan beleőszülök ebbe a szarba. Minden nyamvadt doksi leírja, hogy az NTFS fájlként tárolja a könyvtárakat, csakhogy ez szemenszedett hazugság. A fájloknak van $DATA streamjük, a könyvtáraknak meg nincs, helyette ezt az agyhalott attribútum indexet használják, tehát NEM igaz az, hogy fájlként lennének tárolva.
És sehogy sem jutok dűlőre vele, akárhogy olvasom a doksikat és bújom a forráskódokat, egyszerűen semmi értelme. Itt akadok el:
Szóval fogom az 5. MFT rekordot (ami elvileg a gyökérkönyvtár), abből kibányászom az $INDEX_ROOT attribútumot. Ezt kapom:
90 00 00 00 58 00 00 00 00 04 18 00 00 00 03 00 ....X...........
38 00 00 00 20 00 00 00 24 00 49 00 33 00 30 00 8... ...$.I.3.0.
30 00 00 00 01 00 00 00 00 10 00 00 01 00 00 00 0...............
10 00 00 00 28 00 00 00 28 00 00 00 01 00 00 00 ....(...(.......
00 00 00 00 00 00 00 00 18 00 00 00 03 00 00 00 ................
00 00 00 00 00 00 00 00 80 5c ab 42 1b 2f da 01 .........\.B./..
80 5c ab 42 1b 2f da 01 80 5c ab 42 1b 2f da 01 .\.B./...\.B./..
06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
Menjünk sorról sorra.
1. sor, 5.5.1. MFT attribute header
Attribute type: 0x90 ($INDEX_ROOT)
90 00 00 00 58 00 00 00 00 04 18 00 00 00 03 00 ....X...........
Size: 0x58
Non-resident-flag: 0 (resident)
Name size: 4
Name offset: 0x18
Attribute data flags: 0
Attribute identifier: 3
2. sor, 5.5.2. Resident MFT attribute
Data size: 0x38
38 00 00 00 20 00 00 00 24 00 49 00 33 00 30 00 8... ...$.I.3.0.
Data offset: 0x20
Ezután a parszolást az attrib címe + "Data offset"-nél folytatom, ami jelen esetben a 3. sor. Vagy ezt teljesen rosszul gondolom, és valami egész mást nézek innentől, mint kéne???
3. sor, 8.2. The index root
Attribute type: 0x30 (hát kurvára nem is, ez egyáltalán nem az, hanem az indexed type, jelen esetben $FILE_NAME)
30 00 00 00 01 00 00 00 00 10 00 00 01 00 00 00 0...............
Collation type: 1
Index entry size: 0x1000
Index entry number of cluster blocks: 1
A libfsntfs forrásából azt hámoztam ki, hogy ezt a root header-t mindig követnie kell egy node headernek (de akkor miért nem része az index root struct-nak?), tehát
4. sor, 8.4. The index node header
Index values offset: 0x10 (node headerhöz képesti, ha minden igaz)
10 00 00 00 28 00 00 00 28 00 00 00 01 00 00 00 ....(...(.......
Index node size: 0x28
Allocated index node size: 0x28
Index node flags: 1
Na és itt ezen a ponton kihullik a hajam. A doksi azt írja, hogy "the index node size includes the size of the fix-up values and the alignment padding following it". Ez mégis miről beszél? Az "Index values offset" nem "index value" rekordokra mutat talán (amiben nincs is fix-up)?
Ha jól értelmezem a doksit, akkor most a node header + "Index values offset"-en kell folytatnom, ami jelen esetben az 5. sor.
5. sor, 8.5. The index value
File reference: 0
00 00 00 00 00 00 00 00 18 00 00 00 03 00 00 00 ................
Index value size: 0x18
Index key data size: 0
Index value flags: 3
Ebben nincs semmiféle fix-up. És miért van benne MFT fid 0? Ennek semmi értelme. Hogy jön ide az index entry? A 0-ás fid rohadtul az $MFT, és nem egy INDX kezdetű kluszterre mutató valami.
És hogy kapom meg a következő Index value címét? Akárhogy nézem, sehogy sem jön ki.
- Ha a következő index value a struct mérete után jön, akkor a következő soron kezdődik, akkor az megint fid 0, az Index value size meg 0xab5c lenne, ami biztos nem.
- Ha annak ellenére van értéke, hogy nincs is kulcsa (doksi szerint csak akkor tárolódik érték, ha van kulcs is), akkor +0x18, tehát a 6. sor felénél kéne folytatódnia, ami megint nem jó (kizárt, hogy 0x2f1b42ab5c80 egy fid lenne).
- Ha az "Index value flags" & 1 miatt van benne "Sub node Virtual Cluster Number" is (bár a 0x1da2f1b42ab5c80 nem érvényes VCN), akkor a 7. sornál kéne folytatni, aminél a fid 6 lenne, ami még akár jónak is tűnhet, de ugyancsak nem INDX, hanem a kluszter allokációs bitmap, ami kötve hiszem, hogy szerepelnie kéne bármiféle könyvtárlistában.
Szóval WTF? Hogy a herótba kapok egy könyvtárra mutató MFT fid-ből valami értelmes directoryentry szerű fid+filename párokat?
És mi köze az index value-nak az index node-hoz, és hol kerül képbe az index entry???