Llamadas internas y externas
El proxy dinámico se puede aplicar a dos categorías de llamadas, que se seleccionan con el modo de proxy:
| Modo | Aplica el proxy a las llamadas a… |
|---|---|
external | métodos y constructores definidos fuera del ensamblado que se ofusca: la biblioteca de clases base de .NET y los ensamblados a los que se hace referencia |
internal | métodos y constructores definidos dentro del ensamblado que se ofusca |
all | tanto las llamadas internas como las externas |
Consulte Configuración para seleccionar un modo desde la línea de comandos, MSBuild o Babel Desktop.
Llamadas internas mediante proxy
Usar el proxy dinámico para las llamadas a métodos internos ofrece varias ventajas en cuanto a ofuscación y protección del código. Estas son algunas de las principales:
- Ocultación de los detalles de implementación: al generar proxies dinámicos para los tipos internos, los detalles reales de implementación de esos tipos quedan ocultos para el código externo y los posibles atacantes. Los proxies dinámicos actúan como intermediarios que protegen la lógica interna y la estructura de los tipos, lo que dificulta que actores malintencionados comprendan y manipulen su código.
- Protección de las llamadas a métodos: cuando se usan proxies dinámicos para los tipos internos, a los descompiladores les resulta difícil reconstruir el flujo de llamadas de un método. Los descompiladores analizan el código compilado para generar una representación de alto nivel del código fuente original. Sin embargo, los proxies dinámicos introducen una capa adicional de indirección, que dificulta que los descompiladores sigan con exactitud la secuencia de llamadas a métodos.
- Ofuscación reforzada: el uso de proxies dinámicos para los tipos internos añade una capa adicional de ofuscación a su código. Los proxies introducen complejidad e indirección, lo que hace más difícil que quienes practican la ingeniería inversa comprendan la estructura subyacente y las relaciones de su código. Esto puede disuadir de los intentos de ingeniería inversa y proteger su propiedad intelectual.
Al usar el proxy dinámico para las llamadas internas, se crea una barrera que impide a los descompiladores reconstruir con exactitud el flujo de llamadas de su código. Esto añade una capa adicional de protección y hace más difícil que los atacantes o quienes practican la ingeniería inversa comprendan la lógica subyacente y el comportamiento de su aplicación.
Llamadas externas mediante proxy
Las llamadas externas mediante proxy de Babel Obfuscator son un mecanismo de defensa eficaz frente a los descompiladores que intentan reconstruir los nombres de las variables locales a partir de sus tipos inferidos. Los descompiladores suelen basarse en los metadatos disponibles, como los tipos de las variables, para reconstruir los nombres originales de las variables.
Por ejemplo, en el código descompilado que aparece más abajo, la herramienta dedujo los nombres de variable list1 y count a partir de la llamada al constructor de instancia del tipo List<string> y al método get_Count(), respectivamente.
var list1 = new List<string>();
int count = list1.Count;Cuando las llamadas externas mediante proxy están activadas, Babel Obfuscator sustituye las llamadas directas a métodos de código externo por llamadas a clases proxy generadas dinámicamente. Estas clases proxy actúan como intermediarios que interceptan y redirigen las llamadas a métodos. Como resultado, las llamadas a métodos originales y los nombres de variables locales asociados quedan ocultos y ofuscados.
Con el proxy dinámico activado, el código anterior se convierte en el siguiente:
var local1 = new a();
int local2 = local1.b();Los descompiladores que se basan únicamente en los metadatos para reconstruir los nombres de las variables encuentran dificultades ante las llamadas externas mediante proxy. Como las llamadas a métodos originales se sustituyen por llamadas mediante proxy, los tipos de variable inferidos no aportan por sí solos ninguna información útil sobre los nombres originales de las variables. Esto anula en la práctica la capacidad del descompilador de reconstruir los nombres originales solo a partir de la inferencia de tipos.