Ana içeriğe geç

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

C:\<directory>:$I30:$INDEX_ALLOCATION

$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. CopyOfEntryInUse bunları işaretler. Aynı silinmiş ad slack'te birkaç kez de bulunabilir.
  • Bir indeks girdisindeki zamanlar, girdinin son güncellemesi itibarıyla $FILE_NAME zamanlarıdır. Bunlar, dosyanın $MFT kaydındaki hem $STANDARD_INFORMATION hem de $FILE_NAME zamanlarından farklı olabilir.
  • AllocatedSize ve RealSize da girdinin son güncellemesi itibarıyla geçerlidir ve güncelliğini yitirmiş olabilir.
  • Bir slack girdisinin FileEntry (veya ParentEntry) 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 i30 INDX kayıtlarını okur. Küçük bir dizinin indeksi yalnızca kendi $MFT kaydında ($INDEX_ROOT) bulunur; dosyaları $MFT iç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

  1. Özetteki slack'te bulunan kopya olmayan adlarla başlayın, ardından --slack-only --no-copies ile filtreleyin.
  2. FileEntry değerini $MFT içinde arayın. Aynı FileSequence aynı 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.
  3. Adın ne zaman silindiğini veya yeniden adlandırıldığını öğrenmek için USN Journal içinde arayın.
  4. Zaman damgası manipülasyonu (timestomping) için $FILE_NAME zamanlarını $MFT'deki $STANDARD_INFORMATION zamanlarıyla karşılaştırın.
  5. 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ı