NOTAS DE LA VERSIÓN

Novedades de Babel.

Cambios en el motor, las herramientas de gestión de licencias y el espacio de trabajo de Desktop, según las notas de la versión del producto.

Publicado el 6 de marzo de 2026

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 portado GenericParameterResolver desde Mono.Cecil original para resolver ElementType.Var en las firmas de los constructores de atributos. Corrige el NotImplementedException: Unknown primitive type al 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 correspondiente GenericParameter.AllowByRefLikeConstraint para admitir la restricción genérica allows ref struct.
  • Convención de llamada no gestionada: Se ha añadido MethodCallingConvention.Unmanaged (0x9) para admitir punteros a función delegate* unmanaged.
  • Atributo AggressiveOptimization: Se han añadido MethodImplAttributes.AggressiveOptimization (0x0200) y la propiedad correspondiente MethodDefinition.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.GetMethod para que compare el indicador HasThis, 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 → AggressiveOptimization en 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 incondicionalmente body.max_stack_size con 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ía ReplaceCodeWriter.
  • Falta el ajuste de MaxStackSize en ControlFlowIfAlgorithm: El algoritmo de mezcla de if era el único algoritmo de flujo de control que no ajustaba MaxStackSize en su EndMethod. Se ha añadido el ajuste +1 para tener en cuenta el patrón ldc.i4.0/ldc.i4.1 + brtrue/brfalse que 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 lastInstruction con una bifurcación condicional hacia atrás (bgt/blt/beq) dirigida a firstInstruction.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 entre firstInstruction y 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) y ControlFlowStackUnderflow (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 muerto ldtoken que 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() y Assembly.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 un Location vacío, con lo que Path.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».