Skip to Content
Nueva versión 12 disponible 🎉
ObfuscatorMejora de la seguridad del código

Mejora de la seguridad del código

Prácticas recomendadas para mejorar la seguridad del código.

Babel Obfuscator es una herramienta potente que ofrece una protección robusta para su código. Conocer a fondo todos los detalles de la ofuscación puede llevar tiempo, por lo que aquí se reúne una serie de consejos que le ayudarán a obtener los mejores resultados de ofuscación con el mínimo esfuerzo. Si sigue estas recomendaciones, mejorará notablemente la seguridad de su código sin perderse en los detalles.

Una protección sólida nace de la defensa en profundidad: ninguna transformación está pensada para detener por sí sola a un atacante. El renombrado oculta la intención, el cifrado oculta los datos, el flujo de control y los proxies dinámicos ocultan la lógica, y las comprobaciones en tiempo de ejecución disuaden la manipulación y la depuración. Combine varias capas para que, si una cae, las demás sigan en pie. Los consejos siguientes se agrupan según lo que protege cada capa.

Renombrar y reestructurar los símbolos

Considerar internalizar los tipos en C# o marcarlos como Friend en VB

Declarar los tipos como internal o Friend (en la terminología de VB) garantiza que no sean visibles para los ensamblados externos y que puedan renombrarse con seguridad durante la ofuscación. Este paso protege eficazmente su código de miradas indiscretas.

Babel Obfuscator permite renombrar los tipos públicos o los símbolos visibles desde el exterior del ensamblado mediante reglas XML. Sin embargo, esto debe revisarse con cuidado, porque si otros ensamblados usan el símbolo, la aplicación dejará de funcionar. Por tanto, internalizar los tipos o marcarlos como Friend es una forma sencilla de mejorar la seguridad, mientras que forzar el renombrado de los símbolos públicos exige una valoración y unas pruebas minuciosas.

Reforzar el renombrado

Además del renombrado de símbolos predeterminado, algunas opciones hacen que los metadatos renombrados sean mucho más difíciles de leer:

  • El renombrado con sobrecarga reutiliza un mismo nombre ofuscado para muchos miembros sin relación entre sí, de modo que los metadatos dejan de corresponderse uno a uno con sus miembros.
  • El aplanamiento de espacios de nombres contrae la jerarquía de espacios de nombres y borra las pistas estructurales en las que se apoya un descompilador.
  • El renombrado de miembros virtuales renombra de forma coherente los miembros virtuales y de interfaz en toda la jerarquía de tipos.

Babel CLI

babel.exe myapp.dll --overloaded --flatns --virtualmembers

Combinar las dependencias siempre que sea posible

Babel Obfuscator permite combinar los ensamblados a los que se hace referencia con el ensamblado de destino. Al internalizar todos los tipos combinados aumenta el número de símbolos renombrados, lo que dificulta que un posible atacante descifre su código.

Ocultar los datos constantes

Usar el algoritmo hash para el cifrado de cadenas

El algoritmo de cifrado de cadenas hash ofrece una protección fuerte y, además, reduce el tamaño en disco del ensamblado ofuscado. Puede activar esta función con el comando siguiente:

Babel CLI

babel.exe myapp.exe --stringencryption hash

Tarea Babel de MSBuild

<PropertyGroup> <StringEncryption>hash</StringEncryption> </PropertyGroup>

Cifrar los valores en línea y las matrices

Las constantes numéricas y las matrices en línea contienen a menudo datos confidenciales: umbrales, claves, números mágicos, tablas de búsqueda. El cifrado de valores y matrices quita esos literales del IL y los descifra en tiempo de ejecución, de modo que un descompilador ya no ve los números reales ni el contenido de las matrices.

Babel CLI

babel.exe myapp.exe --values int32=on --values int64=on --values single=on --values double=on --values array=on

Cifrar los recursos administrados

El cifrado de recursos oculta los recursos incrustados en el ensamblado y a la vez los comprime, lo que añade otra capa de protección. Valore con atención el efecto sobre el rendimiento antes de activar esta función.

Oscurecer la lógica del programa

Activar la ofuscación del flujo de control

La ofuscación del flujo de control añade complejidad a las instrucciones if, inserta bifurcaciones irrelevantes e introduce varias instrucciones switch sin alterar el comportamiento del método. Activar algoritmos de flujo de control concretos, como goto, if, switch, case y call, garantiza la mejor alteración del código. Los ajustes recomendados siguientes le ayudarán a obtener una ofuscación del flujo de control eficaz:

Babel CLI

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

Tarea Babel de MSBuild

<PropertyGroup> <ControlFlowObfuscation>goto=true;if=true;switch=true;case=true;call=true;true</ControlFlowObfuscation> <ControlFlowIterations>3</ControlFlowIterations> </PropertyGroup>

Con los ajustes de ofuscación del flujo de control anteriores se obtiene una ofuscación sólida y eficaz del código. Los distintos algoritmos (goto, if, switch, case y call) contribuyen a que el flujo de control sea más enrevesado y difícil de analizar, lo que mejora la seguridad de la aplicación.

Usar la generación de proxies dinámicos para las llamadas a métodos externos

Los proxies dinámicos ocultan eficazmente las llamadas a métodos externos e internos. Activar la generación de proxies dinámicos para las llamadas externas suele bastar para alcanzar un nivel alto de ofuscación.

babel.exe myapp.exe --proxy external

Cifrar el código

El cifrado de código ofrece una protección sólida para los métodos que manejan datos confidenciales, como la verificación de la clave de licencia. Tenga presente, sin embargo, su efecto sobre el rendimiento, porque el cifrado de código puede afectar a la velocidad de la aplicación: aplíquelo de forma selectiva a los métodos que lo necesiten.

Con la integración del Babel Licensing Service, puede usar licencias de activación o licencias flotantes para ofrecer licencias basadas en funciones. Esto significa que puede entregar las claves de cifrado de forma segura a través del servicio de licencias y desbloquear funciones concretas de su aplicación para los usuarios autorizados.

Al combinar el Babel Licensing Service con el cifrado de código, se asegura de que solo los usuarios con licencia tengan acceso a los segmentos de código cifrados. La clave de cifrado se entrega de forma segura a través del servicio de licencias, lo que impide el uso no autorizado y garantiza la integridad de las funciones de su aplicación.

Detectar y disuadir los ataques en tiempo de ejecución

Activar la protección contra manipulación

La protección contra manipulación detecta cualquier modificación no autorizada del ensamblado. Elija acciones adecuadas, como detener la ejecución o informar de un error al usuario, para disuadir a los atacantes. Si opta por acciones silenciosas, resulta más difícil eludir el mecanismo de protección contra manipulación.

babel.exe myapp.exe --tamperingdetection

Activar la protección contra depuración

La protección contra depuración detecta cuándo la aplicación se ejecuta bajo un depurador o un generador de perfiles, las herramientas que usa un atacante para observar los secretos mientras se descifran en tiempo de ejecución. Combinada con las capas de cifrado anteriores, cierra el hueco que deja el análisis estático.

babel.exe myapp.exe --antidebugging

Bloquear las herramientas de desensamblado y de reflexión

Dos opciones ligeras dificultan la inspección ocasional: --ildasm marca el ensamblado para que el desensamblador de MSIL (ildasm.exe) se niegue a abrirlo, y --reflection impide que las herramientas basadas en reflexión enumeren los metadatos del ensamblado.

babel.exe myapp.exe --ildasm --reflection

Quitar lo que no necesita distribuir

Cada fragmento de metadatos que deja en el ensamblado es una pista. Quite lo que la aplicación no necesita para ejecutarse:

  • Limpiar los atributos: --cleanattrs quita los atributos personalizados que solo servían al compilador o a sus herramientas.
  • Eliminar el código muerto: --deadcode descarta los métodos y miembros inalcanzables.
  • Eliminar las enumeraciones: --enumremoval sustituye los tipos de enumeración por sus constantes subyacentes.
  • Sellar las clases internas: --seal sella los tipos internos de los que nunca se hereda.
  • No distribuir los símbolos de depuración: despliegue sin el archivo .pdb (evite --debug) para que un atacante no disponga de los números de línea ni de los nombres de las variables locales.

El comando siguiente combina las capas anteriores en una configuración sólida de uso general. Añada --msilencryption para los métodos sensibles concretos que lo justifiquen.

babel.exe myapp.dll ` --overloaded --flatns --virtualmembers ` --stringencryption hash ` --values int32=on --values int64=on --values single=on --values double=on --values array=on ` --controlflow if=on --controlflow switch=on --controlflow case=on --controlflow chain=on ` --proxy external ` --resourceencryption ` --tamperingdetection --antidebugging --ildasm ` --cleanattrs --seal

Las propiedades equivalentes de la tarea de MSBuild:

<PropertyGroup> <OverloadedRenaming>true</OverloadedRenaming> <FlattenNamespaces>true</FlattenNamespaces> <VirtualFunctions>true</VirtualFunctions> <StringEncryption>hash</StringEncryption> <ValueEncryption>int32=true;int64=true;single=true;double=true;array=true;true</ValueEncryption> <ControlFlowObfuscation>if=true;switch=true;case=true;chain=true;true</ControlFlowObfuscation> <DynamicProxy>external=true;true</DynamicProxy> <ResourceEncryption>true</ResourceEncryption> <TamperingDetection>true</TamperingDetection> <DebuggingProtection>true</DebuggingProtection> <SuppressIldasm>true</SuppressIldasm> <CleanAttributes>true</CleanAttributes> <SealClasses>true</SealClasses> </PropertyGroup>

Conservar un archivo map para el soporte

Una ofuscación agresiva hace ilegibles las trazas de pila de producción. Conserve el archivo map de ofuscación que se genera en cada compilación para poder descodificar las trazas de pila y recuperar los nombres originales al diagnosticar los problemas de sus clientes, sin debilitar el ensamblado distribuido.

Pruebe la aplicación ofuscada: es fundamental probar a fondo la aplicación ofuscada para detectar y corregir cualquier problema que haya introducido el proceso de ofuscación. Las pruebas garantizan la estabilidad y el funcionamiento correcto de su código. Si despliega en hosts en modo FIPS, consulte también Conformidad con FIPS, ya que varias capas de cifrado descifran en tiempo de ejecución mediante el proveedor criptográfico de la plataforma.

Con estos consejos de ofuscación puede sacar el máximo partido a Babel Obfuscator y reforzar la seguridad de su código. Para obtener información más detallada y una guía completa, se recomienda consultar la guía del usuario de Babel Obfuscator.

Last updated on