Imagen destacada Ofuscación

Ofuscar y proteger nuestras aplicaciones .Net

Al igual que con otros lenguajes de programación, nuestras aplicaciones se pueden decompilar muy fácilmente lo que provoca que puedan leer nuestro código. En esta entrada vamos a ver cómo proteger nuestros ensamblados mediante la ofuscación de código fuente, lo que dificultará y mucho a quién lo intente.

Proteger nuestros ensamblados totalmente es imposible, alguien con la suficiente dedicación, tiempo y conocimientos podría rompernos la aplicación, y de eso es lo que se trata, que tenga que dedicarle tantas horas y tanto tiempo que desestime el intentarlo.

Recientemente leí un hilo en los foros de MSDN donde un programador había hecho una aplicación para un cliente, le llamaron por un fallo y su sorpresa al llegar es que su programa tenía opciones que él no había puesto allí, y resulta que eran las que daban el problema. La explicación del cliente era que un sobrino que estaba estudiando «de esto» lo había hecho. Esto podría tener consecuencias legales para el cliente, sobre todo si en la licencia del programa hemos puesto la prohibición de realizar ingeniería inversa a nuestro software. Pero en estos casos, cuando te enteras por casualidad, tu aplicación no es muy conocida o tu competencia muy directa, a parte de cláusulas legales prefiero hacer sudar a quien lo intente.

Puede también darse el caso de que una empresa de la competencia vea cómo hacemos las cosas, funcionalidades que nos han llevado muchísimas horas las obtienen gratis y sin invertir tiempo.

Por otro lado también protegemos al cliente, contra alteraciones malintencionadas en nuestro programa, o que puedan acceder a sus datos e información. Aunque es una mala práctica poner contraseñas en el código, cuando utilizas una base de datos local, es lo más rápido y menos problemático en cuanto a mantenimiento.

¿Cómo puedo ofuscar mi código C# ?

Existen varias herramientas que de forma muy sencilla lo podemos realizar, algunas son gratuitas de las que hablaré a continuación, y otras de pago que también vamos a probarlas.

En primer lugar he realizado un programa en WPF muy sencillo, para ver cómo se comportan los diferentes ofuscadores de código y el programa es el siguiente:

using System;
using System.Windows;

namespace PruebaObfuscacion
{
    public partial class MainWindow : Window
    {
        private string ContraseñaSuperSecreta = "holaMundo";
        public MainWindow()
        {
            InitializeComponent();
        }

        public void AlgoritmoSuperSecreto()
        {
            var variable1 = "Codigo";

            if (variable1 != ContraseñaSuperSecreta)
            {
                Console.WriteLine("Algoritmo SuperSecreto: Las variables no son iguales");
            }

        }
    }
}

El primero que voy a utilizar es Obfuscar que es un paquete nuget y podéis encontrar más información en su web. Lo primero que hay que hacer es crear un archivo xml con la configuración:

<?xml version='1.0'?>
<Obfuscator>
  <Var name="InPath" value="." />
  <Var name="OutPath" value=".\Obfuscator_Output" />
  <Var name="HidePrivateApi" value="true" />  
  
  <Var name="HideStrings" value="true" />
  <Var name="RenameProperties" value="true" />
  <Var name="RenameEvents" value="true" />
  <Var name="RenameFields" value="true" />
  <Var name="ReuseNames" value="true" />
  

  <Module file="$(InPath)\PruebaObfuscacion.exe" />  
</Obfuscator>

Es necesario añadir un evento de posterior a la compilación en las propiedades del proyecto para que nos genere el ensamblado ofuscado en la carpeta que hemos indicado con OutPath en la configuración:

"$(Obfuscar)" obfuscar.xml

Veamos el resultado con de una aplicación tan sencilla y con una configuración de ofuscación básica, para ello voy a utilizar una dotPeek que es gratuita y funciona bastante bien.

Resultado del programa dotPeek con el ofuscador "obfuscar"
Resultado del programa dotPeek con el ofuscador «obfuscar»

Bueno, parece que hemos complicado un poco el asunto, ya no es tan sencillo leer la contraseña súper secreta y ver que hace el algoritmo super secreto. Obviamente esto es un ejemplo de una aplicación WPF con escasas líneas de código, un programa más grande sería más dificultoso.

No he podido ofuscar el nombre de la función «AlgoritmoSuperSecreto()» y me parece importante, ya que puede dar pistas de por dónde empezar a descifrar esta maraña de código. Tampoco toca el código XAML.

Ahora vamos a probar una solución más avanzada, el conocido ConfuserEx aunque el estado actual de la herramienta está descontinuada, podría servir para algunas aplicaciones. Voy a establecer la máxima protección con todas las medidas posibles:

Bueno pues el resultado es sorprendente, no sé qué mostrar, en principio creo que todo empieza por este Main en un archivo de más de 10000 líneas de código:

Resultado de ConfuserEx para ofuscación de código
Resultado de ConfuserEx

Aunque el resultado es excelente para una herramienta gratuita, y no puedo poner «peros» a la ofuscación, he analizado el ensamblado en VirusTotal y da positivo o falso positivo con 15 antivirus de 72. No he leído el código fuente para comprobar que es falso positivo, pero aunque así lo fuera sería inaceptable para algunos clientes. Tal vez jugando con las opciones de protección se pueda conseguir que no salten las alarmas.

Para algunos casos estas soluciones gratuitas pueden ser suficiente, existen en el mercado alternativas, he probado la demo en algunas y las protecciones son tan altas que ya no son válidas herramientas como dotPeek y el coste de la licencia puede ser asumible dependiendo del tipo, las más conocidas son:

  • NetReflector
  • Skater .NET Obfuscator (Tiene versión Gratuita con menos opciones)
  • SmartAssembly
  • PreEmptive Protection Dotfuscato
  • Eazfuscator

Deja un comentario