डायरेक्टरी इंडेक्स ($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 के कारण खिसकाया गया।
स्थान और संग्रह¶
$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_NAMEtimes होते हैं। ये file के$MFTrecord के$STANDARD_INFORMATIONऔर$FILE_NAMEदोनों times से भिन्न हो सकते हैं। AllocatedSizeऔरRealSizeभी entry के अंतिम update के समय के होते हैं, और पुराने हो सकते हैं।- किसी slack entry का
FileEntry(याParentEntry) तब अनुपस्थित हो सकता है जब बाद के bytes ने उसे overwrite कर दिया हो। उपस्थित होने पर भी, जिस MFT record का वह नाम लेता है उसका तब से पुनः उपयोग हो चुका हो सकता है: sequence number की तुलना करें। parse-ntfs i30INDX records पढ़ता है। छोटी directory का index केवल उसके$MFTrecord ($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 के नाम देता है।
जाँच की रणनीति¶
- Summary में slack के non-copy नामों से शुरू करें, फिर
--slack-only --no-copiesसे filter करें। $MFTमेंFileEntryखोजें। समानFileSequenceका अर्थ है वही file; अधिक मान का अर्थ है कि record तब से मुक्त हो चुका है, और शायद पुनः उपयोग हुआ है।- यह जानने के लिए कि नाम कब delete या rename हुआ, USN जर्नल में उसे खोजें।
- Timestomping के लिए
$FILE_NAMEtimes की तुलना$MFTके$STANDARD_INFORMATIONtimes से करें। - File का उपयोग कैसे हुआ, यह जानने के लिए Prefetch, LNK, Jump Lists और event logs से correlate करें।
अधिक जानकारी¶
- Microsoft: Master File Table
- libfsntfs: NTFS format documentation
- dfir_ntfs
- INDXRipper
- ys-ntfs-parser (इसके
mftcrate काi30module)