โปรแกรมที่ติดตั้ง¶
สิ่งที่ Windows เก็บไว้¶
Windows และโปรแกรมติดตั้งบันทึกซอฟต์แวร์ที่ติดตั้งไว้ในรายการหลายรายการในรีจิสทรี แต่ละรายการมีหนึ่งคีย์ ต่อหนึ่งโปรแกรม ผลิตภัณฑ์ ดิสทริบิวชัน หรือแพ็กเกจ และ Juntei ให้หนึ่งระเบียนต่อหนึ่งคีย์
| แหล่งข้อมูล | ไฮฟ์และคีย์ | สิ่งที่เก็บไว้ |
|---|---|---|
uninstall |
SOFTWARE และ NTUSER.DAT …\CurrentVersion\Uninstall\* และ SOFTWARE\Wow6432Node\… |
สิ่งที่ Settings และ Programs and Features แสดง: ชื่อ เวอร์ชัน ผู้เผยแพร่ วันที่ติดตั้ง โฟลเดอร์ คำสั่งถอนการติดตั้ง ขนาด และถูกซ่อนไว้หรือไม่ |
msi_product |
SOFTWARE\Classes\Installer\Products\*, NTUSER.DAT Software\Microsoft\Installer\Products\* |
ผลิตภัณฑ์ของ Windows Installer: ชื่อและเวอร์ชันของผลิตภัณฑ์ ชื่อไฟล์ของแพ็กเกจ และโฟลเดอร์ที่ใช้ติดตั้ง |
app_path |
SOFTWARE และ NTUSER.DAT …\CurrentVersion\App Paths\* |
โปรแกรมที่ Windows เริ่มได้ด้วยชื่อ (Win+R, start tool): พาธของโปรแกรมและโฟลเดอร์ของโปรแกรม |
wsl |
NTUSER.DAT …\CurrentVersion\Lxss\{GUID} |
ดิสทริบิวชันของ Windows Subsystem for Linux: ชื่อ ตำแหน่งของไฟล์หรือดิสก์ และเป็น WSL 1 หรือ 2 |
package |
SOFTWARE …\Appx\AppxAllUserStore |
แอปแบบแพ็กเกจ (Store): ที่จัดเตรียม (provisioned) ไว้สำหรับผู้ใช้ทุกคน ของ Windows เอง ที่อยู่ในสถานะ staged ที่ถูก deprovision และของผู้ใช้แต่ละราย |
ข้อสรุปที่ดีที่สุด: โปรแกรม ผลิตภัณฑ์ หรือแพ็กเกจนี้ถูก ติดตั้ง (หรือลงทะเบียน) บนระบบ สำหรับผู้ใช้ทุกคนหรือสำหรับผู้ใช้รายนี้ วันที่ติดตั้งคือ สิ่งที่โปรแกรมติดตั้งเขียนไว้ ส่วนเวลาเขียนล่าสุดของคีย์คือเวลาที่รายการนั้นเปลี่ยนแปลงครั้งล่าสุด
ตำแหน่ง¶
C:\Windows\System32\config\SOFTWARE
Microsoft\Windows\CurrentVersion\Uninstall\<name or {ProductCode}>
Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\<…> 32-bit programs
Classes\Installer\Products\<packed product code>[\SourceList]
Microsoft\Windows\CurrentVersion\App Paths\<program.exe>
Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore\{Applications,InboxApplications,Staged,Deprovisioned,<SID>,EndOfLife\<SID>}\<package>
C:\Users\<user>\NTUSER.DAT
Software\Microsoft\Windows\CurrentVersion\Uninstall\<…>
Software\Microsoft\Installer\Products\<packed product code>
Software\Microsoft\Windows\CurrentVersion\App Paths\<program.exe>
Software\Microsoft\Windows\CurrentVersion\Lxss\{GUID}
ให้เก็บรวบรวม SOFTWARE, NTUSER.DAT ทุกไฟล์ และ transaction log ของไฟล์เหล่านั้น SYSTEM ระบุชื่อโฮสต์ และ
ProfileList ของ SOFTWARE ให้ SID ของผู้ใช้แต่ละราย
ข้อควรระวังสำหรับนักวิเคราะห์¶
- วันที่ติดตั้งและเวลาของคีย์
InstallDateเป็นวันที่ (ไม่มีเวลา) ที่โปรแกรมติดตั้งเขียนไว้ใน เวลาท้องถิ่น โปรแกรมติดตั้งบางตัวไม่เขียนค่านี้ และบางตัวเขียนในรูปแบบอื่น (เก็บไว้ตามที่เขียนในInstallDateRaw) การอัปเดตอาจเขียนรายการใหม่โดยไม่เปลี่ยนวันที่ หรือเปลี่ยนวันที่ โดยที่โปรแกรมไม่ได้เปลี่ยนแปลงมากนัก: ให้เปรียบเทียบInstallDateกับKeyLastWrittenUTC - ซอฟต์แวร์ที่ถอนการติดตั้งแล้ว โปรแกรมที่ถูกลบอย่างเรียบร้อยจะสูญเสียคีย์ไป ให้ใช้
parse-registry read --recover-deletedสำหรับคีย์Uninstallที่ถูกลบ และใช้ Amcache, Prefetch และ$MFTเพื่อหาร่องรอย ที่หลงเหลืออยู่ - การลงทะเบียนต่อผู้ใช้ รายการใน
NTUSER.DATระบุซอฟต์แวร์ที่ลงทะเบียนไว้สำหรับโปรไฟล์หนึ่ง ขอบเขตนี้ไม่ได้ยืนยันว่าใครเป็นผู้เรียกใช้โปรแกรมติดตั้ง หรือมีการใช้สิทธิ์ผู้ดูแลระบบหรือไม่ - รายการที่ถูกซ่อน
SystemComponentซ่อนรายการจาก Programs and Features และรายการ ที่ไม่มีDisplayName(อัปเดต คอมโพเนนต์) ก็ไม่แสดงเช่นกัน แต่ทั้งหมดจะถูกรายงาน - Product code คีย์
Uninstallที่มีรูปแบบเป็น GUID สามารถจับคู่กับคีย์msi_productแบบ packed ผ่านProductCodeได้ ชื่อที่มีรูปแบบเป็น GUID เพียงอย่างเดียวไม่ได้พิสูจน์ว่า Windows Installer เป็นผู้สร้างรายการนั้น - App Paths เป็นการลงทะเบียนที่ใช้ค้นหาตำแหน่งโปรแกรม ไม่ใช่ระเบียนการเรียกใช้งาน
ค่า
Pathอาจมีไดเรกทอรีค้นหาหลายรายการ และไม่จำเป็นต้องเป็น ไดเรกทอรีที่ติดตั้ง - ผู้เผยแพร่ เป็นเมทาดาทาในรีจิสทรีที่โปรแกรมติดตั้งระบุ ไม่ใช่ข้อมูลลายเซ็นที่ ผ่านการตรวจสอบแล้ว
- สถาปัตยกรรม
Wow6432Nodeเก็บโปรแกรม 32 บิตบน Windows 64 บิต (Architecturex86,Wow64True) รายการอื่นเป็นสถาปัตยกรรมของระบบเอง (ว่างเปล่า) สถาปัตยกรรมของแพ็กเกจ เป็นของแพ็กเกจเอง (x64,neutral, …) - WSL
Versionคือเวอร์ชัน WSL จากFlagsของดิสทริบิวชัน (0x8: ทำงานใน virtual machine ของ WSL 2) ค่าVersionของดิสทริบิวชันเอง (ในDetails) คือเวอร์ชันของ ระบบไฟล์ ซึ่งเป็น 2 บนดิสทริบิวชัน WSL 1 ด้วยBasePathเก็บext4.vhdx(WSL 2) หรือrootfs(WSL 1): ให้เก็บรวบรวมไว้เพื่อตรวจดูข้างใน - แพ็กเกจ รายการ
<SID>คือแพ็กเกจที่ลงทะเบียนไว้สำหรับผู้ใช้แต่ละราย ส่วนใหญ่เป็นของ Windows เอง แพ็กเกจDeprovisionedถูกลบออกสำหรับผู้ใช้ใหม่ ส่วนEndOfLife\<SID>ถูกลบสำหรับผู้ใช้รายนั้น - ค่าที่เสียหาย ตัวเลขที่ผิดรูปแบบ ชนิดของค่าที่ไม่ถูกต้อง และ UTF-16 ที่ไม่ถูกต้องจะถูกรายงานใน
Problemsและเก็บไว้ในDataRawรวมถึงสตริง hex ว่างสำหรับค่าที่มีอยู่แต่มี ศูนย์ไบต์ สตริงว่างที่ไม่มีปัญหาในฟิลด์ตัวเลขที่ไม่บังคับจะถือว่าไม่มีค่า เวอร์ชันของ แพ็กเกจต้องมีส่วนประกอบเลขฐานสิบสี่ส่วน แต่ละส่วนอยู่ในช่วง unsigned 16 บิต คำเตือนระดับไฮฟ์จะยังคงอยู่ใน stderr เมื่อ-tสตรีมระเบียนไปยัง stdout
วิเคราะห์ด้วย Juntei¶
Usage: juntei parse-registry installed-programs <INPUT> [OPTIONS]
Input:
-d, --directory <DIR> Recursively find SOFTWARE and NTUSER.DAT hives
-f, --file <FILE> Parse one SOFTWARE or NTUSER.DAT hive
--log1/--log2 Supply transaction logs explicitly
--no-logs Do not replay logs
Output:
-o, --output <FILE> Save records
-t, --output-type <TYPE> csv, json, or jsonl
juntei parse-registry installed-programs -d evidence/ -o installed.csv
juntei parse-registry installed-programs -d evidence/ -t jsonl \
| jq 'select(.Scope == "user" and .Source != "package")'
ส่วนสรุปแสดงโปรแกรมที่ติดตั้งล่าสุด (ตาม InstallDate) สิ่งที่ผู้ใช้ติดตั้งไว้สำหรับ
ตนเอง และดิสทริบิวชัน WSL
ฟิลด์เอาต์พุต¶
| ฟิลด์ | การตีความ |
|---|---|
Host, SourcePath, HiveType |
โฮสต์ ไฟล์ไฮฟ์ และ SOFTWARE หรือ NTUSER.DAT |
User, UserSID |
ผู้ใช้ของไฮฟ์ผู้ใช้ (โฟลเดอร์โปรไฟล์และ SID จาก ProfileList) หรือผู้ใช้ที่แพ็กเกจถูกแสดงไว้ |
Source, Scope |
รายการ (uninstall, msi_product, app_path, wsl, package) และ machine หรือ user |
Name, Version, Publisher |
DisplayName, DisplayVersion, Publisher; ProductName และ Version ของผลิตภัณฑ์; ชื่อไฟล์โปรแกรมของ App Path; ชื่อและเวอร์ชัน WSL ของดิสทริบิวชัน; ชื่อและเวอร์ชันของแพ็กเกจ |
InstallDate, InstallDateRaw |
InstallDate ในรูปแบบวันที่เมื่อเขียนเป็น YYYYMMDD มิฉะนั้นจะเป็นไปตามที่เขียนไว้ |
KeyLastWrittenUTC |
เวลาที่คีย์ของรายการเปลี่ยนแปลงครั้งล่าสุด |
InstallLocation, InstallSource |
InstallLocation (Path ของ App Path, BasePath ของดิสทริบิวชัน, Path ของแพ็กเกจ); InstallSource (โฟลเดอร์ต้นทางที่ผลิตภัณฑ์ใช้ครั้งล่าสุด) |
Program |
โปรแกรมของ App Path |
UninstallCommand, QuietUninstallCommand |
UninstallString, QuietUninstallString |
SizeKB, SystemComponent, WindowsInstaller |
EstimatedSize เป็น KiB; ถูกซ่อนไว้หรือไม่; ติดตั้งโดย Windows Installer หรือไม่ |
ProductCode |
product code ของ Windows Installer ({GUID}) |
Architecture, WOW64 |
x86 ใต้ Wow6432Node หรือสถาปัตยกรรมของแพ็กเกจ; คีย์อยู่ใต้ Wow6432Node หรือไม่ |
Details |
ข้อมูลเพิ่มเติม: DisplayIcon, ModifyPath, ParentKeyName, ReleaseType, Inno Setup: User (บัญชีที่เรียกใช้โปรแกรมติดตั้ง Inno Setup); PackageCode, PackageName ของผลิตภัณฑ์; Flags, State, DefaultUid, Version, PackageFamilyName, Default ของดิสทริบิวชัน; List, ResourceId, PublisherId ของแพ็กเกจ |
KeyPath |
คีย์ของรายการ |
DataRaw |
ไบต์ (hex) ของค่าที่ไม่ตรงกับสิ่งที่ชื่อระบุ |
TransactionLogStatus, LogsApplied |
บริบทการกู้คืนรีจิสทรี |
Problems |
ค่าที่อ่านไม่ได้หรือไม่ตรงกับสิ่งที่ชื่อระบุ |
กลยุทธ์การตรวจสอบ¶
- เรียงตาม
InstallDateและKeyLastWrittenUTCในช่วงเวลาของเหตุการณ์ และพิจารณาเครื่องมือ การเข้าถึงระยะไกล ไคลเอนต์ tunnelling และการถ่ายโอนไฟล์ โปรแกรมบีบอัดไฟล์ runtime ของภาษาสคริปต์ และเครื่องมือด้านความปลอดภัย - ตรวจทานระเบียนที่มี
Scopeเป็นuser: ซอฟต์แวร์ที่ติดตั้งโดยไม่ใช้สิทธิ์ผู้ดูแลระบบ - ตรวจสอบ
InstallLocation,InstallSourceและUninstallCommandว่าชี้ไปยังโฟลเดอร์ที่ผู้ใช้เขียนได้หรือไม่ (Downloads,AppData,Temp,ProgramData) - มองหาดิสทริบิวชัน WSL และเก็บรวบรวม
BasePathของดิสทริบิวชันเหล่านั้น - เชื่อมโยงกับ Amcache และ Prefetch (โปรแกรมติดตั้งและโปรแกรมที่ทำงาน),
$MFT(การสร้าง โฟลเดอร์ติดตั้ง) และ Application event log (เหตุการณ์ MsiInstaller)