Compatibilité des applications¶
Ce que Windows conserve¶
Outre le ShimCache (parse-registry shimcache) et Amcache (parse-registry amcache),
les fonctionnalités de compatibilité des applications de Windows conservent les éléments suivants sous
Microsoft\Windows NT\CurrentVersion\AppCompatFlags :
| Source | Ruche et clé | Ce qu'elle montre |
|---|---|---|
layers |
SOFTWARE (et Wow6432Node) et NTUSER.DAT Layers |
Programmes configurés pour s'exécuter avec des couches de compatibilité : RUNASADMIN (toujours en tant qu'administrateur), WIN7RTM, HIGHDPIAWARE, … |
pca_store |
NTUSER.DAT Compatibility Assistant\Store (Windows 8 et versions ultérieures) |
Programmes que l'Assistant Compatibilité des programmes a vu l'utilisateur exécuter |
pca_persisted |
NTUSER.DAT Compatibility Assistant\Persisted (Windows 7) |
La même chose, sous Windows 7 |
cit_module |
SOFTWARE CIT\Module\<module> |
Programmes ayant chargé un module suivi, et date de leur dernier chargement |
cit_system |
SOFTWARE CIT\System (de Windows 7 aux premières versions de Windows 10) |
Chemins de programmes et lignes de commande dans les bases de données CIT compressées |
installed_sdb |
SOFTWARE InstalledSDB\{GUID} |
Bases de données de shims personnalisées installées avec sdbinst : fichier, description, heure d'installation |
custom_sdb |
SOFTWARE Custom\<program> |
Bases de données de shims personnalisées appliquées à chaque programme, avec leurs heures d'installation |
Meilleure conclusion : les couches et les bases de données de shims sont une configuration qui modifie la manière dont un programme s'exécute ; les entrées de l'Assistant Compatibilité des programmes et de CIT montrent qu'un programme s'est exécuté (ou a chargé un module) sous cet utilisateur ou sur ce système.
Les bases de données de shims personnalisées constituent une technique de persistance et d'injection (MITRE ATT&CK T1546.011) : un shim peut charger une DLL dans un programme ou en démarrer un autre chaque fois que le programme s'exécute.
Emplacement¶
C:\Windows\System32\config\SOFTWARE
Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers <program> = <layers>
Microsoft\Windows NT\CurrentVersion\AppCompatFlags\CIT\Module\<module> <program> = FILETIME
Microsoft\Windows NT\CurrentVersion\AppCompatFlags\CIT\System <id> = compressed database
Microsoft\Windows NT\CurrentVersion\AppCompatFlags\InstalledSDB\{GUID} DatabasePath, …
Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Custom\<program.exe> {GUID}.sdb = FILETIME
C:\Users\<user>\NTUSER.DAT
Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers
Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Store
Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Persisted
Collectez SOFTWARE, chaque NTUSER.DAT et leurs journaux de transactions, ainsi que les fichiers .sdb désignés par le chemin d'une base de données
de shims (généralement C:\Windows\AppPatch\Custom\).
Précautions d'analyse¶
-
L'expansion de CIT est bornée. Les valeurs déclarant plus de 64 Mio non compressés sont conservées sous forme d'octets bruts avec un diagnostic. Les compressions malformées et les incohérences de taille sont signalées.
-
Pas d'heure d'exécution pour les entrées de l'Assistant Compatibilité des programmes. Les données
Store(SACP, conservées dansDataRaw) comportent une heure, mais sous Windows 8.1, 10 et 11 elle est identique pour tous les programmes d'une ruche, ainsi que sur les autres systèmes : ce n'est pas l'heure d'exécution du programme. Seule la dernière écriture de la cléStoredate la modification la plus récente. - Les programmes situés sur des supports amovibles sont nommés
SIGN.MEDIA=<id> <path>:Pathest le chemin sur le support, etDetailscontient l'identifiant du support. - Les bases de données CIT sont compressées en LZNT1 et leur structure n'est pas documentée publiquement : Juntei liste les chemins de programmes et lignes de commande trouvés dans chacune, une fois par base de données, sans nombres ni heures. Une ligne de commande constitue un enregistrement à part entière, non rattaché à son programme. Windows 10 et les versions ultérieures conservent peu d'éléments ici.
- Bases de données de shims. Vérifiez chaque enregistrement
custom_sdbetinstalled_sdb: les logiciels légitimes en installent rarement. Le fichier.sdblui-même indique ce que fait le shim. - Les couches définies par un utilisateur ne s'appliquent qu'à cet utilisateur ; celles de
SOFTWAREs'appliquent à tous.RUNASADMINamène un programme à demander une élévation à chaque fois.
Analyser avec Juntei¶
Usage: juntei parse-registry app-compat <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 app-compat -d evidence/ -o appcompat.csv
juntei parse-registry app-compat -d evidence/ -t jsonl \
| jq 'select(.Source == "installed_sdb" or .Source == "custom_sdb")'
La synthèse liste les bases de données de shims personnalisées, les programmes dotés de couches et les dernières utilisations des modules CIT.
Champs de sortie¶
| Champ | Interprétation |
|---|---|
Host, SourcePath, HiveType |
Hôte, fichier de ruche, et SOFTWARE ou NTUSER.DAT. |
User, UserSID |
Nom du dossier de profil d'une ruche utilisateur, et son SID issu de ProfileList du système. |
Source, Scope |
layers, pca_store, pca_persisted, cit_module, cit_system, installed_sdb, custom_sdb ; machine ou user. |
Path |
Le programme (nom de la valeur), un chemin ou une ligne de commande dans une base de données CIT, ou le programme auquel s'applique une base de données de shims. |
Layers |
Les couches de compatibilité, telles qu'écrites (~ RUNASADMIN). |
LastSeenUTC |
Moment où un programme a chargé un module CIT pour la dernière fois. |
SdbGUID, SdbPath, SdbInstalledUTC |
GUID, fichier et heure d'installation d'une base de données de shims. |
Details |
Nom d'un module CIT, nom de valeur d'une base de données CIT, identifiant du support amovible d'un programme (SignMedia), DatabaseDescription et DatabaseType d'une base de données de shims. |
KeyPath, KeyLastWrittenUTC, ValueName, WOW64 |
Provenance de l'enregistrement, date de dernière modification de cette clé, et indication de sa présence sous Wow6432Node. |
DataRaw |
Données SACP de la valeur Store, ou données qui ne sont pas conformes à ce qui est attendu (hexadécimal). |
TransactionLogStatus, LogsApplied |
Contexte de récupération du Registre. |
Problems |
Données qui n'ont pas pu être décodées ou lues. |
Stratégie d'investigation¶
- Examinez chaque base de données de shims personnalisée : son fichier
.sdb, son heure d'installation et les programmes auxquels elle s'applique ; corrélez avecsdbinst.exedans Prefetch, Amcache et les événements de création de processus. - Recherchez, parmi les entrées de l'Assistant Compatibilité des programmes, des programmes situés dans des dossiers accessibles en écriture par l'utilisateur, ainsi que des programmes provenant de supports amovibles.
- Vérifiez
RUNASADMINet les autres couches appliquées à des programmes inhabituels. - Corrélez avec ShimCache, Amcache, BAM, Prefetch et UserAssist pour les heures d'exécution.