Skip to Content
Nueva versión 12 disponible 🎉
ObfuscatorRenombrado de símbolos

Renombrado de símbolos

Babel Obfuscator puede renombrar espacios de nombres, tipos, métodos, propiedades, eventos y campos, lo que dificulta la ingeniería inversa. De forma predeterminada usa ASCII para el renombrado, pero puede optar por Unicode para obtener símbolos más ilegibles.

Babel renombra automáticamente los símbolos internos, pero no los que son visibles para otros ensamblados. Así, los símbolos privados e internos se renombran, mientras que los miembros públicos y protegidos no cambian, salvo que se apliquen reglas personalizadas que fuercen el renombrado.

Es importante tener en cuenta que renombrar símbolos públicos puede romper la interfaz pública del componente, ya que el código externo puede depender de los nombres concretos de esos símbolos. En general se recomienda no renombrar los símbolos visibles desde el exterior y centrarse en ofuscar los detalles internos de la implementación.

Si un símbolo no está pensado para usarse desde el exterior, debe declararse como interno; así no es visible fuera del ensamblado y no forma parte de la interfaz pública.

Al reducir a interna la visibilidad de los tipos públicos, puede aumentar el número total de miembros ofuscados sin dejar de conservar la interfaz pública del componente.

Configuración del renombrado de símbolos

Puede configurar el renombrado en Babel Desktop, desde la línea de comandos o con la tarea de MSBuild.

Babel Desktop

Para configurar el renombrado en Babel Desktop, abra o cree un proyecto, seleccione el ensamblado en el diagrama del proyecto y establezca las opciones del grupo Renombrado del panel de propiedades. El grupo contiene los indicadores de tipos y miembros (ObfuscateTypes, ObfuscateMethods, ObfuscateProperties, ObfuscateEvents, ObfuscateFields, ObfuscateParameters), el aplanamiento de espacios de nombres (FlattenNamespaces), los nombres Unicode (UnicodeNormalization), la longitud y el prefijo de nombre (NameLength, NamePrefix) y el renombrado con sobrecarga (OverloadedRenaming). Consulte Proyectos de ofuscación para saber cómo funcionan los proyectos en Babel Desktop.

Línea de comandos

Configurar el renombrado en Babel Obfuscator mediante la interfaz de línea de comandos (CLI) es una forma eficaz y flexible de integrar la ofuscación en su proceso de compilación si usa scripts de CLI.

Para configurar el renombrado en Babel Obfuscator, desde el símbolo del sistema en Windows o desde el terminal en macOS o Linux, vaya a la ubicación de su proyecto e introduzca:

babel myapp.exe --types --methods --properties --events --fields --parameters

Aquí debe sustituir myapp.exe por el nombre del ensamblado compilado que quiere ofuscar. Las opciones de la CLI que le siguen indican los tipos de símbolos que desea renombrar.

Cada opción (--types, --methods, etc.) activa el renombrado de esa categoría concreta de símbolos del ensamblado. Al incluir estas opciones, indica a Babel Obfuscator que aplique el renombrado a tipos, métodos, propiedades, eventos, campos y parámetros. Si necesita excluir del renombrado una categoría concreta, use el prefijo --no con el tipo de símbolo. Por ejemplo, para desactivar el renombrado de los tipos, use --notypes. Puede hacerlo con cualquier tipo de símbolo para decidir qué elementos se ofuscan.

Para consultar la ayuda de la línea de comandos sobre una opción de renombrado concreta, introduzca el comando siguiente

babel --help types

Se muestra la ayuda detallada de la opción --types.

Tarea Babel de MSBuild

La tarea Babel de MSBuild integra Babel Obfuscator en su flujo de trabajo de compilación y ofrece un control detallado de las preferencias de ofuscación. Con ella puede indicar con precisión qué elementos de su código se ofuscan y adaptar el proceso de ofuscación a sus necesidades concretas.

<PropertyGroup> <ObfuscateTypes>true</ObfuscateTypes> <ObfuscateMethods>true</ObfuscateMethods> <ObfuscateProperties>true</ObfuscateProperties> <ObfuscateEvents>true</ObfuscateEvents> <ObfuscateFields>true</ObfuscateFields> <ObfuscateParameters>true</ObfuscateParameters> </PropertyGroup> <Babel ObfuscateTypes="$(ObfuscateTypes)" ObfuscateMethods="$(ObfuscateMethods)" ObfuscateProperties="$(ObfuscateProperties)" ObfuscateEvents="$(ObfuscateEvents)" ObfuscateFields="$(ObfuscateFields)" ObfuscateParameters="$(ObfuscateParameters)" />

Prefijo de nombre

Babel Obfuscator permite aplicar un prefijo de nombre a todos los nombres de símbolo generados. Puede indicar el prefijo que se aplica a una clase concreta de símbolo, como tipos, métodos, propiedades, eventos, campos o parámetros. El prefijo se indica con la opción --nameprefix o --prefix seguida de la cadena de prefijo deseada. Además, puede indicar la clase de símbolo a la que se aplica el prefijo con la sintaxis —prefix [kind]=[prefix]

Babel acepta el prefijo $name, que se sustituye por el nombre original del símbolo durante el renombrado. Puede resultar útil para depurar o para identificar problemas que surjan a causa del renombrado.

Línea de comandos

babel myapp.exe --prefix xy_ --prefix types=tp_ --prefix fields=m_

Para obtener más información sobre la opción de línea de comandos del prefijo de nombre, introduzca:

babel --help prefix

Tarea Babel de MSBuild

<PropertyGroup> <NamePrefix>xy_;types=tp_;fields=m_</NamePrefix> </PropertyGroup> <Babel NamePrefix="$(NamePrefix)" />

Longitud de nombre

En Babel Obfuscator puede indicar la longitud mínima de los nombres ofuscados generados con la opción --namelength seguida de la longitud deseada. Resulta útil si quiere asegurarse de que los nombres ofuscados tengan una longitud determinada. Además, puede indicar la clase de símbolo a la que se aplica la longitud de nombre con la sintaxis —namelength [kind]=[value]

Línea de comandos

babel myapp.exe --namelength 3 --namelength types=8

Para obtener más información sobre la opción de línea de comandos de la longitud de nombre, introduzca:

babel --help namelength

Tarea Babel de MSBuild

<PropertyGroup> <NameLength>3;types=8</NameLength> </PropertyGroup> <Babel NameLength="$(NameLength)" />

Juego de caracteres Unicode

Babel permite indicar el juego de caracteres Unicode que se usa al generar los nombres ofuscados. Puede usar valores de caracteres Unicode separados por comas o intervalos de caracteres representados en forma hexadecimal, decimal o de carácter.

Línea de comandos

babel myapp.exe --unicode 10,13,a-z,0x4E00-0x4FFF

Para desactivar el renombrado Unicode, introduzca:

babel myapp.exe --nounicode

Tarea Babel de MSBuild

<PropertyGroup> <UnicodeNormalization>10,13,a-z,0x4E00-0x4FFF</UnicodeNormalization> </PropertyGroup> <Babel UnicodeNormalization="$(UnicodeNormalization)" />

Aplanar los espacios de nombres

Cuando el aplanamiento de espacios de nombres está activado, Babel elimina del ensamblado ofuscado toda la información de espacios de nombres y mueve todos los tipos renombrados al espacio de nombres global. Así, a un atacante le resulta más difícil entender la organización del código y localizar tipos o miembros concretos dentro del ensamblado.

Opcionalmente, puede indicar el nombre del espacio de nombres que Babel usará como contenedor global de todos los tipos renombrados.

Tenga en cuenta que, en Babel, solo los tipos renombrados cambian de espacio de nombres según los ajustes de aplanamiento.

Línea de comandos

babel myapp.exe --flatns babel myapp.exe --flatns glbns

Para desactivar el aplanamiento de espacios de nombres, introduzca:

babel myapp.exe --noflatns

Tarea Babel de MSBuild

<PropertyGroup> <FlattenNamespaces>true</FlattenNamespaces> </PropertyGroup> <Babel FlattenNamespaces="$(FlattenNamespaces)" />

Renombrado con sobrecarga

El renombrado con sobrecarga es una técnica con la que Babel da el mismo nombre a métodos con firmas distintas, siempre que lo permitan las reglas de diseño de .NET Framework. Así, a un atacante le resulta más difícil entender el código y aplicarle ingeniería inversa. Además, Babel renombra las sobrecargas incluso cuando solo difiere el tipo de valor devuelto del método, lo que hace imposible descompilar por completo el código a lenguajes de alto nivel como C# y VB.NET, ya que estos lenguajes no permiten la sobrecarga por tipo de valor devuelto.

Línea de comandos

babel myapp.exe --overloaded

Para desactivar el renombrado con sobrecarga, introduzca:

babel myapp.exe --nooverloaded

Tarea Babel de MSBuild

<PropertyGroup> <OverloadedRenaming>true</OverloadedRenaming> </PropertyGroup> <Babel OverloadedRenaming="$(OverloadedRenaming)" />

Funciones virtuales

Babel puede ofuscar las funciones virtuales renombrándolas de un modo que conserva su carácter virtual. Esto significa que la disposición original de la tabla de funciones virtuales (vtable) se mantiene incluso después de la ofuscación. Es importante para que el programa siga funcionando correctamente, ya que las funciones virtuales son una parte esencial de muchos programas orientados a objetos. Al ofuscar las funciones virtuales, Babel hace más difícil que los atacantes entiendan el comportamiento del programa y aprovechen sus vulnerabilidades.

Línea de comandos

babel myapp.exe --virtuals

Para desactivar la ofuscación de las funciones virtuales, introduzca:

babel myapp.exe --novirtuals

Tarea Babel de MSBuild

<PropertyGroup> <VirtualFunctions>true</VirtualFunctions> </PropertyGroup> <Babel VirtualFunctions="$(VirtualFunctions)" />

Renombrado de variables locales

En los metadatos de .NET, los nombres de las variables locales no se almacenan de forma explícita. Los descompiladores los deducen a partir de varios factores. Por ejemplo, cuando el tipo de una variable se indica de forma explícita, como en el caso de

var list1 = new List<string>();

el descompilador puede determinar que el nombre de la variable es «list1» a partir de la instrucción de asignación.

Los nombres de las variables locales también pueden cargarse desde el archivo Program Database (PDB) del ensamblado. El archivo PDB contiene información de depuración adicional, incluidos los nombres de las variables, que los descompiladores pueden usar para reconstruir los nombres originales.

Para reducir la exposición de los nombres de las variables locales, Babel Obfuscator ofrece la opción de activar la generación de proxies dinámicos para los tipos externos.

babel myapp.exe --proxy external

Esta función envuelve los tipos originales, como List<string>, en tipos proxy renombrados, de modo que los tipos de las variables quedan ocultos.

Es imprescindible asegurarse de que el descompilador que se use no cargue el archivo PDB, porque eso le permitiría reconstruir los nombres originales de las variables. Si se desactiva la carga del PDB o se elimina el archivo PDB, el descompilador tiene un acceso limitado a la información de depuración.

Para una protección completa del código de los métodos, se recomienda activar el cifrado de código siempre que sea posible. El cifrado de código transforma el código del método en una forma cifrada, de modo que a quien haga ingeniería inversa le resulta mucho más difícil entender o modificar el código, incluso si consigue recuperar los nombres originales de las variables.

Last updated on