Récupérer la preuve de binaires supprimés depuis Amcache
La caractéristique la plus sous-estimée d'Amcache.hve est qu'elle survit aux binaires qu'elle enregistre. Un attaquant supprime un outil dès qu'il n'en a plus besoin. Le snapshot Amcache du chemin, du hash, de l'éditeur, de la version et du moment d'inventaire de ce binaire persiste typiquement dans la ruche des semaines ou des mois après.
Cette page est le workflow pratique quand le binaire a disparu et que la ruche est tout ce que vous avez.
Pour le contexte d'artefact, voir la Référence Amcache complète. Pour le contexte de comparaison, voir Amcache vs Prefetch et Amcache vs Shimcache.
Pourquoi Amcache survit au binaire#
L'appraiser écrit le snapshot d'inventaire une fois par passe. Une fois qu'une entrée est dans Root\InventoryApplicationFile, elle reste dans la ruche jusqu'à :
- Une passe ultérieure de l'appraiser la supprime activement (exception, pas règle), ou
- La ruche elle-même est supprimée ou expire.
En pratique, sur une station Windows 11, les entrées persistent des mois même après la disparition du binaire. Sur des stations qui tournent longtemps, des entrées de plusieurs années sont routinières.
Cela fait d'Amcache l'artefact post-suppression le plus fiable pour les fichiers PE sous Windows.
Ce que vous récupérez réellement#
Quand un binaire est supprimé, vous perdez typiquement :
- Le binaire lui-même.
- Les timestamps de système de fichiers dans la MFT (peuvent être effacés ou écrasés).
- La capacité de vérifier le hash du binaire directement.
Ce que vous conservez dans Amcache :
| Récupéré | Depuis |
|---|---|
| Chemin complet au moment de l'inventaire | FullPath / LowerCaseLongPath |
| SHA-1 des 31 premiers MiB | Hash (retirez 0000 du FileId) |
| Taille du fichier | Size |
| Link date PE | LinkDate |
| Éditeur | Publisher / PublisherName |
| Chaînes de version | Version, BinFileVersion, ProductVersion |
| Nom de produit | ProductName |
| Identité d'application | ProgramId |
| Quand l'appraiser l'a vu | KeyLastWriteTimestamp |
De quoi soumettre le hash à VirusTotal (voir FileId Amcache expliqué), pivoter le ProgramId entre hôtes (voir Mouvement latéral et pivot par ProgramId), borner dans le temps l'événement de drop via KeyLastWriteTimestamp (voir Horodatages Amcache expliqués), et reconstruire l'identité du binaire même si ses octets ont disparu.
Le workflow post-suppression#
Un workflow reproductible pour "on pense qu'ils ont déposé un outil ici, puis l'ont effacé".
1. Collecter la ruche plus les journaux de transactions#
Copy-Item 'C:\Windows\AppCompat\Programs\Amcache.hve' 'C:\Triage\' -Force
Copy-Item 'C:\Windows\AppCompat\Programs\Amcache.hve.LOG1' 'C:\Triage\' -Force
Copy-Item 'C:\Windows\AppCompat\Programs\Amcache.hve.LOG2' 'C:\Triage\' -ForceSi vous soupçonnez que l'attaquant a aussi touché la ruche vivante, énumérez les Volume Shadow Copies et récupérez la copie de chaque cliché. Voir Où se trouve Amcache.hve sur le disque. Sur une station, deux ou trois clichés couvrent typiquement la dernière semaine ou deux. Chacun est une cible de parsing distincte.
2. Parser en multi-passes#
AmcacheParser.exe `
-f 'C:\Triage\Amcache.hve' `
--csv 'C:\Triage\Parsed' `
--csvf 'HOST01_amcache.csv' `
--mpLe flag --mp est critique. Il récupère les entrées orphelines que l'appraiser a dissociées mais pas complètement supprimées. Certaines sont exactement les lignes "fraîchement supprimées" que vous cherchez.
3. Filtrer les PE non signés suspects dans des chemins inscriptibles par l'utilisateur#
Filtre de triage standard, avec une modification : laissez tomber toute vérification que FullPath existe sur le disque, parce que ce n'est plus le cas.
Import-Csv 'C:\Triage\Parsed\HOST01_amcache_UnassociatedFileEntries.csv' |
Where-Object {
$_.IsPeFile -eq 'True' -and
-not $_.Publisher -and
$_.FullPath -match '\\Users\\|\\ProgramData\\|\\AppData\\|\\Temp\\'
} |
Select KeyLastWriteTimestamp, FullPath, Hash, Size, LinkDate |
Sort-Object KeyLastWriteTimestampC'est la liste des binaires déposés (et probablement supprimés) tels que l'appraiser les a vus.
4. Croiser avec le système de fichiers#
Pour chaque ligne, vérifiez si le fichier existe encore :
$rows = Import-Csv ... | Where-Object { ... }
$rows | ForEach-Object {
$exists = Test-Path -LiteralPath $_.FullPath
[pscustomobject]@{
Path = $_.FullPath
Hash = $_.Hash
SeenAt = $_.KeyLastWriteTimestamp
OnDisk = $exists
}
} | Where-Object { -not $_.OnDisk }Les lignes où OnDisk = False sont vos candidates de binaires supprimés.
5. Enrichir avec VirusTotal#
Hachez tout, soumettez, capturez les résultats. Même un lookup à bas volume contre l'API publique remonte du connu-malveillant sur un hôte infecté typique.
import csv, requests, time
API = 'https://www.virustotal.com/api/v3/files/'
HEADERS = {'x-apikey': '<your-key>'}
with open('deleted_candidates.csv', newline='') as f:
for row in csv.DictReader(f):
h = row['Hash']
if not h:
continue
r = requests.get(API + h, headers=HEADERS)
if r.status_code == 200:
stats = r.json()['data']['attributes']['last_analysis_stats']
if stats.get('malicious', 0) > 0:
print(h, row['Path'], stats)
time.sleep(15)Pour les fichiers de plus de 31 MiB, rappelez-vous que le hash Amcache est un hash de préfixe, pas un hash de fichier complet. Voir FileId Amcache expliqué.
6. Borner le drop dans le temps#
Pour chaque binaire supprimé confirmé-malveillant, prenez KeyLastWriteTimestamp ± 1 heure et tirez de cette fenêtre :
- Toutes les autres lignes Amcache (drivers, périphériques, autres fichiers inventoriés dans la même fenêtre, souvent le reste du toolkit).
- Prefetch (sortie
PECmd). Confirme l'exécution. - Security 4688 / Sysmon 1. Création de processus avec ligne de commande.
- Sysmon 11. File create. Confirme quand le fichier a été écrit.
- Entrées MFT pour
\Users\bob\...\. Corroboration au niveau du système de fichiers. - Entrées du journal USN. L'autre journal de système de fichiers, qui attrape souvent ce que la MFT rate.
On reconstruit typiquement toute la séquence drop + exécution + nettoyage depuis ces jointures, même si le binaire a disparu.
Contre-mesures anti-forensiques#
Quelques techniques d'attaquant précises et comment les détecter.
Drop and delete dans un cycle d'appraiser#
L'attaquant dépose, exécute et supprime dans un seul intervalle d'appraiser (<24h sur les stations). Le binaire peut ne jamais apparaître dans Amcache.
Détection : croiser Prefetch (qui enregistre l'exécution en temps réel et survit à la suppression du binaire) et Sysmon 1 / 11 avec Amcache. Les binaires présents dans Prefetch / Sysmon mais absents d'Amcache sont des drops intra-appraiser.
Modification directe de la ruche#
Un attaquant capable avec admin peut éditer Amcache.hve pour retirer des entrées précises. Inhabituel (fastidieux, la plupart des attaquants ne s'embêtent pas) mais possible.
Détection : parser la ruche vivante ET la version de la ruche dans chaque Volume Shadow Copy. Diff. Les entrées dans les clichés mais absentes de la vivante sont la preuve d'un nettoyage délibéré. Les entrées à des offsets inattendus dans la ruche vivante sont la preuve d'un remaniement.
Sabotage de l'appraiser#
Désactiver la tâche planifiée ou mettre AllowTelemetry à zéro. Stoppe les nouvelles écritures Amcache entièrement. Les anciennes entrées restent jusqu'à expirer. La ruche gèle au moment du sabotage.
Détection : vérifier l'historique de la tâche de l'appraiser dans Microsoft-Windows-TaskScheduler%4Operational.evtx via votre parseur EVTX. Regarder la distribution de KeyLastWriteTimestamp de la ruche. Si elle s'arrête brutalement alors qu'on attendrait des entrées plus récentes, soupçonner un sabotage. Vérifier aussi HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags et HKLM\SOFTWARE\Policies\Microsoft\Windows\DataCollection\AllowTelemetry.
Suppression de la ruche#
L'instrument brut. Windows recrée la ruche à la prochaine passe de l'appraiser, mais les contenus antérieurs sont perdus du système vivant.
Détection : le KeyLastWriteTimestamp le plus ancien de la ruche recréée est bien plus récent qu'attendu. Comparer avec les Volume Shadow Copies et les sauvegardes forensiques, récupérer la ruche précédente depuis les clichés.
Ce qu'Amcache ne peut pas récupérer#
Amcache est bonne. Elle n'est pas magique.
- Le binaire lui-même. Vous avez un hash et des métadonnées, pas les octets.
- La ligne de commande à l'exécution. Utilisez la liste de fichiers Prefetch et 4688 / Sysmon 1.
- Les destinations réseau contactées par le binaire. Utilisez SRUM, les logs firewall, la télémétrie réseau EDR.
- Le contexte utilisateur. Utilisez 4688 / Sysmon 1.
Amcache est un artefact dans le kit post-suppression. Combinez avec les autres pour une reconstruction complète.
Pour aller plus loin#
- Le deep dive Amcache de Yogesh Khatri.
- Maxim Suhanov, Resurrecting deleted registry keys (pour les internals de récupération depuis les journaux de transactions).
- MITRE ATT&CK T1070.009 Clear Persistence.
Liens#
Articles liés
- Où se trouve Amcache.hve sur le disque (et comment le collecter)
Chemin : C:\Windows\AppCompat\Programs\Amcache.hve plus les fichiers .LOG. Toujours les trois. Et la bonne façon de collecter depuis un hôte vivant et depuis des clichés.
- Amcache : la référence forensique complète de la ruche Windows .hve
Amcache est la ruche dans laquelle le Compatibility Appraiser inscrit chaque PE sur disque, avec SHA-1, chemin complet, éditeur, link date et un horodatage d'écriture de clé. La référence, du format à l'usage investigatif.
- FileId Amcache expliqué : le format de hash SHA-1 que Windows stocke
FileId est '0000' plus le SHA-1 des 31 premiers MiB. Retirez le préfixe ou vos lookups VirusTotal ne renvoient silencieusement rien. La référence complète, avec les pièges.
- Volatility et Amcache : extraire la ruche depuis des images mémoire
Un guide pratique pour récupérer Amcache depuis une image mémoire Windows en utilisant Volatility — quand la récupération côté mémoire est la seule option, quels plugins utiliser, et comment passer le relais à AmcacheParser.