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>). PortedGenericParameterResolverfrom upstream Mono.Cecil to resolveElementType.Varin attribute constructor signatures. FixesNotImplementedException: Unknown primitive typewhen processing .NET 9.0 assemblies using generic attributes. - ByRefLike Generic Constraint (.NET 9): Added
GenericParameterAttributes.AllowByRefLikeConstraint(0x0020) and the correspondingGenericParameter.AllowByRefLikeConstraintproperty to support theallows ref structgeneric constraint. - Unmanaged Calling Convention: Added
MethodCallingConvention.Unmanaged(0x9) to supportdelegate* unmanagedfunction pointers. - AggressiveOptimization Attribute: Added
MethodImplAttributes.AggressiveOptimization(0x0200) and the correspondingMethodDefinition.AggressiveOptimizationproperty.
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.GetMethodto compare theHasThisflag, 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→AggressiveOptimizationacross Mono.Cecil and obfuscator plugin code. - MaxStackSize Overwrite (Android/ARM64 Crash): Fixed
CodeWriter.ComputeHeader()in Mono.Cecil unconditionally overwritingbody.max_stack_sizewith 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 existingReplaceCodeWriterbehavior. - ControlFlowIfAlgorithm Missing MaxStackSize Adjustment: The if-scrambling algorithm was the only control flow algorithm that did not adjust
MaxStackSizein itsEndMethod. Added+1adjustment to account for theldc.i4.0/ldc.i4.1+brtrue/brfalsepattern it inserts at branch points. - ControlFlowGotoAlgorithm Backward Conditional Branch (Android Crash): The goto-scrambling algorithm inserted opaque predicates after
lastInstructionwith a backward conditional branch (bgt/blt/beq) targetingfirstInstruction.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 betweenfirstInstructionand 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) andControlFlowStackUnderflow(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. Theldtokendead 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()andAssembly.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 emptyLocation, makingPath.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.

