Versión 11.6.0.0
Babel Obfuscator
Publicado el 20 de febrero de 2026
Mejoras
- Babel UI - navegación por reglas: Se ha mejorado la carga de reglas con análisis XML asíncrono y mayor capacidad de respuesta de la interfaz para conjuntos de reglas grandes. Se ha añadido una navegación de reglas inteligente con una superposición de progreso y la posibilidad de cancelar, correcciones de seguridad entre hilos y una lógica optimizada de expansión de nodos para evitar que la interfaz se bloquee durante las operaciones sobre el árbol de reglas.
- Atributos genéricos (C# 11): Se ha añadido compatibilidad para leer y escribir atributos personalizados con parámetros de tipo genéricos (por ejemplo,
MyAttribute<double>). Se ha portadoGenericParameterResolverdesde Mono.Cecil original para resolverElementType.Varen las firmas de los constructores de atributos. Corrige elNotImplementedException: Unknown primitive typeal procesar ensamblados de .NET 9.0 que usan atributos genéricos. - Restricción genérica ByRefLike (.NET 9): Se han añadido
GenericParameterAttributes.AllowByRefLikeConstraint(0x0020) y la propiedad correspondienteGenericParameter.AllowByRefLikeConstraintpara admitir la restricción genéricaallows ref struct. - Convención de llamada no gestionada: Se ha añadido
MethodCallingConvention.Unmanaged(0x9) para admitir punteros a funcióndelegate* unmanaged. - Atributo AggressiveOptimization: Se han añadido
MethodImplAttributes.AggressiveOptimization(0x0200) y la propiedad correspondienteMethodDefinition.AggressiveOptimization.
Correcciones de errores
- WriteCompressedInt32: Se ha reescrito el algoritmo de codificación de enteros con signo comprimidos de ECMA-335 para que coincida con
System.Reflection.Metadata. La implementación anterior producía codificaciones incorrectas para ciertos valores negativos (por ejemplo, -9076), lo que podía corromper los metadatos al escribir ensamblados con determinados valores constantes o blobs de atributos personalizados. - Resolución de métodos de instancia frente a estáticos: Se ha corregido
MetadataResolver.GetMethodpara que compare el indicadorHasThis, de modo que un método estático y uno de instancia con el mismo nombre y los mismos tipos de parámetros ya no se traten como idénticos. Esto es necesario para resolver correctamente los miembros de interfaz estáticos abstractos o virtuales (C# 11). - Errata en AggressiveOptimization: Se ha corregido la errata
AggressiveOptimizatios→AggressiveOptimizationen Mono.Cecil y en el código del plugin del ofuscador. - Sobrescritura de MaxStackSize (fallo en Android/ARM64): Se ha corregido que
CodeWriter.ComputeHeader()de Mono.Cecil sobrescribiera incondicionalmentebody.max_stack_sizecon el valor calculado, descartando los ajustes hechos por los algoritmos de ofuscación del flujo de control (goto +3, switch +1/2, if +1). En ARM64 CoreCLR (por ejemplo, .NET 10 Android), esto corrompía el marco de pila y se manifestaba como parámetros nulos en los métodos ofuscados. La corrección conserva el mayor de los dos valores, el calculado y el ajustado por el algoritmo, igual que ya hacíaReplaceCodeWriter. - Falta el ajuste de MaxStackSize en ControlFlowIfAlgorithm: El algoritmo de mezcla de if era el único algoritmo de flujo de control que no ajustaba
MaxStackSizeen suEndMethod. Se ha añadido el ajuste+1para tener en cuenta el patrónldc.i4.0/ldc.i4.1+brtrue/brfalseque inserta en los puntos de bifurcación. - Bifurcación condicional hacia atrás en ControlFlowGotoAlgorithm (fallo en Android): El algoritmo de mezcla de goto insertaba predicados opacos después de
lastInstructioncon una bifurcación condicional hacia atrás (bgt/blt/beq) dirigida afirstInstruction.Next. En .NET Android (CoreCLR x86_64, intérprete y JIT), esas bifurcaciones condicionales hacia atrás se interpretaban como aristas de retorno de bucle, lo que generaba código incorrecto que se manifestaba como parámetros nulos. En concreto, la combinación IF+GOTO disparaba el fallo porque la bifurcación condicional hacia atrás del GOTO saltaba en medio de los patrones de bifurcación transformados por IF. La corrección reestructura el predicado opaco para situarlo entrefirstInstructiony su sucesor, de modo que todas las bifurcaciones van hacia delante. Esto elimina la bifurcación condicional hacia atrás y mantiene la misma fuerza de ofuscación (los descompiladores siguen sin poder determinar qué camino hacia delante se toma sin evaluar el predicado opaco). - Flujo de control en .NET Android/iOS: Se ha corregido que
ControlFlowAddMethodToken(token) yControlFlowStackUnderflow(underflow) no se desactivaran en los ensamblados de .NET Android e iOS. Estas características no son compatibles con MonoVM, pero solo se desactivaban en los ensamblados de Xamarin heredados (MonoAndroid/Xamarin.iOS). Los ensamblados modernos de .NET Android/iOS (por ejemplo,net10.0-android) se clasifican como.NETCoreApp, lo que eludía la lógica de desactivación específica de Mono. El código muertoldtokenque inserta la opción de token podía hacer que el JIT de MonoVM compilara mal los métodos y provocara parámetros nulos en tiempo de ejecución. - Métodos sensibles a la pila con DynamicProxy (.NET 10): Se ha corregido que
Assembly.GetExecutingAssembly()yAssembly.GetCallingAssembly()devolvieran un ensamblado equivocado cuando DynamicProxy está activado. Estos métodos usan el recorrido interno de la pila (StackCrawlMark) para determinar el ensamblado del llamador. Al pasar por un proxy mediante un delegado, los marcos de pila adicionales hacían que el runtime de .NET 10 resolviera a otro ensamblado (por ejemplo,System.Private.CoreLib) con unLocationvacío, con lo quePath.GetDirectoryName(Assembly.GetExecutingAssembly().Location)devolvía null. La corrección excluye los métodos sensibles a la pila del procesamiento de DynamicProxy y conserva las llamadas directas.
Babel Licensing
Correcciones de errores
- Babel UI: Se ha corregido que las claves de licencia node-locked no se regeneraran al cambiar la fecha de caducidad de la licencia de activación padre, con lo que la clave de licencia firmada conservaba fechas de caducidad obsoletas aunque los registros de la base de datos sí se actualizaran.
- Servicio de Babel Licensing: Se ha corregido que la clave de licencia ASCII no se regenerara con las fechas de caducidad actualizadas al cambiar la fecha de caducidad de una licencia de activación desde el controlador de gestión, con lo que la clave firmada quedaba obsoleta aunque la base de datos se actualizara correctamente.
- Acceso concurrente al almacén de licencias: Se ha añadido lógica de reintento para leer y escribir en el almacén de licencias y gestionar así los conflictos de bloqueo de archivos cuando varios procesos acceden al almacén a la vez, lo que evita los errores intermitentes «License component not available».

