Dizin İndeksleri ($I30)¶
$I30 nedir¶
Her NTFS dizini, içindeki dosyaların $I30 adlı bir indeksini tutar. Küçük bir dizin bu indeksi
kendi $MFT kaydında ($INDEX_ROOT) tutar; daha büyük bir dizinin ayrıca bir
$INDEX_ALLOCATION:$I30 akışında, genellikle her biri 4.096 bayt olan INDX kayıtları vardır. Her
indeks girdisi, dosyanın $FILE_NAME özniteliğinin NTFS'nin girdiyi en son güncellediği andaki bir
kopyasını içerir: adı, MFT başvurusu, üst dizini, dört zaman damgası ve iki boyut.
Bir dosya silindiğinde veya yeniden adlandırılarak dizinden çıkarıldığında, NTFS onun girdisini
kaldırır ve ondan sonraki girdileri kaydırır. Eski baytlar, sonraki girdiler üzerine yazana kadar
INDX kaydının kullanımdaki girdilerin ötesindeki slack alanında kalır. Index slack, $MFT kaydı
yeniden kullanılmış ve USN Journal kayıtlarının üzerine yazılmış bir dosyanın adını, zamanlarını ve
boyutunu koruyabilir.
En iyi sonuç: index slack'te bulunan bir ad, bir zamanlar
belirtilen $FILE_NAME zamanları ve boyutlarıyla bu dizinin indeksindeydi. Bir slack girdisi, ne
zaman kaldırıldığını ya da silinip silinmediğini, yeniden adlandırılıp adlandırılmadığını veya yeniden
dengeleme sırasında taşınıp taşınmadığını söylemez.
Konum ve toplama¶
$I30 bir NTFS meta verisidir: bir dizinin $I30 akışını dışa aktarabilen, ham erişimi destekleyen
bir adli bilişim aracıyla toplayın (dışa aktarılan dosyalar genellikle $I30 olarak adlandırılır).
Juntei ayrıca bir disk imajında veya ayrılmamış alanda INDX kayıtlarını arayabilir. Slack
girdilerinin ne olduğunu anlayabilmek için aynı birimin $MFT ve $J dosyalarını da toplayın.
Analist için uyarılar¶
- Index slack kısmi ve sırasızdır. Dizin değiştikçe girdilerin üzerine yazılır; bir adın bulunmaması hiçbir şey kanıtlamaz.
- Birçok slack girdisi, girdiler taşınırken geride kalan ve hâlâ kullanımda olan girdilerin
kopyalarıdır.
CopyOfEntryInUsebunları işaretler. Aynı silinmiş ad slack'te birkaç kez de bulunabilir. - Bir indeks girdisindeki zamanlar, girdinin son güncellemesi itibarıyla
$FILE_NAMEzamanlarıdır. Bunlar, dosyanın$MFTkaydındaki hem$STANDARD_INFORMATIONhem de$FILE_NAMEzamanlarından farklı olabilir. AllocatedSizeveRealSizeda girdinin son güncellemesi itibarıyla geçerlidir ve güncelliğini yitirmiş olabilir.- Bir slack girdisinin
FileEntry(veyaParentEntry) değeri, sonraki baytlar üzerine yazdığında eksik olabilir. Mevcut olduğunda, belirttiği MFT kaydı o zamandan beri yeniden kullanılmış olabilir: sıra numarasını karşılaştırın. parse-ntfs i30INDX kayıtlarını okur. Küçük bir dizinin indeksi yalnızca kendi$MFTkaydında ($INDEX_ROOT) bulunur; dosyaları$MFTiçindedir.
Juntei ile ayrıştırma¶
Usage: juntei parse-ntfs i30 <INPUT> [OPTIONS]
Input:
-d, --directory <DIR> Recursively find $I30 files (with $I30 in their name, or starting with an INDX record)
-f, --file <FILE> Parse one $I30 stream, or any file holding INDX records (a disk image, unallocated space)
Filtering:
--slack-only Only the entries found in slack
--no-copies Leave out the slack entries that copy an entry in use
Output:
-o, --output <FILE> Save every entry
-t, --output-type <TYPE> csv, json, or jsonl
juntei parse-ntfs i30 -f 'Users_$I30'
juntei parse-ntfs i30 -d evidence/ -o i30.csv
juntei parse-ntfs i30 -f 'Users_$I30' --slack-only --no-copies -t jsonl
juntei parse-ntfs i30 -f disk.raw -o carved-i30.csv
Özet; INDX kayıtlarını (ve kaçının kısmen yazıldığını), kullanımdaki ve slack'teki girdileri ve kullanımdaki girdilerin birebir kopyası olmayan slack girdilerinin adlarını listeler. Bu adlar silinmiş veya yeniden adlandırılmış dosyalar için adaydır; tek başlarına bir hüküm değildir.
CSV çıktı alanları¶
| Alan | Yorumlama |
|---|---|
SourcePath |
Girdi dosyası; ana bilgisayarları ve dizinleri birbirinden ayırır. |
RecordOffset, EntryOffset |
INDX kaydının ve girdinin, girdi dosyasındaki bayt ofsetleri. Doğrulama ve disk imajlarında bulunan kayıtlar için vazgeçilmezdir. |
RecordVCN, RecordLSN |
Kaydın indeks akışındaki konumu ve $LogFile sıra numarası. |
FromSlack |
Kullanımdaki girdilerin ötesinde bulunan bir girdi için True. |
CopyOfEntryInUse |
Aynı dizin indeksindeki kullanımda olan bir girdiyle aynı ada, ad alanına, dosyaya (biliniyorsa), üst dizine ve zamanlara sahip slack girdisi. Genellikle silinmiş bir dosya değil, girdilerin taşınmasından kalan bir artıktır. |
Filename |
Dizindeki ad. |
Namespace |
win32, dos (8.3 kısa ad), win32_and_dos veya posix. |
FileEntry, FileSequence |
Dosyanın MFT başvurusu. Başlığının üzerine yazılmış bir slack girdisi için boştur. |
ParentEntry, ParentSequence |
Dizinin MFT başvurusu. Üzerine başka baytlar yazıldığında boştur. |
CreatedUTC, ModifiedUTC, MFT-ModifiedUTC, AccessedUTC |
Girdinin son güncellemesi itibarıyla, 100 ns hassasiyetinde $FILE_NAME zamanları. |
AllocatedSize, RealSize |
NTFS'nin girdiye kopyaladığı boyutlar; yukarıdaki uyarılara bakın. |
FileAttributes |
| ile birleştirilmiş öznitelik adları (hidden|archive); bir alt dizin için is_directory. Bu Juntei sürümünün adlandırmadığı bitler onaltılık olarak korunur (0x00800000). |
ReparseValue |
$FILE_NAME içindeki yeniden ayrıştırma (reparse) etiketi veya genişletilmiş öznitelik boyutu. |
Problems |
Kayıttaki hasar; örneğin kısmen yazılmış sektörler. Hasarlı bir kayıttaki girdiler de dikkatle incelenmeyi hak eder. |
JSON/JSONL, aynı alanları snake_case biçiminde içerir; problems bir liste olarak verilir ve
bilinmeyen değerler için null kullanılır.
Slack girdileri nasıl bulunur¶
Slack, girdilerin başladığı her 8 baytlık sınırda taranır: tam girdiler, girdi başlığının üzerine
yazılmış $FILE_NAME öznitelikleri ve slack'in başında, üst dizin başvurusunun üzerine kullanımdaki
girdilerin sonunun yazdığı bir $FILE_NAME aranır. Bir adayın Windows'un yazdığı şeye benzemesi
gerekir: kontrol karakteri veya yol ayırıcı içermeyen geçerli bir UTF-16 ad, 1980 ile 2100 arasında
dört zaman, bilinen bir ad alanı ve bilinen öznitelik bayrakları. 32 biti aşan bir üst dizin başvurusu,
üzerine yazılmış baytlardır ve boş bırakılır.
Her kaydın güncelleme sırası dizisi (update sequence array) uygulanır. Güncelleme sırası değeriyle
bitmeyen bir sektör kısmen yazılmıştır; Juntei kaydı olduğu gibi okur ve bu sektörleri Problems
içinde belirtir.
İnceleme stratejisi¶
- Özetteki slack'te bulunan kopya olmayan adlarla başlayın, ardından
--slack-only --no-copiesile filtreleyin. FileEntrydeğerini$MFTiçinde arayın. AynıFileSequenceaynı dosya anlamına gelir; daha yüksek bir değer ise kaydın o zamandan beri serbest bırakıldığı ve belki yeniden kullanıldığı anlamına gelir.- Adın ne zaman silindiğini veya yeniden adlandırıldığını öğrenmek için USN Journal içinde arayın.
- Zaman damgası manipülasyonu (timestomping) için
$FILE_NAMEzamanlarını$MFT'deki$STANDARD_INFORMATIONzamanlarıyla karşılaştırın. - Dosyanın nasıl kullanıldığını anlamak için Prefetch, LNK, Jump Lists ve olay günlükleriyle ilişkilendirin.
Daha fazla ayrıntı¶
- Microsoft: Master File Table
- libfsntfs: NTFS biçim belgeleri
- dfir_ntfs
- INDXRipper
- ys-ntfs-parser (
mftcrate'inini30modülü)