ไฮฟ์รีจิสทรีของ Windows¶
ไฮฟ์รีจิสทรีคืออะไร¶
Windows Registry จัดเก็บการกำหนดค่าของระบบและผู้ใช้ไว้ในไฟล์ไฮฟ์แบบไบนารี คีย์ประกอบกันเป็นโครงสร้างต้นไม้ ส่วนค่า (value) ภายใต้คีย์จะเก็บข้อมูลที่มีชนิดกำกับ อาร์ติแฟกต์รีจิสทรีอธิบายการคงอยู่ (persistence) ซอฟต์แวร์ที่ติดตั้ง บริการ บัญชี การกำหนดค่าเครือข่าย กิจกรรมของผู้ใช้ การตั้งค่าความปลอดภัย และสถานะของ Windows แทบทุกส่วน
ตัวอ่านทั่วไป (generic reader) ของ Juntei ถอดรหัสไฮฟ์หลักได้ทุกไฮฟ์ เล่นซ้ำบันทึกธุรกรรม รายงานความเสียหาย และสามารถ กู้คืนเรคคอร์ดที่ถูกลบ/อยู่ใน free cell, cell slack, ข้อมูลตกค้าง (remnant), สถานะก่อนการเล่นซ้ำ และเรคคอร์ดที่มีอยู่เฉพาะในบันทึกธุรกรรม
ข้อสรุปที่ดีที่สุด: ไฮฟ์มีหรือเก็บรักษาสถานะของคีย์/ค่าไว้ในรูปแบบ ที่กู้คืนได้ เวลาเขียนล่าสุดของคีย์แสดงว่าคีย์มีการเปลี่ยนแปลง ไม่ได้บอกว่าค่าใดเปลี่ยนหรือเปลี่ยนเพราะเหตุใด
ไฮฟ์ทั่วไปและตำแหน่ง¶
| ไฮฟ์ | พาธทั่วไป | ตัวอย่างหลักฐาน |
|---|---|---|
SYSTEM |
C:\Windows\System32\config\SYSTEM |
บริการ ไดรเวอร์ control set ชื่อโฮสต์ อุปกรณ์ที่เมานต์ ShimCache |
SOFTWARE |
C:\Windows\System32\config\SOFTWARE |
ซอฟต์แวร์ที่ติดตั้ง TaskCache โปรไฟล์ การกำหนดค่า Windows |
SAM |
C:\Windows\System32\config\SAM |
บัญชีภายในเครื่องและเมทาดาทาของบัญชี |
SECURITY |
C:\Windows\System32\config\SECURITY |
นโยบายความปลอดภัยภายในเครื่อง/เมทาดาทาของข้อมูลลับ (ขึ้นอยู่กับสิทธิ์การเข้าถึง) |
DEFAULT |
C:\Windows\System32\config\DEFAULT |
การกำหนดค่าโปรไฟล์ระบบเริ่มต้น |
NTUSER.DAT |
C:\Users\<user>\NTUSER.DAT |
การตั้งค่าของผู้ใช้ Run key, RecentDocs, กิจกรรมของแอปพลิเคชัน |
UsrClass.dat |
%LOCALAPPDATA%\Microsoft\Windows\UsrClass.dat |
shell class, กิจกรรม COM/shell ของผู้ใช้ |
Amcache.hve |
C:\Windows\AppCompat\Programs\Amcache.hve |
รายการแอปพลิเคชัน (ใช้ parse-registry amcache เพื่อให้ได้เอาต์พุตเชิงความหมาย) |
ให้เก็บรวบรวมไฟล์ .LOG, .LOG1 และ .LOG2 ที่อยู่ข้างกันด้วย ไฮฟ์ที่ถูกคัดลอกขณะ Windows ทำงานอยู่อาจอยู่ในสถานะ
dirty บันทึกธุรกรรมมีสถานะที่ commit แล้วซึ่งไฟล์หลักเพียงอย่างเดียวยังไม่สะท้อน
ข้อควรระวังสำหรับนักวิเคราะห์¶
- timestamp การเขียนล่าสุดของคีย์ใช้กับ คีย์ ไม่ใช่ค่าแต่ละค่า
- โดยปกติค่าในรีจิสทรีไม่มี timestamp ของตนเอง
CurrentControlSetเป็นชื่อแทน (alias) ของนักวิเคราะห์/Windows ที่ resolve ผ่านSYSTEM\Selectไม่ใช่ คีย์ที่จัดเก็บอยู่จริง- เรคคอร์ดที่ถูกลบอาจไม่สมบูรณ์ ล้าสมัย ซ้ำกันข้ามแหล่งการกู้คืน หรือถูกเขียนทับ
- เรคคอร์ดที่มีเฉพาะในบันทึกธุรกรรมแสดงสถานะในอดีต/สถานะระหว่างกลาง ให้อธิบาย
recovered_fromด้วย - ผลลัพธ์
absent_valueหมายความว่าคีย์ที่สอบถามมีอยู่ แต่ไม่มีค่านั้นในสถานะที่พาร์สได้ ไม่ได้พิสูจน์ว่าค่านั้นไม่เคยมีอยู่ - สตริง พาธ และบรรทัดคำสั่งเป็นการกำหนดค่า ไม่ใช่หลักฐานว่าการกระทำที่กำหนดไว้ได้ทำงานจริง
- ไฮฟ์ที่อยู่ในสถานะ dirty โดยไม่มีบันทึกที่นำมาใช้ได้ อาจละเว้นหรือแสดงสถานะที่ล้าสมัย
วิเคราะห์ด้วย Juntei¶
Usage: juntei parse-registry read <INPUT> [OPTIONS]
Input:
-d, --directory <DIR> Recursively find primary registry hives
-f, --file <FILE> Parse one hive
--log1 <FILE> Supply first transaction log explicitly
--log2 <FILE> Supply second transaction log explicitly
--no-logs Intentionally read the primary file without replay
Filtering:
-k, --key <PATH> Exact key (case-insensitive)
--key-regex <REGEX> Key-path regular expression
--value <NAME> Exact value name ("" is default)
--value-regex <REGEX> Value-name regular expression
--data-regex <REGEX> Rendered-data regular expression
--timeline-start <DATE> Key last-write lower bound
--timeline-end <DATE> Key last-write upper bound
--recover-deleted Recover deleted and transaction-history records
Output:
-o, --output <FILE> Save CSV/JSON/JSONL
-t, --output-type <TYPE> csv, json, or jsonl
--raw-data Include exact bytes for every value
--qword-as-filetime Also render REG_QWORD as FILETIME
# Inspect one persistence key
juntei parse-registry read -f NTUSER.DAT \
-k 'Software\Microsoft\Windows\CurrentVersion\Run' -o run.csv
# Search allocated and recoverable values for a path/name
juntei parse-registry read -f SYSTEM --recover-deleted \
--data-regex 'powershell|cmd\.exe|users\\public' -t jsonl
# Show raw and decoded data for forensic validation
juntei parse-registry read -f SOFTWARE --raw-data -o software.jsonl -t jsonl
ฟิลด์เอาต์พุต¶
| ฟิลด์ | การตีความ |
|---|---|
Host |
ชื่อโฮสต์ที่ได้จากบริบทของระบบที่มีอยู่ ว่างเมื่อ Juntei ไม่สามารถระบุได้อย่างปลอดภัย |
HiveType |
ประเภทไฮฟ์ที่ตรวจพบ (SYSTEM, SOFTWARE, NTUSER.DAT ฯลฯ) ใช้ในการตีความพาธ |
SourcePath |
ไฮฟ์อินพุตที่แน่นอน จำเป็นเมื่อโหมดไดเรกทอรีรวมหลายโฮสต์/ผู้ใช้เข้าด้วยกัน |
RecordType |
key, value, default_value หรือ absent_value การไม่มีอยู่ใช้กับการสอบถาม/สถานะนั้นเท่านั้น |
KeyPath |
พาธภายใต้ราก (root) ของไฮฟ์ [unknown] ระบุลำดับบรรพบุรุษของรายการที่ถูกลบซึ่ง resolve ไม่ได้ |
KeyLastWrittenUTC |
การแก้ไขครั้งล่าสุดของคีย์โดยรวม ไม่สามารถระบุได้ว่าค่าใดเปลี่ยน |
ValueName |
ชื่อของค่า ว่างสำหรับค่าเริ่มต้น/ค่าที่ไม่มีชื่อ |
ValueType |
ชนิดของรีจิสทรี (REG_SZ, REG_DWORD, REG_BINARY ฯลฯ) ชนิดมีผลต่อการตีความ |
ValueData |
ค่าที่แสดงผลตามชนิด multi-string จะยังเป็นลิสต์ใน JSON |
DataSize |
ขนาดที่ค่าบันทึกไว้ ให้เปรียบเทียบกับไบต์ดิบและ Problems |
ValueDataRaw |
ไบต์ที่แน่นอนเมื่อการถอดรหัสล้มเหลวหรือเมื่อใช้ --raw-data ให้เก็บรักษาไว้เพื่อการตรวจสอบความถูกต้อง |
ValueU64 |
ค่าตัวเลขเต็มของ DWORD/QWORD โดยไม่สูญเสียความแม่นยำแบบ JavaScript |
ValueFiletimeUTC |
การแสดง QWORD เป็น FILETIME (ไม่บังคับ) มีความหมายเฉพาะเมื่อ schema ของคีย์กำหนดให้เป็น FILETIME |
AllocationStatus |
allocated, deleted_complete, deleted_partial, residual_value_only หรือ transaction_log_recovered เป็นตัวกำหนดระดับความเชื่อมั่น |
RecoveredFrom |
free_cell, cell_slack, remnant_data, before_replay หรือรายการในบันทึก เช่น SYSTEM.LOG1#1234 |
TransactionLogStatus |
clean, replayed, unchanged หรือ not_applied สำหรับบริบทของเรคคอร์ด/ไฮฟ์นี้ |
LogsApplied |
ชื่อไฟล์บันทึกธุรกรรมที่ Juntei เล่นซ้ำ ให้บันทึกไว้ในรายงาน |
Problems |
ความเสียหาย cell ที่หายไป ชนิดไม่ตรงกัน ลิสต์/parent ที่ resolve ไม่ได้ หรือข้อจำกัดอื่น ๆ |
การตีความสถานะการกู้คืน¶
| สถานะ | ความหมาย |
|---|---|
deleted_complete |
คีย์/ค่าที่ถูกลบถูกกู้คืนพร้อมพาธ/ข้อมูลที่ทราบครบถ้วน แต่ยังคงเป็นข้อมูลในอดีต ไม่ใช่สถานะที่ใช้งานอยู่ |
deleted_partial |
พาธ ลิสต์ค่า ค่า หรือข้อมูลบางส่วนถูกเขียนทับ/อ่านไม่ได้ อย่าเติมช่องว่างจาก cell ที่ถูกนำกลับมาใช้ใหม่ |
residual_value_only |
ค่าหลงเหลืออยู่โดยไม่มีบริบทของคีย์เพียงพอ KeyPath อาจไม่มี |
transaction_log_recovered |
สถานะมีอยู่เฉพาะในเวอร์ชันก่อนการเล่นซ้ำ/ในบันทึก และไม่มีในเรคคอร์ด allocated/free ปัจจุบัน |
กลยุทธ์การตรวจสอบ¶
- เริ่มต้นด้วยคีย์เชิงความหมายที่แน่นอนเมื่อทราบ ใช้การค้นหาด้วย regex/ข้อมูลเพื่อค้นพบสิ่งใหม่
- ตรวจสอบ
TransactionLogStatus,AllocationStatus,RecoveredFromและProblemsก่อนดูเนื้อหา - ตีความข้อมูลตาม schema ที่มีเอกสารของคีย์
REG_BINARYไม่ได้อธิบายตัวเอง - เชื่อมโยงการกำหนดค่ากับหลักฐานขณะทำงาน (event log, Prefetch, SRUM, บริการ/งานตามกำหนดเวลา)
- เก็บรักษาข้อมูลดิบไว้สำหรับฟิลด์ใหม่หรือฟิลด์ที่มีข้อโต้แย้ง