विषय पर बढ़ें

डायरेक्टरी इंडेक्स ($I30)

$I30 क्या है

हर NTFS directory अपने अंदर की files का एक index रखती है, जिसका नाम $I30 है। छोटी directory इसे अपने $MFT record ($INDEX_ROOT) में रखती है; बड़ी directory में INDX records भी होते हैं, आमतौर पर प्रत्येक 4,096 bytes का, जो एक $INDEX_ALLOCATION:$I30 stream में होते हैं। प्रत्येक index entry में file के $FILE_NAME की एक प्रति होती है: उसका नाम, MFT reference, parent directory, चार timestamps और दो sizes, उस समय के अनुसार जब NTFS ने entry को अंतिम बार update किया था।

जब किसी file को delete किया जाता है या उसका नाम बदलकर उसे directory से बाहर किया जाता है, तो NTFS उसकी entry हटा देता है और उसके बाद की entries को खिसका देता है। पुराने bytes INDX record के slack में, उपयोग में entries के बाद, तब तक बने रहते हैं जब तक बाद की entries उन पर overwrite न कर दें। Index slack किसी ऐसी file का नाम, समय और size सुरक्षित रख सकता है जिसका $MFT record पुनः उपयोग हो चुका हो और जिसके USN Journal records roll over हो चुके हों।

सर्वोत्तम निष्कर्ष: index slack में मिला नाम किसी समय इस directory के index में बताए गए $FILE_NAME times और sizes के साथ मौजूद था। Slack entry यह नहीं बताती कि उसे कब हटाया गया, या उसे delete किया गया, rename किया गया या rebalancing के कारण खिसकाया गया।

स्थान और संग्रह

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

$I30 NTFS metadata है: इसे ऐसे raw-aware forensic tool से संग्रहित करें जो किसी directory का $I30 stream export कर सके (export की गई files का नाम अक्सर $I30 होता है)। Juntei किसी disk image या unallocated space में INDX records भी खोज सकता है। Slack entries क्या थीं, यह जानने के लिए उसी volume का $MFT और $J भी संग्रहित करें।

विश्लेषक के लिए सावधानियाँ

  • Index slack आंशिक और अव्यवस्थित होता है। Directory बदलने के साथ entries overwrite होती रहती हैं; किसी नाम का न मिलना कुछ भी सिद्ध नहीं करता।
  • कई slack entries उन entries की प्रतियाँ होती हैं जो अभी भी उपयोग में हैं, और entries के खिसकने पर पीछे रह जाती हैं। CopyOfEntryInUse उन्हें चिह्नित करता है। एक ही हटाया गया नाम slack में कई बार भी हो सकता है।
  • Index entry के समय, entry के अंतिम update के समय के $FILE_NAME times होते हैं। ये file के $MFT record के $STANDARD_INFORMATION और $FILE_NAME दोनों times से भिन्न हो सकते हैं।
  • AllocatedSize और RealSize भी entry के अंतिम update के समय के होते हैं, और पुराने हो सकते हैं।
  • किसी slack entry का FileEntry (या ParentEntry) तब अनुपस्थित हो सकता है जब बाद के bytes ने उसे overwrite कर दिया हो। उपस्थित होने पर भी, जिस MFT record का वह नाम लेता है उसका तब से पुनः उपयोग हो चुका हो सकता है: sequence number की तुलना करें।
  • parse-ntfs i30 INDX records पढ़ता है। छोटी directory का index केवल उसके $MFT record ($INDEX_ROOT) में होता है; उसकी files $MFT में होती हैं।

Juntei से parse करें

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

Summary INDX records (और उनमें से कितने आंशिक रूप से लिखे गए थे), उपयोग में और slack में entries, तथा उन slack entries के नाम सूचीबद्ध करता है जो उपयोग में entries की हूबहू प्रतियाँ नहीं हैं। ये नाम हटाई गई या rename की गई files के उम्मीदवार हैं, अपने आप में कोई निर्णय नहीं।

CSV आउटपुट fields

Field व्याख्या
SourcePath Input file; hosts और directories में भेद करता है।
RecordOffset, EntryOffset Input में INDX record और entry के byte offsets। सत्यापन और disk images में मिले records के लिए आवश्यक।
RecordVCN, RecordLSN Index stream में record की स्थिति और उसका $LogFile sequence number।
FromSlack उपयोग में entries के बाद मिली entry के लिए True।
CopyOfEntryInUse ऐसी slack entry जिसका नाम, namespace, file (ज्ञात होने पर), parent और times उसी directory index की उपयोग में किसी entry के समान हों। आमतौर पर entries के खिसकने से बचा हुआ अंश, कोई हटाई गई file नहीं।
Filename Directory में नाम।
Namespace win32, dos (8.3 short name), win32_and_dos या posix।
FileEntry, FileSequence File का MFT reference। उस slack entry के लिए खाली जिसका header overwrite हो चुका हो।
ParentEntry, ParentSequence Directory का MFT reference। अन्य bytes द्वारा overwrite होने पर खाली।
CreatedUTC, ModifiedUTC, MFT-ModifiedUTC, AccessedUTC Entry के अंतिम update के समय के $FILE_NAME times, 100 ns तक।
AllocatedSize, RealSize NTFS द्वारा entry में copy किए गए sizes; ऊपर दी गई सावधानियाँ देखें।
FileAttributes | से जुड़े attribute नाम (hidden|archive); subdirectory के लिए is_directory। जिन bits का नाम Juntei का यह संस्करण नहीं देता, वे hexadecimal (0x00800000) में रखे जाते हैं।
ReparseValue $FILE_NAME से reparse tag या extended-attribute size।
Problems Record में क्षति, जैसे आंशिक रूप से लिखे गए sectors। क्षतिग्रस्त record की entries भी सावधानी के साथ समीक्षा योग्य हैं।

JSON/JSONL में यही fields snake_case में होते हैं, जिसमें problems एक list के रूप में और अज्ञात values के लिए null होता है।

Slack entries कैसे खोजी जाती हैं

Slack को हर 8-byte boundary पर, जहाँ entries शुरू होती हैं, scan किया जाता है: पूरी entries के लिए, ऐसे $FILE_NAME attributes के लिए जिनका entry header overwrite हो चुका हो, और slack की शुरुआत में ऐसे $FILE_NAME के लिए जिसके parent reference को उपयोग में entries के अंत ने overwrite कर दिया हो। किसी उम्मीदवार को वैसा ही दिखना चाहिए जैसा Windows लिखता है: control characters या path separators से रहित एक मान्य UTF-16 नाम, 1980 और 2100 के बीच के चार times, एक ज्ञात namespace और ज्ञात attribute flags। 32 bits से आगे का parent reference उस पर overwrite हुए bytes होता है और उसे खाली छोड़ा जाता है।

प्रत्येक record का update sequence array लागू किया जाता है। जो sector update sequence value के साथ समाप्त नहीं होता, वह आंशिक रूप से लिखा गया था; Juntei record को जैसा है वैसा पढ़ता है और Problems में उन sectors के नाम देता है।

जाँच की रणनीति

  1. Summary में slack के non-copy नामों से शुरू करें, फिर --slack-only --no-copies से filter करें।
  2. $MFT में FileEntry खोजें। समान FileSequence का अर्थ है वही file; अधिक मान का अर्थ है कि record तब से मुक्त हो चुका है, और शायद पुनः उपयोग हुआ है।
  3. यह जानने के लिए कि नाम कब delete या rename हुआ, USN जर्नल में उसे खोजें।
  4. Timestomping के लिए $FILE_NAME times की तुलना $MFT के $STANDARD_INFORMATION times से करें।
  5. File का उपयोग कैसे हुआ, यह जानने के लिए Prefetch, LNK, Jump Lists और event logs से correlate करें।

अधिक जानकारी