Extension de décompilation WinDbg via LLM


Ce projet est un squelette d'extension WinDbg x64 Windows qui résout une fonction par nom ou adresse, reconstruit une vue déterministe du flux de contrôle et interroge directement un LLM depuis l'extension pour produire du pseudo-code.
Layout
src/extension : DLL d'extension WinDbg et commande !decomp.
src/shared : code JSON, analyseur, protocole et vérificateur partagé par l'extension.
scripts : helpers de construction et de copie de fournisseurs (vendor-copy).
third_party/dbgeng : copie optionnelle de dbgeng.h et dbgeng.lib fournies.
third_party/zydis : arborescence source Zydis stable fournie, utilisée par défaut lorsqu'elle est présente.
Current Scope
- Hypothèses x64 uniquement
- analyse de mémoire en direct via DbgEng
- désassemblage structuré basé sur Zydis pour une récupération stable des mnémoniques/opérandes
- récupération de région de symbole, de déroulement et heuristique de plage de fonctions
- récupération de style SSA-lite pour les arguments de registre entrants, les variables locales de slot de pile, les candidats de fusion et les conditions de branche normalisées
- faits de valeur IR bas niveau avec indices d'utilisation de définition, expressions copie/constante canonisées et marqueurs de définition morte
- faits d'état de valeur au niveau du bloc pour les définitions atteignantes live-in/live-out convergées entre registres et locales de pile
- faits de région de flux de contrôle basés sur les dominants pour les boucles naturelles, candidats if/else, candidats switch, métadonnées d'induction de boucle et métadonnées de plage/défaut de switch
- faits ABI x64 pour les slots shadow/home, deltas de pointeur de pile, reconnaissance de prologue/épilogue, appels sans retour, appels de queue, thunks, candidats de wrapper d'importation et arguments d'appel de registre/pile récupérés
- récupération d'arguments Microsoft x64 compatible SIMD/FP pour
xmm0 à xmm3, avec gardes d'idiome zéro vectoriel pour éviter les faux arguments entrants
- indices de récupération de type pour les valeurs de type pointeur, locales de pile, décalages de champ, tableaux à index scalaire, comparaisons de type enum, tests de drapeaux de bits et candidats vtable
- faits d'idiomes et de motifs de bibliothèque pour les helpers mémoire/chaîne, cookies de sécurité, sondes de pile, allocateurs, initialiseurs d'agrégats et charges globales/importations relatives à RIP
- faits de cible d'appel pour les appels directs, appels indirects de registre/mémoire, candidats d'appel virtuel/décalage vtable, type de retour, modèle de paramètre, effets secondaires, effets mémoire, indices de propriété et confiance
- faits d'obfuscation de style OLLVM pour les répartiteurs d'aplatissement de flux de contrôle, arêtes sémantiques récupérées, arêtes mortes de prédicat opaque et idiomes de substitution d'instruction scalaire
- faits de préparation à la désobfuscation plus contrôle
/deobf:on|off sur le fait que les faits d'obfuscation récupérés peuvent guider la réécriture pseudo-C
- faits de graphe de preuves qui relient les faits d'analyseur à haut signal, PDB et de comportement observé à l'ancrage d'instruction/bloc
- invite refine-first avec squelette de pseudo-code généré par analyseur, résumés conscients du graphe pour les régions CFG, conditions et blocs importants, sélection de faits à haut signal classés et échantillonnage étalé pour les grands ensembles de faits
- liens DML WinDbg pour la navigation d'entrée/bloc de base/preuve/cible d'appel lorsque le callback de sortie prend en charge DML
- modes de résultat séparés pour sortie brève, explication de preuve, faits uniquement, invite de débogage, JSON et style modèle de données
- commutateurs de correction utilisateur pour les indices de non-retour, type, champ et renommage
- faits de politique d'analyse conscients de session pour les sessions live, dump, noyau et de type TTD
- faits de comportement observé du contexte de débogueur actuel, y compris les échantillons d'arguments de registre, les points chauds mémoire et les suggestions de requête TTD lorsqu'elles sont disponibles
- classification de chaîne/globale/IAT relative à RIP et indices de signature de cible d'appel pour l'invite LLM
- prototype conscient PDB chargé, paramètre/local cadré, champ, énumération et indices de ligne source pour l'invite LLM
- appels LLM directs en processus depuis l'extension
- adaptateur HTTP compatible OpenAI ou fallback mock déterministe
- passage de vérificateur sur la sortie LLM
WinDbg Usage
Chargez l'extension depuis la sortie de la construction, puis exécutez !decomp sur un symbole ou une adresse :```text
.load C:\path\to\decomp.dll
!decomp /doctor
!decomp module!FunctionName
!decomp 0x7ffb`12345678
Utilisez `/doctor` lorsque la configuration semble incorrecte ou avant d'activer un fournisseur LLM :```text
!decomp /doctor
!decomp /doctor:net
/doctor ne nécessite pas de cible et n'appelle pas le fournisseur. Il rapporte le chemin de configuration / l'état de chargement, le résumé du fournisseur/modèle/point de terminaison, la présence d'authentification sans secrets, les paramètres de délai/jeton/découpage, le support DML, la classe/qualificateur de session, le type de processeur et les mises en garde PDB.
/doctor:net est accepté comme une demande explicite de vérification réseau, mais signale actuellement que le ping du fournisseur est ignoré. L'extension n'effectue pas de sondage réseau à partir du mode doctor.
- Les valeurs secrètes telles que les clés API, les jetons Bearer, les jetons d'actualisation et les chaînes de requête URL ne sont pas imprimées.
Les cibles peuvent être des symboles publics/privés, des noms de fonctions exportées ou des adresses. Si la cible se résout en une adresse à l'intérieur d'une fonction, l'extension tente de récupérer la plage de la fonction contenante à partir des symboles, des données de déroulement et des heuristiques de flux de contrôle. Mettez des guillemets autour des cibles qui contiennent des espaces :```text
!decomp "my module!Function With Spaces"
Le chemin de commande normal effectue une analyse locale, construit des faits d'analyse, appelle optionnellement le point de terminaison LLM configuré, vérifie la réponse par rapport aux preuves récupérées, et imprime du pseudo-C avec confiance, avertissements et notes d'incertitude :```text
!decomp ntdll!RtlAllocateHeap
!decomp kernel32!Sleep
!decomp game.exe!CheckIntegrity
Normal, brief, and explain output include a compact progress stream even without /verbose. Long LLM runs show local-analysis completion, chunk progress, retry notices, merge start, verification, and the Ctrl+Break cancellation hint. Machine-readable modes such as /view:json, /view:facts, /view:prompt, and /view:data suppress progress lines and DML helper links so scripts receive only the requested payload.