( bzt | 2023. 12. 16., szo – 06:41 )

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
90 00 00 00 58 00 00 00 00 04 18 00 00 00 03 00 ....X...........
Attribute type: 0x90 ($INDEX_ROOT)
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
38 00 00 00 20 00 00 00 24 00 49 00 33 00 30 00 8... ...$.I.3.0.
Data size: 0x38
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
30 00 00 00 01 00 00 00 00 10 00 00 01 00 00 00 0...............
Attribute type: 0x30 (hát kurvára nem is, ez egyáltalán nem az, hanem az indexed type, jelen esetben $FILE_NAME)
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
10 00 00 00 28 00 00 00 28 00 00 00 01 00 00 00 ....(...(.......
Index values offset: 0x10 (node headerhöz képesti, ha minden igaz)
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
00 00 00 00 00 00 00 00 18 00 00 00 03 00 00 00 ................
File reference: 0
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???