viernes, 20 de enero de 2017

Ingeniería inversa de DLLs en Windows

Hola a todos. Hace tiempo escribí un POST sobre como comparar la ejecución de dos programas (o del mismo programa instalado en dos máquinas distintas):
  http://paridasinformaticas.blogspot.com.es/2015/03/comparando-antes-y-despues-con-windows.html

Pero el "Process Monitor" sólo traza las siguientes cosas:
  • Operaciones con disco
  • Operaciones con registro
  • Operaciones de red
  • Operaciones de procesos e hilos

Y a veces necesitamos trazar otras cosas. No sólo para comparar la ejecución de programas, sino también a veces para hacer ingeniería inversa de forma que podamos saber cómo funciona un programa por dentro.

Como primer paso, se puede utilizar el software "API Monitor" de http://www.rohitab.com/

Este es un software genial que trazará las llamadas a las distintas DLLs del sistema y que nos permite además filtrar aquellas llamadas que queremos ver y las que no. También podemos marcarlo todo, trazarlo todo, y tener una traza supercompleta aunque bastante lenta de generar.

Esto para comparar es sencillamente genial, pero para ingeniería inversa tiene una pequeña pega. La pega es que hay ciertas APIs de Microsoft que permiten digamos "saltarse" las llamadas a DLLs. Por ejemplo existe la función "InitializeSecurityContext", que puede ser llamada a través de la DLL, o por el contrario, podemos hacer una llamada a "InitSecurityInterface", traernos la tabla de funciones de seguridad y hacer la llamada a través de ella (con lo cual esa llamada no se trazaría con el API Monitor).

Para esto tenemos otra herramienta, pero que esta vez requiere codificar exactamente lo que queremos trazar, la librería "Detours". Mediante esta librería se carga el software en memoria y luego se parchean las llamadas a las funciones de las DLLs en memoria. Esto no sólo parchea las llamadas del software en sí, sino también las llamadas de las DLLs que son dependencia de ese software.

Por ejemplo, si se parchea la llamada a "AcquireCredentialsHandle", y hacemos una llamada a "AcquireCredentialsHandle" usando el paquete de seguridad "CredSSP", veremos que internamente la librería "credssp.dll" hace otras dos llamadas a "AcquireCredentialsHandle", una con "TSSSP" y otra con "Schannel" como parametros.

Para hacer esto lo más sencillo es seguir el tutorial de:
  https://blogs.msdn.microsoft.com/jannemattila/2009/12/03/modifying-application-behavior-with-detours-for-application-compatibility-reasons/

Tutorial que seguramente tendrás que complementar con algún sencillo tutorial sobre cómo crear una DLL (encontraras cientos con una búsqueda con Google).

Lo mejor de este tutorial es que me permitió conocer el software "PEBrowse" (http://www.smidgeonsoft.prohosting.com/), con el que desensamblar una DLL resulta bastante fácil.

RESUMIENDO: Si aprendes a manejar estas dos herramientas y a crear tus propias DLLs para parchear funciones con "Detours", la ingeniería inversa de una DLL (o de un software) te resultará más sencilla.

Salu2