البرامج المثبتة¶
ما الذي يحتفظ به Windows¶
يسجّل 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)، والملغى تجهيزها (deprovisioned)، وتطبيقات كل مستخدم |
أفضل استنتاج: ثُبّت هذا البرنامج أو المنتج أو الحزمة (أو سُجّل) على النظام، لكل المستخدمين أو لهذا المستخدم. وتاريخ التثبيت هو ما كتبه المثبّت؛ أما آخر كتابة للمفتاح فهي آخر وقت تغيّر فيه الإدخال.
الموقع¶
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، وسجلات المعاملات الخاصة بها. تسمّي SYSTEM المضيف، ويعطي
ProfileList في SOFTWARE معرّف SID لكل مستخدم.
تحذيرات للمحلل¶
- تاريخ التثبيت ووقت المفتاح.
InstallDateتاريخ (دون وقت) يكتبه المثبّت، بالتوقيت المحلي؛ وبعض المثبّتات لا تكتبه، وبعضها يكتبه بتنسيق آخر (يُحتفظ به كما هو مكتوب فيInstallDateRaw). ويمكن لتحديثٍ أن يعيد كتابة الإدخال دون تغيير التاريخ، أو أن يغيّر التاريخ دون أن يتغير البرنامج كثيرًا: قارنInstallDateبـKeyLastWrittenUTC. - البرمجيات التي أُلغي تثبيتها. يفقد البرنامج الذي أُزيل بشكل نظيف مفاتيحه. استخدم
parse-registry read --recover-deletedلاسترداد مفاتيحUninstallالمحذوفة، وAmcache وPrefetch و$MFTللآثار المتبقية. - التسجيلات الخاصة بكل مستخدم. تحدد إدخالات
NTUSER.DATالبرمجيات المسجلة لملف تعريف ما. ولا يثبت هذا النطاق من شغّل المثبّت أو ما إذا كانت صلاحيات المسؤول قد استُخدمت. - الإدخالات المخفية. يخفي
SystemComponentالإدخال من Programs and Features؛ كما لا تُعرض الإدخالات التي لا تحتوي علىDisplayName(التحديثات، والمكونات). ويُبلَّغ عنها جميعًا. - رموز المنتجات. يمكن مطابقة مفتاح
Uninstallعلى شكل GUID بمفتاحmsi_productالمضغوط (packed) عبرProductCode. ولا يثبت الاسم الذي على شكل GUID وحده أن Windows Installer أنشأ الإدخال. - App Paths. هذه تسجيلات تُستخدم لتحديد مواقع البرامج، وليست سجلات تنفيذ. ويمكن أن تحمل القيمة
Pathعدة مجلدات بحث، وليست بالضرورة مجلد التثبيت. - الناشر. هذه بيانات وصفية في سجل Windows يقدّمها المثبّت، وليست معلومات توقيع جرى التحقق منها.
- البنية المعمارية. يحتوي
Wow6432Nodeعلى برامج 32 بت على Windows بنظام 64 بت (Architecturex86،Wow64True)؛ أما الإدخالات الأخرى فهي بالبنية المعمارية للنظام نفسه (فارغة). وبنية الحزمة المعمارية هي بنيتها الخاصة (x64،neutral، …). - WSL.
Versionهو إصدار WSL المأخوذ منFlagsالخاصة بالتوزيعة (0x8: تعمل في الجهاز الافتراضي لـ WSL 2). أما القيمةVersionالخاصة بالتوزيعة نفسها (فيDetails) فهي إصدار نظام ملفاتها، وتكون 2 في توزيعات WSL 1 أيضًا. ويحتويBasePathعلىext4.vhdxالخاص بها (WSL 2) أوrootfs(WSL 1): اجمعه للاطلاع على محتواه. - الحزم. قوائم
<SID>هي الحزم المسجلة لكل مستخدم؛ ومعظمها خاص بـ Windows نفسه. وحزمDeprovisionedأُزيلت للمستخدمين الجدد، وحزمEndOfLife\<SID>أُزيلت لذلك المستخدم. - القيم التالفة. يُبلَّغ عن الأرقام المشوّهة، وأنواع القيم الخاطئة، وUTF-16 غير الصالح في
Problemsويُحتفظ بها فيDataRaw، بما في ذلك سلسلة ست عشرية فارغة لقيمة موجودة بطول صفر بايت. وتُعامل السلسلة الفارغة النظيفة في حقل رقمي اختياري على أنها غائبة. ويجب أن يحتوي إصدار الحزمة على أربعة مكونات عشرية، كل منها ضمن نطاق الأعداد الصحيحة غير الموقعة بطول 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 |
رمز منتج 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 |
البايتات (بالنظام الست عشري) للقيم التي ليست كما تدل عليه أسماؤها. |
TransactionLogStatus، LogsApplied |
سياق استرداد سجل Windows. |
Problems |
القيم التي تعذّرت قراءتها أو التي ليست كما تدل عليه أسماؤها. |
استراتيجية التحقيق¶
- رتّب بحسب
InstallDateوKeyLastWrittenUTCحول وقت الحادث؛ وانظر في أدوات الوصول عن بُعد، وعملاء الأنفاق ونقل الملفات، وأدوات الأرشفة، وبيئات تشغيل البرامج النصية، وأدوات الأمان. - راجع سجلات
Scopeuser: البرمجيات المثبتة دون صلاحيات المسؤول. - افحص
InstallLocationوInstallSourceوUninstallCommandبحثًا عن مجلدات قابلة للكتابة من قِبل المستخدم (Downloads،AppData،Temp،ProgramData). - ابحث عن توزيعات WSL، واجمع
BasePathالخاص بها. - اربط النتائج بـ Amcache وPrefetch (المثبّت والبرنامج قيد التشغيل)، و
$MFT(إنشاء مجلد التثبيت)، وسجل أحداث Application (أحداث MsiInstaller).