Proyectos de ofuscación
Un proyecto de ofuscación reúne los ensamblados que se van a proteger, sus dependencias y los ajustes de cada uno. Babel Desktop lo muestra como un grafo en un diagrama y lo ejecuta con el motor de Babel Obfuscator.
Babel Desktop guarda los proyectos como archivos .babel, el formato de proyecto de MSBuild que usa la tarea de MSBuild. Puede compilar con MSBuild un proyecto guardado en la aplicación, y abrir en la aplicación un proyecto .babel ya existente.
Crear un proyecto
Añadir los ensamblados
Haga clic en Añadir ensamblados en la pantalla de inicio o en + Añadir ensamblado en la barra de herramientas del diagrama (Ctrl+Shift+A, Cmd+Shift+A en macOS), o arrastre ensamblados .NET desde el administrador de archivos hasta el diagrama. Cada ensamblado se convierte en un destino principal: un nodo del diagrama que el motor ofusca.
Conectar las dependencias
Añada los ensamblados que se combinan con un destino, se incrustan en él o a los que este hace referencia, tal como se describe en Dependencias.
Configurar cada destino
Seleccione un nodo y abra el panel de propiedades para editar sus ajustes y sus reglas XML. Consulte Ajustes del destino.
Guardar y ejecutar
Guarde el proyecto con Archivo > Guardar (Ctrl+S, Cmd+S en macOS) y, a continuación, haga clic en Ejecutar proyecto (Ctrl+Enter, Cmd+Enter en macOS). Guardar escribe el archivo .babel abierto y solo pide un nombre de archivo cuando el proyecto es nuevo. Para guardar una copia con otro nombre, use Archivo > Guardar como… (Ctrl+Shift+S, Cmd+Shift+S en macOS).
Para empezar de cero, use Proyecto: nuevo (Ctrl+N) o el botón Nuevo proyecto del diagrama. Proyecto: Abrir reciente…, en la paleta de comandos, vuelve a abrir un proyecto reciente, y el cuadro de diálogo Abrir proyecto se abre en la carpeta del último proyecto abierto. Si el proyecto actual tiene cambios sin guardar, Babel Desktop pregunta si desea descartarlos antes de crear o abrir otro. Si hay una tarea en ejecución, espere antes a que termine.
El diagrama del proyecto
El diagrama muestra cada ensamblado como un nodo. Para desplazarse, arrastre el fondo, gire la rueda del ratón o deslice dos dedos. Para acercar o alejar la vista en torno al puntero, pellizque, o mantenga pulsada Ctrl (Cmd en macOS) mientras gira la rueda. Los botones de zoom y Ajustar vista encuadran el grafo. Arrastre los nodos para ordenarlos, o deje que Ver > Organizar grafo automáticamente (Ctrl+Shift+L, Cmd+Shift+L en macOS) coloque los destinos de izquierda a derecha según el orden de ejecución, con las dependencias de cada destino apiladas a su izquierda. Las posiciones de los nodos se guardan en el archivo de proyecto.



Un destino principal con cuatro ensamblados combinados
Deje el puntero sobre un nodo durante medio segundo, o vaya hasta él con el teclado, para abrir su tarjeta. La tarjeta de un destino principal muestra su estado, su orden de ejecución, cuántos ensamblados combina, incrusta y referencia, sus vínculos de map y la ruta del archivo de entrada. Después de una ejecución muestra también la puntuación de ofuscación.
Dependencias
Los anclajes superior e inferior de un nodo conectan las dependencias. Arrastre desde el anclaje inferior del ensamblado de origen hasta el anclaje superior del destino, o haga clic en los dos anclajes, uno después del otro. Una dependencia nueva recibe uno de estos tres tipos:
| Tipo | Efecto |
|---|---|
| Combinar | El ensamblado de origen se combina con el destino y se ofusca con él; el resultado es un único ensamblado de salida. Consulte Combinación de ensamblados. |
| Incrustar | El ensamblado de origen se almacena como recurso del destino y se carga en tiempo de ejecución. Consulte Incrustación de ensamblados. |
| Referencia | El ensamblado de origen solo se usa para resolver las referencias del destino. |
Babel Desktop elige el tipo por usted. Si el destino hace referencia a la identidad exacta del ensamblado de origen (nombre, versión, configuración regional y token de clave pública), la dependencia nueva es de tipo Combinar; si no, es de tipo Referencia. Para cambiar el tipo, haga clic en la línea de la dependencia, elija Combinar, Incrustar o Referencia en la ventana emergente y haga clic en Aplicar. El comando Ensamblado: añadir dependencia automáticamente… y los comandos Ensamblado: añadir entrada de combinación…, Ensamblado: añadir ensamblado incrustado… y Ensamblado: añadir referencia… de la paleta de comandos añaden dependencias desde un selector de archivos.
Un ensamblado que se usa como entrada de combinación permanece en el diagrama, pero no se ofusca por separado, porque pasa a formar parte del ensamblado con el que se combina.
Orden de ejecución y archivos map
Los anclajes izquierdo y derecho conectan dos destinos para que uno se ejecute antes que el otro. Arrastre desde el anclaje derecho del primer destino hasta el anclaje izquierdo del segundo. Babel Desktop pregunta entonces para qué sirve la conexión:
| Opción | Efecto |
|---|---|
| Solo orden de ejecución | Una conexión de flujo: el destino A se ejecuta antes que el destino B. No se pasa nada de A a B. |
| Pasar el archivo de map | Un vínculo de map, dibujado con la etiqueta MAP: A escribe su archivo map XML de renombrado y B lo lee, de modo que B usa los nombres nuevos de los símbolos públicos de A. A se ejecuta antes que B. Consulte Renombrado entre ensamblados. |
Un vínculo de map activa Generate Map Out File en el primer destino y añade su archivo map a los Map In Files del segundo. Si el primer destino no define ni una ruta de salida ni una ruta para el archivo map, este se escribe en un lugar fijo junto a su archivo de entrada, por ejemplo BabelOut/Library2.dll.map.xml, y así el segundo destino siempre lo encuentra. Los vínculos de map no se guardan aparte: Babel Desktop los deduce de esos dos ajustes, así que un proyecto escrito a mano o con Babel UI también muestra sus vínculos de map.
Cada nodo muestra su paso, es decir, la posición en la que se ejecuta dentro de su flujo. Un flujo es un grupo de destinos unidos entre sí por conexiones de flujo, vínculos de map o dependencias de combinación, incrustación y referencia. Los destinos que no están unidos entre sí forman flujos distintos. Dentro de un flujo, los destinos se ejecutan en el orden de los pasos y, cuando nada lo determina, en el orden del proyecto. Las conexiones de flujo se guardan en el proyecto como dependencias estándar entre destinos de MSBuild.
Babel Desktop rechaza las conexiones de un destino consigo mismo y las conexiones duplicadas, y no admite una conexión que haga que varios destinos se esperen unos a otros. Si los destinos de un proyecto abierto desde el disco esperan cada uno el archivo map del otro, el proyecto se abre igualmente. Babel Desktop muestra un error que indica el ciclo, por ejemplo Library1.dll → Library2.dll → Library1.dll, y el proyecto no se ejecuta hasta que se quite uno de los vínculos. Para quitar una conexión o un vínculo de map, haga clic en él y pulse Delete o Backspace; Esc cancela una conexión en curso o anula la selección.
Reemplazar una entrada
Para que un destino apunte a una compilación nueva de su ensamblado sin perder sus ajustes, seleccione el nodo y ejecute Ensamblado: reemplazar entrada y conservar ajustes… desde la paleta de comandos. Ensamblado: quitar destino seleccionado quita un destino y sus conexiones.
Comandos de configuración
Tres comandos de la paleta de comandos configuran un proyecto en un solo paso. Añada primero los ensamblados y ejecute después el comando que corresponda a su aplicación.



Los comandos de configuración en la paleta de comandos
| Comando | Efecto |
|---|---|
| Ofuscación: configurar combinación en el ensamblado principal | Combina todos los demás destinos con el ensamblado principal, con lo que el proyecto produce un único archivo de salida. El ensamblado principal es el único .exe del proyecto, o el primer destino cuando no hay ninguno o hay más de uno. Un ensamblado que el motor no puede combinar se deja como está. |
| Ofuscación: configurar ofuscación pública (todos los ensamblados) | Prepara un conjunto de ensamblados que se distribuyen juntos para que se renombren sus símbolos públicos. Cada destino recibe una regla XML llamada obfuscate public y escribe su archivo map de renombrado, y un destino que depende de otro lee el archivo map de este mediante un vínculo de map. |
| Ofuscación: establecer nivel… | Aplica al destino seleccionado uno de los tres niveles de protección. |
Los niveles establecen estas opciones y dejan las demás como están:
| Nivel | Protección |
|---|---|
| Ligero | Renombrado de tipos, métodos, campos, propiedades y eventos. El flujo de control, las funciones de cifrado y las protecciones antianálisis quedan desactivados. |
| Equilibrado | Renombrado, ofuscación del flujo de control con el algoritmo goto, cifrado de cadenas y supresión de ILDASM. |
| Máximo | Renombrado, ofuscación del flujo de control con goto, switch, case, if y chained state, cifrado de cadenas con el algoritmo stream, cifrado de valores, cifrado MSIL, detección de manipulación, protección contra depuración y supresión de ILDASM. Cuando la licencia no incluye el algoritmo stream, se usa el cifrado de cadenas predeterminado. |
Los dos comandos de configuración omiten los destinos de tipo paquete (.apk, .appx y .xap). Ninguno de los tres se ejecuta mientras hay una tarea en curso o una edición pendiente de aplicar. Modifican el proyecto abierto y no lo guardan, así que antes puede revisar el resultado en el diagrama y en el panel de propiedades. Si aplica un nivel más bajo después de uno más alto, las protecciones adicionales vuelven a desactivarse.
Ajustes del destino
Seleccione un nodo y haga clic en el botón Propiedades, en la parte superior derecha del diagrama, o pulse Enter sobre un nodo seleccionado, para abrir el panel de propiedades. La pestaña Configuración enumera todas las opciones de Babel Obfuscator del destino seleccionado, agrupadas en Renombrado, Flujo de control, Cifrado de código, Optimización, Firma y protección, Archivos y dependencias, Output & diagnostics y Advanced. Escriba en Buscar un ajuste para filtrar la lista.



El panel de propiedades del destino seleccionado
Los ajustes usan los nombres de las opciones de la tarea de MSBuild, por lo que la referencia de la tarea Babel y las páginas de cada protección describen lo que hacen. Cada opción tiene un control adecuado a su tipo: casillas para los conmutadores, listas para los algoritmos, selectores de archivos y de carpetas para las rutas, y editores para los filtros y los mapas de propiedades.



Ajustes de cifrado de código: cifrado de cadenas, MSIL y de valores
Las opciones compuestas, como Control Flow Obfuscation, muestran un control por cada propiedad. La imagen siguiente muestra los conmutadores del flujo de control. El último, chain, activa el algoritmo chained state de la edición Ultimate.



Propiedades de Control Flow Obfuscation
Las contraseñas, como la de una clave de firma o la de un archivo map, se conservan solo durante la sesión en curso. Nunca se escriben en el archivo de proyecto, así que tendrá que introducirlas de nuevo después de reiniciar. Cuando el motor necesita una contraseña durante una ejecución, Babel Desktop la solicita.
Babel Desktop conserva las partes de un archivo .babel que no edita, como los comentarios, las propiedades personalizadas y las tareas de MSBuild personalizadas. No evalúa las importaciones, las condiciones ni las tareas personalizadas de MSBuild: un proyecto que dependa de ellas debe compilarse con MSBuild.
Archivos map
El grupo Archivos map del panel de propiedades reúne los ajustes de los archivos map del destino seleccionado:
- Escribe su map de renombrado activa o desactiva el archivo map del destino. La ruta que aparece debajo indica dónde se escribe el archivo map, de forma predeterminada junto al ensamblado ofuscado; Cambiar… permite elegir otro archivo.
- Maps de otros destinos enumera los vínculos de map que terminan en este destino. Haga clic en el nombre de un destino para seleccionarlo.
- Otros archivos de map enumera los archivos map que este destino lee y que no escribe ningún destino del proyecto, como el de una biblioteca ofuscada en una compilación anterior. Añadir archivo de map… añade uno y Quitar lo quita.
Reglas XML
La pestaña Reglas XML edita las reglas de ofuscación XML en línea del destino seleccionado. El editor resalta el XML, y Validar lo comprueba con el esquema de reglas de Babel e indica la línea y la columna de cada error. Abrir XML carga un archivo de reglas en el editor, Guardar archivo XML escribe el contenido del editor en un archivo y Aplicar al ensamblado guarda las reglas en el destino. Las reglas en línea se guardan en el archivo de proyecto.



Reglas XML en línea de un destino
Complementos del motor
Los complementos de Babel Obfuscator se definen para cada destino con Complementos del motor: configurar rutas de DLL. Complementos del motor: descubrir nombres de argumentos lee los nombres de los argumentos que declara un complemento, para que pueda rellenarlos. Los complementos son código .NET que se ejecuta dentro del motor, así que use únicamente complementos de su confianza.
Ejecutar el proyecto
Haga clic en Ejecutar proyecto, en la parte superior derecha del diagrama, pulse Ctrl+Enter (Cmd+Enter en macOS) o elija Ejecutar > Ejecutar ofuscación. Salvo que un destino defina su propia ruta de salida, el ensamblado ofuscado se escribe en una carpeta BabelOut junto a cada ensamblado de entrada. Antes de iniciar la ejecución, Babel Desktop comprueba adónde irá la salida. No sobrescribe un ensamblado de entrada, un archivo de claves ni un complemento, y pregunta antes de reemplazar archivos de salida existentes.
El panel Actividad muestra la fase en curso, un indicador de progreso y el registro del motor. La pestaña Registro enumera todos los mensajes que el motor escribe con el Verbose Level del destino, y las advertencias y los errores se recogen además en la pestaña Problemas. Cada nodo de destino indica su estado en el diagrama. Cancelar ejecución detiene la ejecución. Los destinos se ejecutan uno después de otro; cuando un destino falla, los que le siguen no se ejecutan.



Una ejecución completada en el panel Actividad
Después de una ejecución, los botones de la parte superior del panel Actividad abren la carpeta de salida e inician la aplicación ofuscada. Archivo > Mostrar salida en la carpeta y Ejecutar > Ejecutar aplicación ofuscada (Ctrl+F5, Cmd+F5 en macOS) hacen lo mismo. Babel Desktop inicia directamente un ejecutable de Windows, e inicia una aplicación .NET mediante dotnet cuando su archivo .runtimeconfig.json está disponible. No ofrece iniciar una biblioteca.
Puntuación de ofuscación
Después de una ejecución completada, la tarjeta de cada destino muestra una puntuación de ofuscación de 0 a 100, una comprobación rápida de que la ejecución ha aplicado las protecciones esperadas. Deje el puntero sobre el destino para abrir la tarjeta.



La puntuación de ofuscación de un destino que combina cuatro ensamblados
La puntuación suma los puntos de cinco capas de protección. Cada barra muestra los puntos que ha obtenido una capa respecto a su máximo; una puntuación baja indica así qué capa falta.
| Capa | Puntos | Se obtienen por |
|---|---|---|
| Renombrado | 30 | La proporción de símbolos elegibles que se han renombrado |
| Flujo de control | 25 | La proporción de métodos que se han alterado. Los métodos sin bifurcaciones no se tocan, por lo que basta la mitad de los métodos para obtener todos los puntos |
| Cifrado de cadenas | 15 | Las cadenas cifradas |
| Protección del código | 15 | El cifrado MSIL (7), las llamadas mediante proxy dinámico (4) y el cifrado de valores (4) |
| Antianálisis | 15 | La detección de manipulación, la protección contra depuración y la supresión de ILDASM, 5 puntos cada una |
La puntuación se califica como Débil por debajo de 35, Aceptable a partir de 35, Buena a partir de 60 y Sólida a partir de 80. Se calcula con las estadísticas de la última ejecución completada del proyecto. Los ensamblados combinados con un destino cuentan para la puntuación de este y no muestran una propia. Un destino que todavía no se ha ejecutado no muestra puntuación.
La puntuación cuenta las protecciones que ha aplicado una ejecución y no dice nada sobre cuánto tiempo resiste el resultado frente a una herramienta concreta. Una puntuación más baja puede ser la correcta: una biblioteca con una API pública conserva sus nombres públicos, por lo que obtiene menos puntos de renombrado.
Ejecución de flujos en paralelo
Un proyecto con varios flujos independientes, como bibliotecas que no se hacen referencia entre sí, puede ofuscarlos al mismo tiempo. Active Ejecutar en paralelo los flujos independientes en Configuración > Ofuscación y elija cuántos flujos se ejecutan a la vez, de 2 a 4. La opción está desactivada de forma predeterminada.
Cada flujo se ejecuta en su propio proceso del motor y, dentro de un flujo, los destinos siguen ejecutándose en orden. Babel Desktop comprueba todo el proyecto antes de que se inicie ningún flujo, igual que en una ejecución única. Mientras los flujos se ejecutan:
- El indicador de progreso cuenta los destinos completados respecto a los previstos, y cada línea del registro empieza con el nombre de su ensamblado, por ejemplo
[Library1.dll]. - Un destino que falla detiene su propio flujo. Los demás flujos continúan, y la ejecución se da por fallida.
- Cancelar ejecución detiene todos los flujos.
- Cuando varios destinos necesitan la contraseña de un certificado, Babel Desktop las pide de una en una e indica el ensamblado que la necesita.
Cada proceso del motor tarda un par de segundos en iniciarse, por lo que la ejecución en paralelo ahorra tiempo con ensamblados grandes. Un proyecto pequeño puede terminar antes si los destinos se ejecutan uno después de otro. Con una licencia flotante, Babel Desktop ejecuta un flujo cada vez.
Herramientas: advertencias de la tarea, en la paleta de comandos, enumera las advertencias de la ejecución en curso, y Herramientas: referencia de advertencias abre el catálogo de códigos de advertencia del motor, con sus descripciones y una función de búsqueda.



La referencia de advertencias del motor
Resultados de ejecución
Después de una ejecución, el botón Resultados de ejecución de la barra de herramientas del diagrama abre las estadísticas de protección. Elija una ejecución del historial, un ensamblado ofuscado y un informe:
| Informe | Contenido |
|---|---|
| Renombrado | Los tipos, métodos, campos, propiedades y eventos renombrados y totales, con un gráfico de cobertura |
| Flujo de control | Los métodos alterados, las instrucciones de bifurcación insertadas y las iteraciones, con un mapa de árbol por espacio de nombres y tipo y, cuando se recogen las estadísticas completas, la complejidad ciclomática antes y después de la transformación |
| Cifrado de cadenas | El algoritmo de cifrado y las cadenas cifradas por método |
| Cifrado de código | Los métodos cifrados por espacio de nombres y tipo |
| Proxy dinámico | Las llamadas redirigidas mediante proxy y los tipos de delegado por método de destino |
| Optimizaciones | Los contadores de eliminación de código muerto y de optimización |
| Tiempo de ejecución | La duración de cada fase del motor |
Puede buscar en las tablas y ordenarlas, y profundizar en los mapas de árbol desde el espacio de nombres hasta el tipo. Mostrar salida, Mostrar registro del motor y Mostrar datos estadísticos abren la carpeta de salida, el registro completo del motor y el archivo de estadísticas sin procesar de la ejecución. Babel Desktop conserva los resultados de las últimas 30 ejecuciones.



Estadísticas de renombrado



Estadísticas del flujo de control
Los archivos de estadísticas contienen nombres de símbolos originales y valores de cadenas. Manténgalos, igual que los archivos map XML, fuera de la aplicación que distribuye.
Descodificar trazas de pila
Para devolver a sus nombres originales las trazas de pila ofuscadas de una aplicación protegida mediante sus archivos map XML, use el Descodificador de pila.