Características generales
Qué hace Babel Obfuscator, dónde se ejecuta y qué protege. Cada sección enlaza con la página que explica cómo configurar la función.
Protege su código y su propiedad intelectual frente a la ingeniería inversa
Babel Obfuscator aplica a un ensamblado compilado varias capas de protección independientes: renombra los símbolos con identificadores sin significado, cifra las cadenas, las constantes y las matrices y los recursos, reescribe el flujo de control de los métodos, oculta los destinos de las llamadas tras proxies dinámicos y puede cifrar cuerpos de método completos para ejecutarlos en una máquina virtual administrada. La aplicación conserva su comportamiento y su interfaz pública; lo que recupera un descompilador ya no es el código fuente que usted escribió.
Las capas se combinan. El renombrado elimina el vocabulario en el que se apoya quien lee el código, el cifrado de cadenas y de valores elimina las pistas que sobreviven al renombrado, la ofuscación del flujo de control elimina la estructura y el cifrado de código elimina el propio código. Aplicadas en conjunto, y de forma selectiva allí donde está la propiedad intelectual, elevan el coste de entender y modificar el ensamblado muy por encima del valor que un atacante puede extraer de él.
Compatible con todo el ecosistema .NET
Babel Obfuscator trabaja en el nivel del IL y de los metadatos, por lo que admite todos los entornos de ejecución y modelos de aplicación que producen ensamblados .NET estándar:
- .NET 10 y todas las versiones anteriores de .NET y .NET Core
- .NET Framework de 2.0 a 4.8
- Aplicaciones de escritorio creadas con WPF, Windows Forms o Avalonia
- .NET MAUI en Android e iOS, y Xamarin
- Blazor y ASP.NET Core
- .NET Standard, UWP, Mono y nanoFramework
Admite código escrito en C#, hasta C# 14, VB.NET y F#, y se adapta a los modos de publicación del SDK moderno: dependiente del framework, autónomo, de archivo único, recortado y NativeAOT. El renombrado de símbolos, el cifrado de cadenas STREAM y la ofuscación del flujo de control, incluido Chained State, sobreviven sin cambios al recorte y a la compilación AOT. Las funciones que dependen de una imagen asignada en memoria o de IL dinámico, como el cifrado de código, el proxy dinámico y la comprobación de manipulación de escritorio, tienen limitaciones documentadas en los destinos MAUI, Blazor y AOT; la página de cada función las indica, y los ejemplos Ofuscar .NET MAUI y Blazor Web App muestran configuraciones que funcionan.
Se ejecuta en Windows, macOS y Linux Ultimate
Todas las ediciones incluyen la herramienta de línea de comandos y la tarea de MSBuild para Windows (paquetes zip). Ejecutar Babel Desktop, o ejecutar Babel en macOS y Linux y dentro de Azure DevOps, GitHub Actions y otros pipelines de compilación de CI similares, requiere la edición Ultimate, o las ediciones Server y Data Center de Babel Licensing, que la incluyen: solo estas contienen los paquetes NuGet de Babel Obfuscator, que ejecutan Babel como herramienta de dotnet en cualquier sistema operativo y lo integran en dotnet build y dotnet publish. La edición Enterprise se limita a la herramienta de línea de comandos para Windows y a la tarea de MSBuild del paquete zip de .NET Framework.
Como la ofuscación trabaja sobre el IL, el sistema operativo del host de compilación no condiciona el destino: un agente de compilación de Windows puede proteger ensamblados publicados para linux-x64, linux-arm64 u osx-arm64, y un contenedor Linux puede proteger una aplicación de escritorio de Windows. Así, los equipos de desarrollo pueden conservar el entorno de compilación que ya tienen.
Cifrado de código y virtualización totalmente administrados
El cifrado de código reescribe el IL de un método en un juego de instrucciones propio, lo cifra y deja en su lugar un código auxiliar (stub) que cede el control a la máquina virtual de Babel (BVM), un entorno de ejecución administrado y ligero incrustado en el ensamblado ofuscado. La BVM descifra y ejecuta el método cuando se le llama. El cuerpo del método deja de existir en el ensamblado en una forma que un descompilador pueda leer, y las instrucciones no se pueden parchear.
La solución es íntegramente administrada: los métodos cifrados no se sustituyen por código nativo de una plataforma concreta, de modo que se conserva el carácter multiplataforma de .NET y el compilador JIT sigue optimizando para la CPU de destino. El código cifrado puede guardarse en archivos de código externos que se despliegan junto con una licencia, o protegerse con una contraseña que se proporciona en tiempo de ejecución, lo que constituye la base de las licencias basadas en funciones. El artículo Vinculación a dongle de hardware muestra cómo vincular el código cifrado a un dispositivo físico. Como tiene un coste de rendimiento, el cifrado de código está pensado para las partes sensibles del código, mientras las demás protecciones cubren el resto.
Reforzado frente a la desofuscación automática Ultimate
La ofuscación clásica vence a un lector humano; una clase de herramientas automáticas puede deshacer parte de ella en una sola pasada, recuperando estáticamente el orden de un método aplanado o leyendo la clave que se encuentra junto a una cadena cifrada. La versión 12.0 añade dos transformaciones diseñadas para ese adversario:
- Chained State aplana un método en torno a un despachador cuyo orden original no puede recuperarse solo con análisis estático. En pruebas internas con un desofuscador automático estándar, los métodos aplanados con el algoritmo
switchordinario se reconstruyeron, mientras que los mismos métodos aplanados conchainquedaron intactos. Emite IL verificable, no añade dependencias en tiempo de ejecución y se ejecuta con una diferencia de pocos puntos porcentuales respecto al aplanamiento ordinario. - El cifrado de cadenas STREAM cifra cada cadena por separado con un cifrado autenticado, la descifra de forma diferida en el primer uso y nunca almacena la clave en línea. Las cadenas idénticas se cifran en bytes distintos, en ningún momento está en claro el conjunto completo de cadenas, y el descifrador totalmente administrado se publica sin cambios con recorte, NativeAOT y modo FIPS.
Detecta la depuración y la manipulación, en escritorio y en dispositivos móviles
El código de protección contra depuración que se inyecta en el ensamblado detecta un depurador asociado y finaliza el proceso o invoca un método suyo. La detección de manipulación comprueba en el arranque que el ensamblado es el que Babel generó: en los destinos de escritorio calcula el hash de la imagen cargada en memoria y lo compara con un hash grabado durante la ofuscación.
A partir de la versión 12.0, la detección de manipulación abarca .NET MAUI, donde la técnica de escritorio no es aplicable. En Android, la aplicación ofuscada compara el certificado con el que se firmó el APK en ejecución con las huellas digitales de firmantes de confianza que usted fija durante la ofuscación, de modo que una aplicación reempaquetada o firmada de nuevo se rechaza. En iOS comprueba su propio identificador del bundle y el identificador de equipo de Apple (Team ID). Ambas comprobaciones inspeccionan el paquete del sistema operativo y no la imagen administrada, por lo que siguen funcionando con recorte y con AOT completo. En todos los casos, la reacción la elige usted: finalizar el proceso, o ejecutar un controlador personalizado que puede registrar el incidente, reducir funciones o avisar a su servidor.
Simplifica el despliegue al combinar e incrustar las dependencias
Combinar e incrustar convierte una aplicación y sus dependencias en un único archivo. La combinación integra en el destino el código de los ensamblados a los que se hace referencia y lo renombra junto con el suyo, de modo que los tipos combinados pueden internalizarse y ofuscarse como una sola unidad, lo que simplifica el despliegue y a la vez reduce la superficie de código legible. La incrustación almacena un ensamblado entero, como un recurso cifrado que se carga en tiempo de ejecución, y sirve para los ensamblados de terceros o con nombre seguro que no deben modificarse. Las dos pueden usarse juntas en el mismo proyecto.
Optimiza el código y los metadatos
Además de proteger, Babel optimiza el ensamblado que genera. La eliminación de código muerto quita los métodos, campos, propiedades y tipos que nunca se usan. Las optimizaciones de metadatos sellan las clases automáticamente y eliminan los atributos personalizados innecesarios, los tipos System.Enum y los metadatos de propiedades y eventos. Las optimizaciones de código integran en línea los métodos y las propiedades pequeños y eliminan los campos const. El resultado es un ensamblado que ocupa menos en disco, se carga más rápido y es más difícil de leer, porque los metadatos en los que se apoya quien hace ingeniería inversa se han reducido a lo que el entorno de ejecución necesita.
Integrado con Visual Studio, MSBuild, NuGet y los servidores de compilación
Babel se ejecuta dentro de la compilación, no después de ella. La tarea Babel de MSBuild ofusca desde Visual Studio y desde cualquier servidor de compilación que ejecute MSBuild, y todas las propiedades de la tarea están documentadas con IntelliSense en el archivo de proyecto. El paquete NuGet Babel.Obfuscator Ultimate va más allá en los proyectos de estilo SDK: una sola referencia de paquete coloca la tarea en el punto adecuado del pipeline de dotnet build y dotnet publish, antes de que el recorte y la compilación AOT reescriban el ensamblado, que es el único orden en el que esos modos de publicación pueden protegerse. Los ejemplos de servidores de compilación abarcan Azure DevOps, GitHub Actions, AppVeyor y App Center, y muestran cómo ejecutar pruebas unitarias sobre el resultado ofuscado; al igual que el paquete NuGet, requieren la edición Ultimate.
Disponible como herramienta de línea de comandos, con un modo compatible con IA
Todo lo que Babel puede hacer está disponible desde la línea de comandos, en Windows, Linux y macOS. Desde la versión 11.7, la herramienta ofrece también un modo compatible con IA para pipelines y agentes: --format=json o --format=ndjson emiten en stdout un flujo de eventos estructurado y con versión mientras los diagnósticos van a stderr, --quiet suprime el banner y falla de inmediato en lugar de pedir datos, y --strict-exit activa códigos de salida semánticos que distinguen entre argumentos no válidos, entrada ausente y errores de ofuscación, de licencia y de firma. La misma opción convierte --help en una descripción legible por máquina de todas las opciones.
Manejado por asistentes de IA mediante MCP
Babel Desktop puede alojar un servidor Model Context Protocol, de modo que un asistente como Claude Code se conecta a la aplicación en ejecución y la maneja: crea un proyecto, añade ensamblados, escribe reglas, elige qué combinar o incrustar, ofusca, lee las advertencias y las estadísticas, descodifica una traza de pila, crea un tema y hace una captura de pantalla para comprobar el resultado. Las herramientas cubren las operaciones que usted realiza con más frecuencia, y hay además herramientas para los ajustes, Babel Licensing y las actualizaciones de la aplicación. En las ediciones Server y Data Center, el mismo servidor gestiona la base de datos de licencias: clientes, productos, pedidos, licencias, claves de firma, y la generación y exportación de licencias.
El servidor está desactivado de forma predeterminada, solo escucha en la dirección de bucle invertido y puede exigir un token de acceso en cada solicitud. Babel Licensing ofrece un servidor MCP independiente para el servicio de licencias alojado.
Descodifica las trazas de pila ofuscadas
El renombrado cambia los nombres que aparecen en las trazas de pila de las excepciones, así que Babel genera un archivo map XML por cada ensamblado ofuscado y proporciona las herramientas para devolver una traza a sus nombres originales. El Descodificador de pila de Babel Desktop y la opción de línea de comandos --stacktrace restauran los nombres originales, con compatibilidad opcional con PDB para los números de línea. Cuando el proxy dinámico está activado, el descodificador indica el método que hay detrás de cada frame puente del proxy y puede ocultar por completo los frames generados por Babel, con lo que queda una traza idéntica a la que produciría la aplicación sin ofuscar. Los archivos map sirven también de base al renombrado entre ensamblados, de modo que una aplicación y sus bibliotecas pueden ofuscarse en compilaciones separadas y aun así coincidir en los símbolos renombrados.
Preparado para FIPS
Los ensamblados protegidos con Babel se ejecutan en hosts en modo FIPS. Las funciones que descifran contenido en tiempo de ejecución, es decir, el cifrado de código, el cifrado de cadenas, el cifrado de recursos y el cifrado de valores y matrices, pueden configurarse para usar un descifrador AES administrado y autónomo, de modo que el entorno de ejecución inyectado nunca depende del proveedor criptográfico de la plataforma y la aplicación se inicia incluso en un contenedor al que le falta el proveedor FIPS de OpenSSL. La página Conformidad con FIPS explica la condición del entorno, la solución que se aplica durante la ofuscación y la que se aplica en el entorno.
Extensible con reglas, atributos y complementos
Cada función puede ajustarse símbolo por símbolo. Las reglas XML seleccionan tipos y miembros por patrón, atributo, visibilidad o herencia, y activan, desactivan o configuran una función para ellos; los atributos personalizados hacen lo mismo desde el código fuente. El agente de ofuscación analiza el ensamblado antes de la ofuscación y genera las reglas que mantienen en funcionamiento la reflexión, la serialización, el enlace de datos y el código dinámico. Para todo lo demás, los complementos escritos en .NET pueden añadir algoritmos de cifrado de cadenas y de valores, esquemas de renombrado personalizados, reglas generadas y transformaciones de código, con ejemplos de código abierto en GitHub como punto de partida.