NOTES DE VERSION

Les nouveautés de Babel.

Modifications apportées au moteur, aux outils de gestion des licences et à l’espace de travail Desktop, extraites des notes de version du produit.

Publié le 6 mars 2026

Version 11.6.0.0

Babel Obfuscator

Publié le 20 février 2026

Améliorations

  • Babel UI — navigation dans les règles : Amélioration du chargement des règles par une analyse XML asynchrone et une meilleure réactivité de l'interface pour les grands ensembles de règles. Ajout d'une navigation intelligente dans les règles avec superposition de progression et possibilité d'annuler, corrections de sûreté entre threads, et optimisation de la logique d'expansion des nœuds de règles afin d'éviter le blocage de l'interface pendant les opérations sur l'arbre des règles.
  • Attributs génériques (C# 11) : Ajout de la prise en charge de la lecture et de l'écriture d'attributs personnalisés comportant des paramètres de type génériques (par exemple MyAttribute<double>). Portage de GenericParameterResolver depuis Mono.Cecil en amont afin de résoudre ElementType.Var dans les signatures de constructeurs d'attributs. Corrige NotImplementedException: Unknown primitive type lors du traitement d'assemblies .NET 9.0 utilisant des attributs génériques.
  • Contrainte générique ByRefLike (.NET 9) : Ajout de GenericParameterAttributes.AllowByRefLikeConstraint (0x0020) et de la propriété correspondante GenericParameter.AllowByRefLikeConstraint afin de prendre en charge la contrainte générique allows ref struct.
  • Convention d'appel non managée : Ajout de MethodCallingConvention.Unmanaged (0x9) afin de prendre en charge les pointeurs de fonction delegate* unmanaged.
  • Attribut AggressiveOptimization : Ajout de MethodImplAttributes.AggressiveOptimization (0x0200) et de la propriété correspondante MethodDefinition.AggressiveOptimization.

Corrections de bugs

  • WriteCompressedInt32 : Réécriture de l'algorithme d'encodage ECMA-335 des entiers signés compressés afin qu'il corresponde à System.Reflection.Metadata. L'implémentation précédente produisait des encodages incorrects pour certaines valeurs négatives (par exemple -9076), ce qui pouvait corrompre les métadonnées lors de l'écriture d'assemblies comportant certaines valeurs constantes ou certains blobs d'attributs personnalisés.
  • Résolution des méthodes d'instance et statiques : Correction de MetadataResolver.GetMethod pour qu'il compare l'indicateur HasThis, de sorte qu'une méthode statique et une méthode d'instance de même nom et de mêmes types de paramètres ne soient plus considérées comme identiques. C'est nécessaire à la résolution correcte des membres d'interface statiques abstraits ou virtuels (C# 11).
  • Faute de frappe AggressiveOptimization : Correction de la faute AggressiveOptimizatios → AggressiveOptimization dans Mono.Cecil et dans le code du plug-in de l'obfuscateur.
  • Écrasement de MaxStackSize (plantage Android/ARM64) : Correction de CodeWriter.ComputeHeader() dans Mono.Cecil qui écrasait systématiquement body.max_stack_size par la valeur calculée, annulant les ajustements opérés par les algorithmes d'obfuscation du flux de contrôle (goto +3, switch +1/2, if +1). Sur ARM64 CoreCLR (par exemple .NET 10 Android), cela provoquait une corruption de la trame de pile se manifestant par des valeurs de paramètres nulles dans les méthodes obfusquées. Le correctif conserve la plus grande des deux valeurs, calculée ou ajustée par l'algorithme, conformément au comportement existant de ReplaceCodeWriter.
  • ControlFlowIfAlgorithm : ajustement manquant de MaxStackSize : L'algorithme de brouillage des if était le seul algorithme de flux de contrôle à ne pas ajuster MaxStackSize dans son EndMethod. Ajout d'un ajustement de +1 pour tenir compte du motif ldc.i4.0/ldc.i4.1 + brtrue/brfalse qu'il insère aux points de branchement.
  • ControlFlowGotoAlgorithm : branchement conditionnel arrière (plantage Android) : L'algorithme de brouillage par goto insérait des prédicats opaques après lastInstruction, avec un branchement conditionnel arrière (bgt/blt/beq) visant firstInstruction.Next. Sur .NET Android (interpréteur/JIT CoreCLR x86_64), ces branchements conditionnels arrière étaient interprétés à tort comme des arcs de retour de boucle, entraînant une génération de code incorrecte qui se manifestait par des valeurs de paramètres nulles. Plus précisément, la combinaison IF + GOTO déclenchait le bogue parce que le branchement conditionnel arrière du GOTO sautait au milieu des motifs de branchement transformés par IF. Le correctif restructure le prédicat opaque pour le placer entre firstInstruction et son successeur, rendant tous les branchements exclusivement vers l'avant. Cela élimine le branchement conditionnel arrière tout en préservant la même force d'obfuscation (les décompilateurs ne peuvent toujours pas déterminer quel chemin avant est emprunté sans évaluer le prédicat opaque).
  • Flux de contrôle .NET Android/iOS : Correction de ControlFlowAddMethodToken (token) et ControlFlowStackUnderflow (underflow) qui n'étaient pas désactivés pour les assemblies .NET Android et iOS. Ces fonctionnalités ne sont pas prises en charge sur MonoVM, mais n'étaient désactivées que pour les assemblies Xamarin historiques (MonoAndroid/Xamarin.iOS). Les assemblies .NET Android/iOS modernes (par exemple net10.0-android) sont classés comme .NETCoreApp, ce qui contournait la logique de désactivation propre à Mono. Le code mort ldtoken inséré par l'option token pouvait amener le JIT de MonoVM à mal compiler des méthodes, d'où des paramètres nuls à l'exécution.
  • Méthodes sensibles à la pile et DynamicProxy (.NET 10) : Correction de Assembly.GetExecutingAssembly() et Assembly.GetCallingAssembly() qui renvoyaient le mauvais assembly lorsque DynamicProxy est activé. Ces méthodes déterminent l'assembly appelant par un parcours interne de la pile (StackCrawlMark). Une fois proxifiées par un délégué, les trames de pile supplémentaires amenaient le runtime .NET 10 à résoudre un autre assembly (par exemple System.Private.CoreLib) avec un Location vide, faisant renvoyer null à Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location). Le correctif exclut les méthodes sensibles à la pile du traitement DynamicProxy, préservant les appels directs.

Babel Licensing

Corrections de bugs

  • Babel UI : Correction d'un problème où les clés de licence verrouillées à la machine n'étaient pas régénérées lorsque la date d'expiration de la licence d'activation parente était modifiée, si bien que la clé de licence signée conservait des dates d'expiration périmées alors que les enregistrements en base de données étaient bien mis à jour.
  • Service Babel Licensing : Correction d'un problème où la clé de licence ASCII n'était pas régénérée avec les dates d'expiration mises à jour lorsque la date d'expiration d'une licence d'activation était modifiée via le contrôleur de gestion, si bien que la clé signée restait périmée alors que la base de données était correctement mise à jour.
  • Accès concurrent au magasin de licences : Ajout d'une logique de nouvelle tentative en lecture et en écriture sur le magasin de licences afin de traiter les conflits de verrouillage de fichiers lorsque plusieurs processus accèdent simultanément au magasin, ce qui évite les erreurs intermittentes « License component not available ».