Skip to content

Latest commit

 

History

History
84 lines (60 loc) · 5.21 KB

dyncode-compiler-roadmap.md

File metadata and controls

84 lines (60 loc) · 5.21 KB

Langues: English | 简体中文 | 繁體中文 | 日本語 | 한국어 | Français | Deutsch | Español | Italiano | Русский | العربية

← Compilateur dyncode

Feuille de route

Ce document suit les fonctionnalités planifiées, en cours ou différées par conception.

État actuel

Le pipeline dyncode de NeverC couvre :

  • Pipeline LLVM IR complet avec 11+ passes dédiées
  • Extracteurs COFF / ELF / Mach-O
  • Résolution d'importation Win32 PEB-walk (hash ROR-13, 6 buckets DLL)
  • Abaissement direct des syscalls (Darwin svc #0x80, Linux svc #0 / syscall)
  • Support du mode noyau (Windows, Linux)
  • Audit des octets interdits avec profils configurables
  • SDK de plugins pour réécriteurs d'octets interdits et encodeurs de jeux de caractères
  • Contraintes de taille / alignement / remplissage (-fdyncode-max-length=, -fdyncode-align=, -fdyncode-pad=)
  • 11 interposes d'obfuscation sur les couches IR, MIR et flux d'octets

Terminé (2026-04)

  1. Contraintes de taille / alignement / remplissage — Intégré. -fdyncode-max-length=, -fdyncode-align=, -fdyncode-pad= s'exécutent à la fin de finalizeDynCodeBytes. Le driver rejette les configurations contradictoires (ex. octet de remplissage dans l'ensemble des octets interdits, ou remplissage sans align/max-length).

  2. API Plugin C hors arbre — Interface plugin C ABI pure (NevercPluginAPI.h) pour les passes IR, MIR, Binary et Linker personnalisées. Les plugins s'enregistrent aux 11 points d'accroche dyncode (NEVERC_INTERPOSE_SC_*). SDK à en-tête unique, zéro dépendance LLVM/CRT. Voir la documentation API Plugin.

Planifié — Couche plugin (via interposes)

Ces capacités sont intentionnellement non intégrées. Elles appartiennent à la couche stratégie/obfuscation et sont conçues pour être fournies par des plugins tiers via les interfaces de interposes et de plugins.

Fonctionnalité Point de interpose Notes
Anti-désassemblage RunBeforePreEmit / RunAfterPreEmit / RunAfterFinalMIR Interférence de préfixe d'instruction, réordonnancement de sauts, insertion de déchets
Polymorphisme RunAfterFinalMIR / RunPostExtract Variation de sortie basée sur une graine par compilation
Encodeur par étapes (XOR / RC4 / auto-déchiffrement) RunPostExtract / RunPostFinalize Génération de stub à la compilation + chiffrement de la charge utile
Syscalls indirects (Halos / Tartarus / Recycled Gate) Plugin de niveau IR ou RunPostExtract Scan de gadgets ntdll à l'exécution
Masque de sommeil / usurpation de pile d'appels Plugin de passe IR Motifs Ekko / FOLIAGE / Cronos
Correction ETW / AMSI Plugin de passe IR Séquences de correction à l'exécution
Module stomping / uninterposing Plugin de passe IR Motifs de manipulation mémoire

Résumé des interposes de plugins

11 interposes en trois couches :

Couche IR (6 interposes, reçoivent ModulePassManager &) :

  • RunBeforePrep — Avant toute passe dyncode
  • RunAfterPrep — Après l'unification du linkage
  • RunBeforeInlining — Dernière chance avant AlwaysInliner
  • RunAfterInlining — IR entièrement aplati en une fonction
  • RunAfterStackify — Forme IR finale avant codegen
  • RunAfterFinalIR — Après AllBlrPass, le tout dernier interpose IR

Couche MIR (3 interposes, reçoivent TargetPassConfig &) :

  • RunBeforePreEmit — Registres alloués, pseudos CFI/EH encore présents
  • RunAfterPreEmit — Après le nettoyage de MIRPrepPass, le plus proche des octets finaux
  • RunAfterFinalMIR — Après LLVM addPreEmitPass2(), juste avant AsmPrinter

Couche flux d'octets (2 interposes, reçoivent SmallVectorImpl<uint8_t> &) :

  • RunPostExtract — Pré-finalisation, encore traité par réécriteur/encodeur/audit/dimensionnement
  • RunPostFinalize — Post-finalisation, dernier moment avant l'écriture sur disque ; NeverC n'effectue plus aucun audit

Pipeline de finalisation

Chaque extracteur appelle finalizeDynCodeBytes avant d'écrire le .bin :

applyPostExtractObfuscationInterpose       (C Plugin API: NEVERC_INTERPOSE_SC_POST_EXTRACT)
        |
auditFinalBadBytes                    (audit dur intégré)
        |
applyDynCodeSizing                  (-fdyncode-align/-max-length/-pad)
        |
applyPostFinalizeObfuscationInterpose      (C Plugin API: NEVERC_INTERPOSE_SC_POST_FINALIZE)

Utilisation et exemples de code dans la documentation Plugin API.

Non planifié

  • Frontend multi-langage — NeverC n'accepte que son propre frontend C23. Le pipeline IR est découplé du frontend, mais l'acceptation de bitcode externe (ex. rustc ou zig) n'est pas un objectif du projet.