
DLLHijackHunter v2.5.0
Découverte, validation et confirmation automatisées du détournement de DLL. Transformer des erreurs de configuration locales en chemins d’attaque armés et confirmés.
DLLHijackHunter
Par ProjectMerai
Découverte, validation et confirmation automatisées du détournement de DLL sous Windows
De « cette DLL est peut-être détournable » à « un utilisateur standard peut amener SYSTEM à charger ceci — voici la preuve. »
Sommaire
- Vue d'ensemble
- Démarrage rapide
- Fonctionnement
- Ce qu'il détecte
- Réduire les faux positifs
- Vérification : sonde de chargement et canary
- Notation, niveaux et chaînes d'attaque
- Référence d'utilisation
- Sécurité et impact opérationnel
- Compiler depuis les sources
- Laboratoire de test (HijackRange)
- Limitations connues
- Comparaison
Vue d'ensemble
DLLHijackHunter trouve les opportunités de détournement de DLL sur un hôte Windows et s'efforce de les prouver, pas seulement de les lister. Il :
- Découvre chaque emplacement où un binaire est lancé automatiquement — services, tâches planifiées, clés Run, dossiers Startup, serveurs COM, DLL AppInit/AppCert, entrées IFEO et binaires UAC à auto-élévation — et calcule où chaque DLL importée serait recherchée.
- Filtre les emplacements qu'un attaquant ne peut pas réellement exploiter : API sets, KnownDLLs, répertoires dans lesquels un utilisateur standard ne peut pas écrire, processus protégés, et plus encore.
- Vérifie (facultatif) avec le véritable chargeur Windows, en plaçant une DLL sonde bénigne et en vérifiant quelle copie remporte la recherche.
- Confirme (facultatif) en déployant une DLL canary inoffensive, en déclenchant le service/la tâche/l'objet COM, et en enregistrant l'identité sous laquelle il s'est réellement exécuté.
- Note et rapporte chaque constatation selon la confiance et l'impact, et corrèle les constatations en chaînes d'attaque (par exemple utilisateur standard → SYSTEM).
Chaque jugement est rendu du point de vue de l'attaquant — un utilisateur standard non privilégié — que le scanner lui-même s'exécute ou non avec élévation. S'exécuter en tant qu'Administrateur donne à l'outil plus de visibilité (ETW, canary, déclencheurs de service) ; cela ne rend jamais les répertoires protégés inscriptibles et ne gonfle jamais le privilège obtenu.
Démarrage rapide
Téléchargez ou compilez DLLHijackHunter.exe (autonome ; aucune installation de .NET nécessaire), puis depuis une invite élevée :
# Passive, read-only triage: no file drops, no service/task starts
.\DLLHijackHunter.exe --profile safe
# Full static analysis without touching the system, JSON report
.\DLLHijackHunter.exe --profile aggressive --no-canary --no-etw -o report.json
# Static analysis + real-loader verification (writes probe DLLs transiently)
.\DLLHijackHunter.exe --profile aggressive --no-canary --no-etw --verify-load -o report.html
# Everything, including ETW and canary confirmation — lab / authorised targets only
.\DLLHijackHunter.exe --profile aggressive -o report.html
# Focus on one application
.\DLLHijackHunter.exe --target "C:\Program Files\MyApp\app.exe" --no-canary
Antivirus : les DLL canary et probe ne sont pas signées et se comportent comme des charges utiles de détournement, de sorte que Microsoft Defender peut les mettre en quarantaine. L'outil détecte cela et signale ces résultats comme non concluants plutôt que « non détournable ». Sur une machine de test, excluez les répertoires cibles et
%ProgramData%\DLLHijackHunterpour obtenir des résultats définitifs.
Fonctionnement
flowchart TB
subgraph S1["1 · Discovery"]
direction LR
EN["Launch points<br/>services · tasks · Run keys<br/>startup · COM · AutoElevate"] --> PE["PE analysis<br/>imports · delay loads<br/>manifest"] --> SO["Search order<br/>identity-aware PATH"]
ETW["ETW runtime trace<br/>optional, elevated"]
end
subgraph S2["2 · Filter pipeline"]
direction LR
HG["Hard gates<br/>API sets · KnownDLLs<br/>writability"] --> SG["Soft gates<br/>manifest · privilege<br/>PPL · LoadLibraryEx"] --> DD["Dedup and<br/>profile filters"]
end
subgraph S3["3 · Verification (optional)"]
direction LR
LP["Load probe<br/>real Windows loader"] --> CN["Canary<br/>deploy, trigger, confirm"]
end
subgraph S4["4 · Output"]
direction LR
SC["Scoring and tiers"] --> AC["Attack chains"] --> RP["Console · JSON · HTML"]
end
S1 --> S2 --> S3 --> S4
| Phase | Nécessite un administrateur | Modifie le système |
|---|---|---|
| Découverte statique + filtres | Non (l'admin voit davantage) | Non |
| Découverte d'exécution ETW | Oui | Démarre des services à démarrage automatique (jusqu'à 100) et exécute des tâches planifiées (jusqu'à 30) pour provoquer des chargements de DLL |
Sonde de chargement (--verify-load) | Non | Écrit brièvement une DLL sonde bénigne à chaque position candidate, puis la supprime et restaure toute originale |
| Confirmation par canari | Oui | Écrit une DLL canari, arrête/démarre des services, exécute des tâches, active des objets COM, puis nettoie |
Ce qu'il détecte
Types de détournement
| Type | Signification | Remarques |
|---|---|---|
| Fantôme | La DLL n'existe nulle part dans le chemin de recherche | Placez-la n'importe où dans les chemins de recherche du binaire |
| Ordre de recherche | Un répertoire inscriptible est recherché avant la copie légitime | Inclut l'écrasement d'une DLL dans un répertoire inscriptible |
| ENV PATH | Un répertoire inscriptible dans PATH est recherché pour une DLL manquante | Les services sont évalués uniquement par rapport au PATH machine — les entrées PATH de l'utilisateur ne sont jamais recherchées par un service |
| Redirection .local | Redirection <app>.exe.local\<dll> | Signalée uniquement pour les exécutables sans manifeste (ou lorsque IFEO DevOverrideEnable=1) ; le chargeur ignore .local sinon, et il ne redirige jamais les KnownDLLs |
| Side-load (UAC) | Copier un EXE à auto-élévation à côté d'une DLL plantée | Uniquement pour les EXE avec <autoElevate>true</autoElevate> dans leur manifeste. L'auto-élévation exige un emplacement de confiance, donc la copie doit passer cette vérification (par ex. un dossier factice C:\Windows \System32\) |
| AppInit DLLs | AppInit_DLLs pointe vers une DLL inscriptible | Chargée dans chaque processus qui charge user32.dll |
| AppCert DLLs | AppCertDLLs pointe vers une DLL inscriptible | Chargée dans chaque appelant de CreateProcess/WinExec |
Les binaires IFEO Debugger et SilentProcessExit\MonitorProcess sont énumérés et analysés comme tout autre point de lancement. Les détournements basés sur le CWD ne sont pas produits actuellement.
Sous quelle identité s'exécute la cible
Une identité correcte détermine à la fois le verdict d'élévation de privilèges et le score d'impact :