Skip to Content
Nueva versión 12 disponible 🎉

Referencia de línea de comandos

La herramienta de línea de comandos de Babel Obfuscator acepta distintas opciones. Cada opción lleva como prefijo un guion doble. En la sección siguiente se describe cada una de las opciones que puede introducir en la línea de comandos.

Varios

Estas opciones se usan normalmente para configurar funciones generales de ofuscación o la forma en que Babel Obfuscator trata el ensamblado de destino.

—help [option]

Si escribe —help sin ningún parámetro, se muestra el menú principal de la ayuda. Cuando se especifica el parámetro [option], Babel muestra la ayuda ampliada del comando indicado. Por ejemplo:

--help strings

Muestra la información siguiente:

stringencryption (nostringencryption, no-stringencryption, string-encryption, no-string-encryption, strings, no-strings) usage: --[no]stringencryption [name] Enable ([no]disable) string encryption (default: disabled) When enabled, all the user strings in the target assembly will be encrypted. The optional parameter name sets the encryption type. hash - Compressed hash table. The strings are arranged into compressed encrypted hash table data. This algorithm ensures tamper protection. xor - Inline xor strings. stream - Authenticated per-string encryption, decrypted lazily. Fully managed (AOT/trim/FIPS safe).

Aparece la lista de alias admitidos para el comando, seguida del uso del comando y de una breve descripción.

Esta opción controla si se muestra el mensaje de copyright de Babel Obfuscator al inicio. El mensaje de copyright no se muestra si se especifica el prefijo opcional [no].

—format <format>

Disponible desde la versión 11.7.0.

Selecciona el formato de salida de stdout. Los valores permitidos son text (predeterminado), json y ndjson. Con json o ndjson, la ejecución produce un flujo estructurado conforme al esquema babel.cli.v1 y los diagnósticos destinados a personas se envían a stderr.

babel myapp.exe --format=json > result.json babel myapp.exe --format=ndjson | jq -c 'select(.level=="error")'

La misma opción cambia también --help y --version a una representación legible por máquina. Consulte la página Modo compatible con IA para ver el esquema, ejemplos y la referencia completa.

—quiet (-q)

Disponible desde la versión 11.7.0.

Suprime el banner con el logotipo y hace que las solicitudes interactivas de contraseña fallen de inmediato con un error explícito, en lugar de quedarse bloqueadas a la espera de una entrada. Es segura para las invocaciones desatendidas o realizadas por agentes.

babel myapp.exe --quiet --keyfile mykey.pfx --keypwd env:KEY_PWD

—strict-exit

Disponible desde la versión 11.7.0.

Activa los códigos de salida semánticos: 0 éxito, 10 argumentos no válidos, 20 entrada no encontrada, 30 fallo de ofuscación, 40 fallo de licencia, 50 fallo de clave o de firma. Sin esta opción se conserva el contrato heredado 0/1. Consulte Modo compatible con IA: —strict-exit para ver la tabla completa y la semántica de exitReason.

—license [path|env]

Cuando no se especifica el argumento opcional, muestra la información de licencia disponible. Opcionalmente puede especificar la ruta del archivo de licencia.

babel --license C:\Babel\babel.licenses

Como alternativa, puede especificar un directorio de búsqueda en el que Babel debe buscar el archivo de licencia.

Si dispone de una clave de licencia, puede usar la opción env para pasarla a Babel de la forma siguiente:

babel --license env:BABEL_LICENSE_KEY

Aquí, BABEL_LICENSE_KEY es la variable de entorno que contiene la clave de licencia.

—verbose <n>

Establece el nivel de detalle de la salida de la consola. <n> es un número entero no negativo obligatorio. Si se especifica 0, no se muestra ningún mensaje durante la ofuscación. Con un número mayor que 10, Babel muestra información de depuración.

—noconfig (@)

Omite la carga de la configuración predeterminada de los valores de la línea de comandos. Si se especifica, se ignoran todos los valores predeterminados que figuran en el archivo babel.exe.config:

babel myapp.exe --noconfig babel myapp.exe @

—nowarn <warn list>

Suprime la notificación de uno o varios mensajes de advertencia. El parámetro <warn list> es una lista de ID de advertencia separados por comas. Babel ignora en silencio los números de advertencia que se pasan a la opción nowarn.

—[no]warnasinfo [warn list]

Especifica una lista de advertencias que se deben rebajar a mensajes informativos. [warn list] es una lista opcional, delimitada por comas, de los ID de advertencia.

—[no]warnaserror [warn list]

Especifica una lista de advertencias que se deben tratar como errores y que detienen el proceso de ofuscación. [warn list] es una lista opcional, delimitada por comas, de los ID de advertencia.

—[no]statistics [file]

Indica si se generan las estadísticas de ofuscación, que se pueden registrar al final del programa o guardar en un archivo, si se especifica uno.

Están disponibles las siguientes opciones adicionales:

full=[on/off] Whether to collect additional method statistics

Al activar las estadísticas de ofuscación completas, se recopila información adicional de los métodos, como la CYC (complejidad ciclomática). Esto puede aumentar el consumo de recursos, sobre todo al procesar ensamblados con muchos tipos.

Este es un ejemplo de estadísticas de ofuscación tomado de la salida de la consola:

Babel statistics: Random seed: 6dfabc3f1a479d66 Experimental features: false Multithread obfuscation: true Rules phase, elapsed time 00.000s Processed rules: 0 Agent phase, elapsed time 00.046s Renaming phase, elapsed time 00.082s Unicode normalization: off Flatten namespaces: on Overloaded renaming: off Virtual functions: on XAML renaming: on (res) Symbols statistics: 76/[ 106] types: 71.70 % 0/[ 2] events: 0.00 % 82/[ 236] methods: 34.75 % 7/[ 22] properties: 31.82 % 219/[ 258] fields: 84.88 % 384/[ 624] overall: 61.54 % Encrypt Strings phase, elapsed time 00.016s String algorithm: hash (.NET Core) Number of encrypted strings: 266

—[no]agent (a)

Esta opción activa o desactiva el agente de ofuscación. Cuando está activado, el agente realiza un análisis estático del código para evitar el renombrado o la ofuscación de símbolos del ensamblado de destino que, de otro modo, podrían provocar fallos de funcionamiento en la aplicación ofuscada.

—assemblyname <option>

Esta opción ofrece flexibilidad para determinar el nombre del ensamblado de destino.
Las opciones disponibles son:

--assemblyname name=assemblyname --assemblyname inputfilename --assemblyname outputfilename --assemblyname nochange (default)

El comportamiento predeterminado es nochange. Significa que el nombre del ensamblado no se cambia respecto a su valor original. Si no especifica ninguna opción --assemblyname, este será el comportamiento.

—[no]satellite [assembly]

Activa (con [no], desactiva) el procesamiento de los ensamblados satélite. Si se especifica el parámetro opcional [assembly], el archivo de ensamblado indicado se trata como un ensamblado satélite del ensamblado de destino.

—addsearch <path>

Añade el directorio <path> especificado a la lista de carpetas en las que Babel busca los ensamblados a los que se hace referencia.

El parámetro <path> puede ser una expresión con comodines que coincida con un conjunto de directorios. Para formar una expresión con comodines se pueden usar los caracteres especiales siguientes:

* coincide con cualquier número de caracteres cualesquiera, incluido ninguno
?coincide con un único carácter cualquiera
**coincide con cualquier directorio de forma recursiva
[a-z]coincide con un carácter del intervalo indicado entre corchetes
[!ab]coincide con cualquier carácter que no esté entre los corchetes

Las cadenas especiales siguientes, que se refieren al ensamblado que se está buscando, se pueden combinar en la expresión de ruta:

:assemblyname:nombre del ensamblado buscado
:assemblyversion:versión del ensamblado buscado
:assemblypublickeytoken:token de clave pública del ensamblado buscado

Esta opción se puede introducir varias veces.

--addsearch .\**\lib --addsearch .\:assemblyname:\**\netcoreapp2.0

W00013 en el proceso de vinculación de BAML

La advertencia W00013 que emite el resolvedor de ensamblados de Babel (Could not resolve assembly <assembly>) suele ser informativa. Para la mayoría de los tipos de código de la mayoría de los ensamblados, una referencia sin resolver no cambia el resultado de la ofuscación: Babel dispone de información suficiente en los metadatos que ya ha cargado para realizar el renombrado, la ofuscación del flujo de control, el cifrado de cadenas y otras transformaciones sin consultar todos los ensamblados a los que se hace referencia.

Sin embargo, hay al menos un caso concreto en el que W00013 se corresponde con un cambio real en el resultado de la ofuscación: los ensamblados que contienen BAML incrustado que hace referencia a tipos definidos en un ensamblado sin resolver. Cuando Babel lee el BAML para descubrir los miembros vinculados a XAML (consulte Alinear los literales de cadena con los miembros renombrados vinculados a XAML), necesita resolver el tipo CLR de cada elemento BAML. Si el ensamblado que declara ese tipo no está en la ruta de búsqueda, el resolvedor emite W00013 para él; el elemento BAML no se vincula entonces a su campo de respaldo y el campo no se marca como vinculado a XAML. Como consecuencia, cuando más adelante se renombra el campo, el paso de alineación que reescribe los literales de cadena que coinciden con el nombre original se omite sin aviso: el campo recibe su nuevo nombre, pero todos los literales que nombran el campo original quedan intactos, de modo que el ensamblado ofuscado queda internamente incoherente y deja de funcionar cualquier búsqueda por nombre en tiempo de ejecución que se base en esos literales.

En los proyectos que contienen BAML incrustado, antes de dar por definitiva para producción una ejecución de ofuscación, compruebe que todos los ensamblados que definen tipos a los que se hace referencia desde elementos BAML sean accesibles mediante --addsearch y que el registro de traza no muestre ningún W00013 para esos ensamblados. El mismo ajuste está disponible en la propiedad SearchDirectories de la tarea Babel de MSBuild y en el ajuste SearchDirectories del grupo Archivos y dependencias del panel de propiedades de Babel Desktop.

Este comportamiento de la advertencia se limita a los proyectos con BAML incrustado; en los proyectos que no son WPF, o en los que no tienen BAML incrustado, W00013 suele ser informativa y no afecta al resultado de la ofuscación.

—quickrule <rule>

Introduce la definición de una regla rápida. Una regla rápida se puede usar en lugar de una regla XML cuando el usuario quiere configurar el proceso de ofuscación sin tener que crear un archivo de reglas XML.

Sintaxis de la regla rápida:

feature[=exclude];[regex];[access];[target]

Donde:

featureEs el nombre de la función a la que se dirige la regla
[=exclude]Se puede especificar para desactivar la función
[regex]Es una expresión regular opcional que se usa para filtrar los símbolos. De forma predeterminada, el ofuscador toma todos los símbolos.
[access]Establece la visibilidad de los símbolos que se deben procesar y puede tener uno de los valores siguientes: Public, Protected, Internal, Private, All (valor predeterminado: All)
[target]Especifica la clase de símbolo. Los valores admitidos son: Classes, Delegates, Structures, Interfaces, Enums, Events, Methods, Properties, Fields, StaticFields, Resource, All (valor predeterminado: All)

La opción quickrule se puede introducir varias veces. Las reglas rápidas se procesan en el orden en que aparecen en la línea de comandos y antes de procesar cualquier regla XML.

Renombrar todos los símbolos públicos del ensamblado de destino:

babel myapp.exe --quickrule renaming;.*;Public

Desactivar el cifrado de cadenas en el espacio de nombres ACME:

babel myapp.exe --quickrule "string encryption=exclude;ACME.*;All;Methods"

Activar el cifrado de código para la clase ACME.Licensing:

babel myapp.exe --quickrule "msil encryption=on;ACME.Licensing.*"

—dbghelpdlldir <path>

Esta opción solo funciona en el sistema operativo Windows y configura la ruta de dbghelp.dll, lo que permite a Babel Obfuscator cargar los símbolos de depuración desde el servidor de símbolos de Microsoft .

—trace <regex>

Activa el seguimiento de la ofuscación para los símbolos cuya firma con nombre completo coincide con la expresión regular especificada. Esta opción se puede usar para depurar expresiones regulares.

babel myapp.exe --trace MyNamespace.MyClass::MyMethod

Hace el seguimiento del método llamado MyMethod y registra información de depuración sobre su estado de ofuscación.

—randomseed <seed>

Establece la semilla que se usa para inicializar el generador de números aleatorios de Babel Obfuscator. Se puede fijar para obtener una ofuscación determinista. El parámetro <seed> puede ser cualquier cadena hexadecimal.

—use <key=value>

Establece opciones adicionales de Babel Obfuscator como pares clave-valor.

debugxaml=[on/off] Whether to enable XAML debug mode encryption=<name> Set encryption algorithm (Aes, AesManaged, DES, TripleDES, Rijndael, RC2, XOR) experimental=[on/off] Whether to enable experimental features loadtomemory=[on/off] Whether to load assemblies to memory parallel=[on/off] Whether to perform multithread obfuscation tagassembly=[on/off] Whether to tag assembly with the BabelObfuscator attribute obfuscationattr=[skip/keep] Skip processing or force attribute retention logtimestamp=[on/off/fmt] Whether to add a timestamp to the log output (fmt date time format)

Ejemplos:

Mostrar la información de depuración relativa a todos los recursos XAML cuyo nombre empieza por Panel

babel myapp.exe --use debugxaml=Panel.* --verbose 5

Etiquetar el ensamblado ofuscado con el atributo [BabelObfuscator].

babel myapp.exe --use tagassembly=on

Forzar a Babel Obfuscator a usar el algoritmo de cifrado TripleDES

babel myapp.exe --use encryption=TripleDES

Proteger con el algoritmo AES administrado, de modo que el entorno de ejecución inyectado en el ensamblado ofuscado descifre sin el proveedor criptográfico de la plataforma. Úselo para que los ensamblados protegidos se inicien en hosts en los que ese proveedor no está disponible, como los contenedores con un estado FIPS de OpenSSL defectuoso (consulte Conformidad con FIPS). El ofuscador sigue cifrando con el proveedor de la plataforma en el host de compilación y produce el mismo texto cifrado; solo cambia el descifrador inyectado.

babel myapp.exe --msilencryption --use encryption=aesmanaged

La opción experimental también acepta una lista de funciones del ofuscador, incluido «all», que permite usar algoritmos de ofuscación nuevos que aún no se han publicado para todas las plataformas .NET.

babel myapp.exe --use experimental=all

Cuando las funciones experimentales están activadas en Babel, es importante tener en cuenta que la herramienta de ofuscación no comprueba si se cumplen los requisitos específicos de la plataforma. Esto significa que todas las ofuscaciones configuradas se ejecutan con independencia de que sean adecuadas para la plataforma de destino. Es fundamental tener presente que activar las funciones experimentales puede aumentar el riesgo de errores y afectar al rendimiento de la aplicación. Por ello, se recomienda usar las funciones experimentales con precaución, preferiblemente solo en un entorno de pruebas y conociendo bien los posibles riesgos.

—[no]isobfuscated [action]

Indica si se detecta que el ensamblado de destino ya está ofuscado.
Las acciones admitidas son:

  • warn: emite una advertencia y continúa procesando el ensamblado de destino.
  • exit: sale sin procesar el ensamblado de destino

Esta opción puede ser útil en un escenario de compilación en el que exista la posibilidad de que el ensamblado de destino se procese una segunda vez. Babel analiza los nombres de los símbolos para ver si el ensamblado ya se ha ofuscado. Sin embargo, hay algunos casos en los que el análisis podría dar un resultado incorrecto. En esa situación es mejor etiquetar el ensamblado con el atributo BabelObfuscator mediante la opción tagassembly de la opción de línea de comandos —use.

Archivos de entrada

La sección Archivos de entrada incluye las opciones que proporcionan a Babel Obfuscator archivos externos con configuraciones adicionales o datos necesarios para realizar alguna operación concreta.

—keyfile <file>

Establece el archivo de nombre seguro con el que se vuelven a firmar el ensamblado ofuscado y las DLL de recursos localizados. Babel Obfuscator admite Strong Name Key (.snk) y Personal Information Exchange (.pfx).

Si se usa un archivo Personal Information Exchange, añada la opción de línea de comandos —keypwd para especificar la contraseña del archivo .pfx.

—keyname <container>

Use esta opción para volver a firmar la aplicación si el par de claves está almacenado en un contenedor de claves. El parámetro obligatorio <_container>_ es el nombre del contenedor de claves que se usa para volver a firmar el ensamblado ofuscado y las DLL de recursos localizados.

—keypwd <password>

Especifica la contraseña que requiere un archivo Personal Information Exchange (.pfx) para volver a firmar el ensamblado ofuscado. Cuando la contraseña no se especifica en la línea de comandos, Babel pide al usuario que introduzca la contraseña correcta durante el proceso de ofuscación.

—rules <file>

Establece un archivo de reglas XML que Babel usa para configurar el proceso de ofuscación. Esta opción se puede especificar varias veces. Los archivos de reglas se procesan en el orden en que se introducen en la línea de comandos.

babel myapp.exe --rules ruleset1.xml --rules ruleset2.xml

—mapin <file>

Establece el archivo map XML de entrada que se usa para ofuscar los nombres de los símbolos a los que se hace referencia. Esta opción se puede especificar varias veces.

babel myapp.exe --mapin library.map.xml --mapin utils.map.xml

—project <file>

Especifica un archivo de proyecto de ofuscación.

—stacktrace <file|key=value>

Desofusca un archivo de traza de pila. Esta opción requiere pasar un archivo de texto <file> con la traza de pila ofuscada y un conjunto de archivos map XML para desofuscar el contenido de la traza de pila.

babel --stacktrace obfuscatedstacktrace.txt --mapin myapp.map.xml --mapin library.map.xml

La opción se puede repetir para pasar, además del archivo de la traza de pila, los siguientes ajustes key=value:

AjusteValoresDescripción
modefull (predeterminado), compactSelecciona el nivel de detalle de los frames descodificados.
framesall (predeterminado), userall conserva todos los frames; user descarta los frames que generó Babel (los puentes del proxy dinámico y los frames anónimos de tiempo de ejecución a través de los cuales llaman) y deja solo la cadena de llamadas de su código fuente.

Por ejemplo, para descodificar una traza conservando solo la cadena de llamadas del usuario:

babel --stacktrace obfuscatedstacktrace.txt --stacktrace frames=user --mapin myapp.map.xml

Archivos de salida

Opciones de Babel Obfuscator para establecer los nombres de los archivos de salida.

—output <file>

Establece la ruta del archivo de salida del destino ofuscado. Si no se indica esta opción, el destino ofuscado se guarda en el subdirectorio BabelOut de la carpeta del ensamblado original.

—pdb <file>

Establece la ruta del archivo PDB de salida. Esta opción se puede usar cuando la opción —debug está activada.

—pdbpwd <password>

Establece la contraseña del archivo de información de depuración. La contraseña cifra los nombres de los archivos de código fuente almacenados en el PDB.

—logfile <file>

Envía los mensajes de salida de Babel Obfuscator a un archivo de registro.

—mapout [file]

Establece el nombre del archivo map XML de salida. Si no se indica el parámetro opcional [file], Babel Obfuscator da al archivo map XML el nombre del ensamblado original y le añade la extensión .map.xml.

—makeproject [file]

Crea un archivo de proyecto de MSBuild a partir de la línea de comandos introducida. Si no se indica el parámetro opcional [file], Babel Obfuscator guarda el archivo de proyecto en el subdirectorio BabelOut.

Complementos

Los complementos son componentes adicionales que amplían la funcionalidad de Babel Obfuscator. Permiten añadir o modificar funciones de ofuscación, lo que permite una mayor personalización y un mayor control sobre el proceso de ofuscación. (consulte Encrypt Plugin)

—plugin <file>

Establece la ruta del archivo de un complemento de Babel Obfuscator. Esta opción se puede especificar varias veces.

—argument <key=value>

Establece un argumento del complemento como par clave-valor. Esta opción se puede especificar varias veces.

Combinar e incrustar ensamblados

La combinación de ensamblados consiste en unir varios ensamblados en un único ensamblado principal. Babel Obfuscator realiza esta operación combinando y ofuscando todos los ensamblados especificados después del ensamblado principal en la línea de comandos.

—[no]copyattrs [regex]

Cuando esta opción está activada, todos los atributos de nivel de ensamblado de cada ensamblado de entrada se copian en el ensamblado de destino. Se puede especificar una expresión regular opcional para combinar los atributos duplicados que coincidan con ella.

—embed <assembly>

Babel Obfuscator puede incrustar varios ensamblados de dependencia en el ensamblado de destino. Los ensamblados incrustados se comprimen y se cifran. La incrustación puede simplificar el despliegue y reducir el tamaño del software. Se puede usar en lugar de la combinación cuando no es necesario ofuscar por completo el ensamblado de dependencia.

Esta opción se puede especificar varias veces.

babel myapp.exe --embed Library1.dll --embed Library2.dll

—[no]internalize

Cuando está activada, la visibilidad de todos los tipos públicos de los ensamblados combinados se restringe a internal (Friend en VB).

—[no]jsonmanifest

Activa (con [no], desactiva) el tratamiento del manifiesto de dependencias (valor predeterminado: activado). Babel Obfuscator puede actualizar el archivo de manifiesto .deps.json del ensamblado de destino al combinar dependencias.

Renombrado

Estos comandos se pueden usar para configurar el renombrado de símbolos.

—[no]types (t)

Indica si se activa el renombrado de tipos.

—[no]events (e)

Indica si se activa el renombrado de eventos.

—[no]methods (m)

Indica si se activa el renombrado de métodos.

—[no]parameters (r)

Indica si se activa el renombrado de los parámetros de los métodos.

—[no]properties (p)

Indica si se activa el renombrado de propiedades.

—[no]fields (f)

Indica si se activa el renombrado de los símbolos de campo.

—[no]xaml [key=value]

Si está activada, se renombran los símbolos usados en los recursos XAML o BAML. Esta opción acepta pares clave-valor opcionales, especificados como <key>=<value>.

Los valores de clave aceptados son:

keys=[on/off] Whether to enable renaming of dictionary keys res=[on/off] Whether to enable renaming of BAML/XAML resources strip=[on/off] Whether to strip line information or white spaces manual=[on/off] Whether to use manual symbol renaming

—[no]virtual [key=value]

Indica si se renombran los miembros virtuales, como métodos, propiedades y eventos. Esta opción acepta pares clave-valor opcionales, especificados como <key>=<value>.

Los valores de clave aceptados son:

external=[on/off] Whether to obfuscate external virtual calls

—[no]overloaded [key=value]

Cuando está activada, Babel Obfuscator usa el mismo nombre para dos o más métodos del mismo tipo siempre que las reglas del CLR lo permitan. Opcionalmente se pueden introducir pares clave-valor para seleccionar qué sobrecarga aplicar.

Los valores de clave aceptados son:

methods=[on/off] Whether to overload methods properties=[on/off] Whether to overload methods parameters=[on/off] Whether to overload parameters

—[no]flatns (n)

Cuando está activada, todos los tipos renombrados se mueven al espacio de nombres global. Esto aplana la jerarquía de espacios de nombres, y en el ensamblado ofuscado no se incluye ninguna información de espacios de nombres.

—[no]unicode [char set]

Si está activada, los nombres se sustituyen por cadenas Unicode ilegibles. Con la normalización Unicode desactivada, todos los nombres ofuscados están formados por cadenas de caracteres en minúscula tomados del alfabeto latino. Opcionalmente, el usuario puede especificar el juego de caracteres que se usa para generar los nombres ofuscados.

babel myapp.exe --unicode 0xf000-0xfe00 babel myapp.exe --unicode 10,13,a-z

—namelength <n>

Establece la longitud de nombre mínima de los símbolos renombrados. Opcionalmente se pueden introducir pares clave-valor para fijar por separado la longitud mínima de tipos, métodos, propiedades, campos y eventos.

babel myapp.exe --namelength types=12 --namelength methods=3

—nameprefix [prefix]

Establece el prefijo de nombre de los símbolos renombrados. Opcionalmente se pueden introducir pares clave-valor para establecer por separado el prefijo de tipos, métodos, propiedades, campos, eventos y parámetros.

babel myapp.exe --nameprefix types=$Name_ --nameprefix methods=M_

El valor especial $Name se sustituye por el nombre original del símbolo. Normalmente, el prefijo $Name se puede usar para depurar problemas de renombrado.

—[no]xmldoc [file|regex]

Indica si se actualiza la documentación XML del ensamblado de destino eliminando de ella todos los símbolos renombrados. Opcionalmente se puede especificar la ruta del archivo del documento XML o una expresión regular. Si el nombre del archivo o la expresión regular coincide con el nombre del archivo de documentación XML de un ensamblado combinado, el documento XML del ensamblado combinado se combina con el documento XML del ensamblado de destino.

Ofuscación del flujo de control

La ofuscación del flujo de control consiste en transformar el código de un método, de modo que se oculta su ruta de ejecución y el flujo resultante se vuelve mucho más complejo y difícil de comprender.

—[no]controlflow

Se usa para alterar el flujo de control de los métodos. Opcionalmente se pueden introducir pares clave-valor <key>=<value> para configurar la alteración del código.

Valores de clave aceptados para producir código IL verificable:

goto=[on/off] Whether to insert irrelevant branches switch=[on/off] Whether to enable switch scrambling case=[on/off] Whether to hide case constants if=[on/off] Whether to enable if scrambling call=[on/off] Whether to enable random calls value=[on/off] Whether to use value encryption token=[on/off] Whether to enable emission of method tokens chain=[on/off] Whether to enable chained-state flattening (Ultimate)

Para producir código IL no verificable:

underflow=[on/off] Whether to enable stack underflow

Esta opción se puede especificar varias veces, por ejemplo:

babel myapp.exe --controlflow if=on --controlflow switch=on --controlflow case=on --controlflow call=on

—iterations <n>

Establece el número de iteraciones que usa el algoritmo de ofuscación del flujo de control. Si el número de iteraciones se establece en 0, la ofuscación del flujo de control se desactiva. A medida que n aumenta, en cada método se inserta un número creciente de instrucciones de bifurcación irrelevantes.

—[no]invalidopcodes [mode]

Use esta opción para emitir códigos de operación MSIL no válidos. Esto impide que algunas herramientas de reflexión inspeccionen el cuerpo IL del método.

Al activar esta opción, el ensamblado ofuscado deja de ser verificable por los verificadores de lenguaje intermedio (IL). Es importante tener en cuenta que el código IL no verificable no se puede ejecutar en sistemas operativos x64 y, por tanto, esta opción no se debe activar si el ensamblado ofuscado tiene como destino plataformas x64.

El parámetro opcional [mode] activa distintas configuraciones de códigos de operación no válidos:

enhanced: Insert additional invalid op-codes

Cifrado y protección

Opciones dirigidas a funciones de ofuscación avanzadas, como el cifrado de cadenas y de código.

—[no]msilencryption [regex]

Indica si se activa el cifrado de código para los métodos que coinciden con la expresión regular opcional o con las reglas de ofuscación definidas en los archivos de reglas XML. Esta opción se puede especificar varias veces.

—[no]stringencryption [name]

Indica si se activa el cifrado de las cadenas de usuario. Se puede especificar un parámetro opcional name para seleccionar el algoritmo de cifrado que se usa.

Los nombres de algoritmo aceptados son:

hash The strings are arranged into a hash table xor Inline XOR encoded strings stream Authenticated per-string encryption, decrypted lazily; fully managed (AOT/trim/FIPS safe)

—[no]valueencryption [key=value]

Esta opción activa el cifrado de los valores constantes en línea y de las matrices. Opcionalmente se pueden introducir pares clave-valor <key>=<value> para activar o desactivar el cifrado de determinados tipos.

Los valores de clave aceptados son:

int32=[on/off] Whether to encrypt Int32 values int64=[on/off] Whether to encrypt Int64 values single=[on/off] Whether to encrypt Single values double=[on/off] Whether to encrypt Double values array=[on/off] Whether to encrypt Arrays

—[no]ildasm

Cuando está activada, se añade System.Runtime.CompilerServices.SuppressIldasmAttribute al ensamblado de destino para impedir que el desensamblador de MSIL de Microsoft, ILDASM (Ildasm.exe), desensamble el destino ofuscado.

—[no]reflection

Indica si se activa la emisión de metadatos no válidos para detener las herramientas basadas en reflexión.

—[no]resourceencryption [key=value]

Indica si se activa el cifrado de recursos administrados. Cuando está activado, todos los recursos incrustados se comprimen y se cifran. Opcionalmente se pueden introducir pares clave-valor para especificar ajustes adicionales.

Los valores de clave aceptados son:

encrypt=[on/off] Whether to encrypt resources compress=[on/off] Whether to compress resources protect=[on/off] Whether to protect embedded resources

—[no]proxy [type][;regex]

Indica si se activa la generación de llamadas mediante proxy a métodos externos o internos. El parámetro opcional [type] puede tener uno de los valores siguientes:

external hide calls to external assembly methods internal hide calls to internally defined assembly methods all hide both internal and external method calls

Opcionalmente, el usuario puede introducir una expresión regular que coincida con la firma de los métodos cuyas llamadas deben pasar por un proxy, por ejemplo:

babel.exe myapp.exe --proxy external --proxy ;System.Array::.* --proxy ;::GetEnumerator

—[no]tamperingdetection

Indica si se activa la protección contra manipulación.

—[no]antidebugging

Indica si se activa la protección contra depuración.

Generación de código

Estas opciones se refieren a algunas optimizaciones de código que Babel Obfuscator puede añadir al ensamblado de destino.

—addreference <assembly>

Añade una referencia de ensamblado al ensamblado de destino o la redirige. Ejemplo:

babel myapp.exe --addreference "[System*, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]"

Redirige todas las referencias de System a ensamblados portables. Esta opción se puede especificar varias veces.

—[no]cleanattrs <regex>

Indica si se activa la eliminación de atributos no deseados. El parámetro <regex> es una expresión regular que coincide con el nombre completo del tipo del atributo no deseado. Esta opción se puede especificar varias veces.

—[no]constremoval

Indica si se activa la eliminación de campos constantes. Siempre que sea posible, cualquier referencia a un campo constante se sustituye por su valor constante.

—[no]deadcode [regex]

Indica si se activa la eliminación de código muerto. Cuando está activada, elimina todos los métodos, propiedades, campos y eventos a los que no llega ninguna ruta del código. Se puede especificar un punto de entrada opcional mediante [regex] para definir dónde empieza la búsqueda.

—[no]debug [source]

Indica si se activa la emisión de la información de depuración y se genera un archivo PDB de símbolos de depuración para el destino ofuscado. Opcionalmente se puede especificar un almacén de símbolos de depuración.

--debug srv*c:\Symbols*http://msdl.microsoft.com/download/symbols

—[no]disgregateremoval

Indica si se activa la eliminación de los metadatos de propiedades y eventos, de modo que solo queden los métodos de acceso de las propiedades y los eventos.

—[no]enumremoval

Indica si se activa la eliminación de los tipos System.Enum. Siempre que sea posible, cualquier referencia a un campo de enumeración se sustituye por su valor constante.

—[no]inlineexpansion

La expansión en línea del código permite sustituir una llamada a un método por el código del propio método en el punto en que se realiza la llamada.

—[no]instrument [regex]

Indica si se activa la instrumentación del código. Se puede especificar una expresión regular opcional para seleccionar, por su nombre completo, los miembros que se deben instrumentar.

Los nombres completos de los miembros tienen la sintaxis siguiente

[NamespaceName].[TypeName]::[MethodName]

Ejemplo:

babel myapp.exe --instrument mynamespace\.mytype::.*

Esta opción se puede introducir varias veces.

—[no]emptymethods

Indica si se añade código de instrumentación a los métodos con el cuerpo vacío.

—moduleinitializer [method]

Añade código de inicializador de módulo. Opcionalmente se puede especificar la firma de un método estático sin parámetros, al que se llamará después de cargar el módulo.

[Obfuscation(Feature = "module initializer:priority=120")] public static void DoInitialize120() { Console.WriteLine("DoInitialize120"); }

Donde priority puede tomar un valor entero que define el orden en que babel llama a los métodos inicializadores. Babel añade sus métodos inicializadores con una prioridad predeterminada de 100. Los inicializadores con una prioridad inferior a 100 se llaman primero.

—[no]seal

Cuando está activada, sella todas las clases no públicas que no se usan como clases base en una jerarquía de herencia. Declarar una clase como sellada puede mejorar el rendimiento de las llamadas a métodos, porque evita, cuando es posible, que el compilador Just-In-Time (JIT) recorra la tabla virtual de métodos.

Last updated on