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 deGenericParameterResolverdepuis Mono.Cecil en amont afin de résoudreElementType.Vardans les signatures de constructeurs d'attributs. CorrigeNotImplementedException: Unknown primitive typelors 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é correspondanteGenericParameter.AllowByRefLikeConstraintafin de prendre en charge la contrainte génériqueallows ref struct. - Convention d'appel non managée : Ajout de
MethodCallingConvention.Unmanaged(0x9) afin de prendre en charge les pointeurs de fonctiondelegate* unmanaged. - Attribut AggressiveOptimization : Ajout de
MethodImplAttributes.AggressiveOptimization(0x0200) et de la propriété correspondanteMethodDefinition.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.GetMethodpour qu'il compare l'indicateurHasThis, 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→AggressiveOptimizationdans 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ématiquementbody.max_stack_sizepar 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 deReplaceCodeWriter. - ControlFlowIfAlgorithm : ajustement manquant de MaxStackSize : L'algorithme de brouillage des if était le seul algorithme de flux de contrôle à ne pas ajuster
MaxStackSizedans sonEndMethod. Ajout d'un ajustement de+1pour tenir compte du motifldc.i4.0/ldc.i4.1+brtrue/brfalsequ'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) visantfirstInstruction.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 entrefirstInstructionet 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) etControlFlowStackUnderflow(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 exemplenet10.0-android) sont classés comme.NETCoreApp, ce qui contournait la logique de désactivation propre à Mono. Le code mortldtokeninsé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()etAssembly.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 exempleSystem.Private.CoreLib) avec unLocationvide, 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 ».

