Unpack ConfuserEx

Si bien sabemos lo fácil que es realizar ingeniería inversa en aplicaciones que utilizan NET Framework como C#, los desarrolladores de aplicaciones e investigadores han invertido tiempo en la búsqueda de soluciones de seguridad que dificulten el trabajo para los reverser, un claro ejemplo de esto lo es ConfuserEx, un protector de aplicaciones .NET (sucesor del proyecto Confuser) de código abierto el cual dispone de los siguientes mecanismos de seguridad:

  • Symbol renaming
  • WPF/BAML renaming
  • Control flow obfuscation
  • Method reference hiding
  • Anti debuggers/profilers
  • Anti memory dumping
  • Anti tampering (method encryption)
  • Embedding dependency
  • Constant encryption
  • Resource encryption
  • Compressing output
  • Extensible plugin API

Dada todas estas características y considerando que es un protector muy utilizado en varias aplicaciones comerciales, en esta entrada del blog se intentará poner a prueba esta protección. A modo de ejemplo, se utilizará un programa real el cual se encuentra protegido por ConfuserEx.

Obteniendo información

Lo primero que he realizado es utilizar la herramienta RDG Packer Detector, la cual me ha mostrado el siguiente resultado:

Si abrimos la aplicación con dnSpy es posible corregir el resultado de RDG Packer Detector, pues la protección real es ConfuserEx v0.5.0 y no Confuser:

Si revisamos un poco el código de la aplicación encontraremos que el código se encuentra ofuscado:

Depurando la aplicación

Lo primero que haremos es dirigirnos al módulo .cctor:

Luego introducimos un breakpoint (clic al lado izquierdo del número de línea o F9) en el segundo módulo:

Presionamos “Start” o F5, nos aparecerá la siguiente ventana en donde se debe seleccionar la opción “Don’t Break” y luego “OK”:

Una vez que el programa se encuentre detenido en el breakpoint que hemos agregado, procedemos a guardar el módulo ejecutable:

Nota
Para visualizar los módulos en dnSpy, se debe ir al menú:

“Debug->Windows->Modules” o presionar Ctrl+Alt+U.

Eliminamos la aplicación de dnSpy, cargamos la aplicación editada y nos dirigimos al módulo .cctor para parchar con instrucciones nops los dos primeros módulos:

Presionamos “OK” y luego en el menú: “File->Save All…”:

Antes de presionar “OK”, seleccionamos la pestaña “MD Writer Options” y configuramos las opciones tal como se muestra en la siguiente imagen:

Nuevamente eliminamos la aplicación de dnSpy, cargamos nuestra última modificación y verificamos que el código se encuentra completamente desofuscado:

Finalmente, ya con un código completamente legible, ya es posible aplicar ingeniería inversa en el código de la aplicación:

Conclusión

Como conclusión fue posible vencer la protección ConfuserEx. Si bien se desconoce si el desarrollador de la aplicación auditada aplicó todos los mecanismos de protección previstos por el packer, se logró realizar ingeniería inversa de forma satisfactoria en un programa comercial.

Compartir

Agregar un comentario