Langues: English | 简体中文 | 繁體中文 | 日本語 | 한국어 | Français | Deutsch | Español | Italiano | Русский | العربية
Ce document suit les fonctionnalités planifiées, en cours ou différées par conception.
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, Linuxsvc #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
-
Contraintes de taille / alignement / remplissage — Intégré.
-fdyncode-max-length=,-fdyncode-align=,-fdyncode-pad=s'exécutent à la fin definalizeDynCodeBytes. Le driver rejette les configurations contradictoires (ex. octet de remplissage dans l'ensemble des octets interdits, ou remplissage sans align/max-length). -
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.
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 |
11 interposes en trois couches :
Couche IR (6 interposes, reçoivent ModulePassManager &) :
RunBeforePrep— Avant toute passe dyncodeRunAfterPrep— Après l'unification du linkageRunBeforeInlining— Dernière chance avant AlwaysInlinerRunAfterInlining— IR entièrement aplati en une fonctionRunAfterStackify— Forme IR finale avant codegenRunAfterFinalIR— AprèsAllBlrPass, le tout dernier interpose IR
Couche MIR (3 interposes, reçoivent TargetPassConfig &) :
RunBeforePreEmit— Registres alloués, pseudos CFI/EH encore présentsRunAfterPreEmit— Après le nettoyage deMIRPrepPass, le plus proche des octets finauxRunAfterFinalMIR— Après LLVMaddPreEmitPass2(), juste avant AsmPrinter
Couche flux d'octets (2 interposes, reçoivent SmallVectorImpl<uint8_t> &) :
RunPostExtract— Pré-finalisation, encore traité par réécriteur/encodeur/audit/dimensionnementRunPostFinalize— Post-finalisation, dernier moment avant l'écriture sur disque ; NeverC n'effectue plus aucun audit
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.
- 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.
rustcouzig) n'est pas un objectif du projet.