RELEASE NOTES

What’s new in Babel.

Changes to the engine, licensing tools and Desktop workspace, from the product release notes.

Released March 6, 2026

Version 11.6.0.0

Babel Obfuscator

Released February 20, 2026

Enhancements

  • Babel UI - Rule Navigation: Enhanced rule loading with asynchronous XML parsing and improved UI responsiveness for large rule sets. Added smart rule navigation with a progress overlay and cancel functionality, cross-thread safety fixes, and optimized rule node expansion logic to prevent UI blocking during rule tree operations.
  • Generic Attributes (C# 11): Added support for reading and writing custom attributes with generic type parameters (e.g. MyAttribute<double>). Ported GenericParameterResolver from upstream Mono.Cecil to resolve ElementType.Var in attribute constructor signatures. Fixes NotImplementedException: Unknown primitive type when processing .NET 9.0 assemblies using generic attributes.
  • ByRefLike Generic Constraint (.NET 9): Added GenericParameterAttributes.AllowByRefLikeConstraint (0x0020) and the corresponding GenericParameter.AllowByRefLikeConstraint property to support the allows ref struct generic constraint.
  • Unmanaged Calling Convention: Added MethodCallingConvention.Unmanaged (0x9) to support delegate* unmanaged function pointers.
  • AggressiveOptimization Attribute: Added MethodImplAttributes.AggressiveOptimization (0x0200) and the corresponding MethodDefinition.AggressiveOptimization property.

Bug Fixes

  • WriteCompressedInt32: Rewrote the ECMA-335 compressed signed integer encoding algorithm to match System.Reflection.Metadata. The previous implementation produced incorrect encodings for certain negative values (e.g. -9076), which could corrupt metadata when writing assemblies with specific constant values or custom attribute blobs.
  • Instance vs Static Method Resolution: Fixed MetadataResolver.GetMethod to compare the HasThis flag, so that a static and instance method with the same name and parameter types are no longer treated as identical. This is required for correct resolution of static abstract/virtual interface members (C# 11).
  • AggressiveOptimization Typo: Fixed typo AggressiveOptimizatios → AggressiveOptimization across Mono.Cecil and obfuscator plugin code.
  • MaxStackSize Overwrite (Android/ARM64 Crash): Fixed CodeWriter.ComputeHeader() in Mono.Cecil unconditionally overwriting body.max_stack_size with the computed value, discarding adjustments made by control flow obfuscation algorithms (goto +3, switch +1/2, if +1). On ARM64 CoreCLR (e.g. .NET 10 Android), this caused stack frame corruption manifesting as null parameter values in obfuscated methods. The fix preserves the larger of the computed and algorithm-adjusted values, matching the existing ReplaceCodeWriter behavior.
  • ControlFlowIfAlgorithm Missing MaxStackSize Adjustment: The if-scrambling algorithm was the only control flow algorithm that did not adjust MaxStackSize in its EndMethod. Added +1 adjustment to account for the ldc.i4.0/ldc.i4.1 + brtrue/brfalse pattern it inserts at branch points.
  • ControlFlowGotoAlgorithm Backward Conditional Branch (Android Crash): The goto-scrambling algorithm inserted opaque predicates after lastInstruction with a backward conditional branch (bgt/blt/beq) targeting firstInstruction.Next. On .NET Android (CoreCLR x86_64 interpreter/JIT), these backward conditional branches were misinterpreted as loop back-edges, causing incorrect code generation that manifested as null parameter values. Specifically, the IF+GOTO combination triggered the bug because the GOTO backward conditional branch jumped into the middle of IF-transformed branch patterns. The fix restructures the opaque predicate to be placed between firstInstruction and its successor, making all branches forward-only. This eliminates the backward conditional branch while preserving the same obfuscation strength (decompilers still cannot determine which forward path is taken without evaluating the opaque predicate).
  • .NET Android/iOS Control Flow: Fixed ControlFlowAddMethodToken (token) and ControlFlowStackUnderflow (underflow) not being disabled for .NET Android and iOS assemblies. These features are unsupported on MonoVM, but were only disabled for legacy Xamarin (MonoAndroid/Xamarin.iOS) assemblies. Modern .NET Android/iOS assemblies (e.g. net10.0-android) are classified as .NETCoreApp, which bypassed the Mono-specific disabling logic. The ldtoken dead code inserted by the token option could cause MonoVM's JIT to miscompile methods, resulting in null parameters at runtime.
  • DynamicProxy Stack-Sensitive Methods (.NET 10): Fixed Assembly.GetExecutingAssembly() and Assembly.GetCallingAssembly() returning the wrong assembly when DynamicProxy is enabled. These methods use internal stack walking (StackCrawlMark) to determine the caller's assembly. When proxied through a delegate, the additional stack frames caused .NET 10's runtime to resolve to a different assembly (e.g. System.Private.CoreLib) with an empty Location, making Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) return null. The fix excludes stack-sensitive methods from DynamicProxy processing, preserving direct calls.

Babel Licensing

Bug Fixes

  • Babel UI: Fixed issue where node-locked license keys were not regenerated when the parent activation license expiration date was changed, causing the signed license key to retain stale expiry dates despite the database records being updated.
  • Babel Licensing Service: Fixed issue where the ASCII license key was not regenerated with the updated expiry dates when an activation license expiration date was changed via the Management Controller, causing the signed key to remain stale despite the database being updated correctly.
  • Concurrent License Store Access: Added retry logic for reading and writing to the license store to handle file locking conflicts when multiple processes access the store simultaneously, preventing intermittent "License component not available" errors.