Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Shout en 1 Octubre 2014, 18:39 pm



Título: ¿Cómo detectar cambios en .text?
Publicado por: Shout en 1 Octubre 2014, 18:39 pm
Buenas!

Hace tiempo que me pica la... curiosidad, y me pregunto: hay alguna manera de saber qué partes del código se están modificando por un DLL?

Es decir:
-> Tengo something.exe
-> Abro something.exe, e inyecto (LoadLibrary, o p.ej. LdrLoadDll) plugin.dll

Suponiendo que el plugin, en alguna parte, tiene este código:
Código:
*(BYTE*) 0xAABBCCDD = 0xC3; // ret a una función
Cómo puedo saber la dirección y los bytes que escribe, sin desempacar ni analizar el DLL? (es decir, en runtime)

Me han dicho que haga hook a "Virtual Instruction Bus", pero se necesita un driver para eso, y no es demasiado recomendable tocarlo a la ligera...


Título: Re: ¿Cómo detectar cambios en .text?
Publicado por: Eternal Idol en 1 Octubre 2014, 18:57 pm
Siempre podes comparar los bytes del binario en disco con los que estan en memoria, es basicamente lo que hace la extension !chkimg (Ext.dll, de los depuradores de Microsoft como WinDbg); aunque no te dira quien modifico que directamente. Si es una DLL va a tener que cambiar la proteccion de memoria para poder escribir y directa o indirectamente usara un servicio del S.O. via NTDLL, podrias interceptarlo ...


Título: Re: ¿Cómo detectar cambios en .text?
Publicado por: Shout en 1 Octubre 2014, 19:50 pm
Siempre podes comparar los bytes del binario en disco con los que estan en memoria, es basicamente lo que hace la extension !chkimg (Ext.dll, de los depuradores de Microsoft como WinDbg); aunque no te dira quien modifico que directamente. Si es una DLL va a tener que cambiar la proteccion de memoria para poder escribir y directa o indirectamente usara un servicio del S.O. via NTDLL, podrias interceptarlo ...
Lo de VirtualProtect lo he pensado y voy a probarlo, pero me da la sensación de que no será demasiado efectivo.
Si no me equivoco, VirtualProtect cambia los permisos de la página entera y no sólo de lo que le indicas (vamos, que pasar 5 o pasar 15 como longitud en bytes acaba cubriendo una página)

No conoces ninguna otra manera de interceptar las modificaciones?
p.ej.
Código:
mov eax, DAC0DEh;
mov byte ptr [eax], C3h;
Esa parte no se puede hookear de ningún modo, ya que son puras instrucciones que van directas al CPU...


Título: Re: ¿Cómo detectar cambios en .text?
Publicado por: Eternal Idol en 1 Octubre 2014, 19:51 pm
Código:
mov eax, DAC0DEh;
mov byte ptr [eax], C3h;
Esa parte no se puede hookear de ningún modo, ya que son puras instrucciones que van directas al CPU...

Pero eso sin previamente cambiar la proteccion de la memoria NO FUNCIONA; al menos siempre que estemos hablando de codigo.


Título: Re: ¿Cómo detectar cambios en .text?
Publicado por: Shout en 1 Octubre 2014, 19:54 pm
Pero eso sin previamente cambiar la proteccion de la memoria NO FUNCIONA; al menos siempre que estemos hablando de codigo.
Yep, he editado el mensaje (estoy desde tapatalk y no me salía tu respuesta). Fíjate.


Título: Re: ¿Cómo detectar cambios en .text?
Publicado por: MCKSys Argentina en 1 Octubre 2014, 20:05 pm
Podrias usar VirtualProtect sobre la sección de codigo con el flag PAGE_GUARD.
Eso raisea una excepcion cada vez que se accede al codigo.

Con un handler podrias saber quien es el que esta tratando de acceder.

Las contras son que al ejecutar, tambien saltará la excepcion y que, ademas, el flag es one-shot; osea, deberas proteger nuevamente la sección despues de cada excepcion.

Saludos!


Título: Re: ¿Cómo detectar cambios en .text?
Publicado por: Shout en 1 Octubre 2014, 20:07 pm
Podrias usar VirtualProtect sobre la sección de codigo con el flag PAGE_GUARD.
Eso raisea una excepcion cada vez que se accede al codigo.

Con un handler podrias saber quien es el que esta tratando de acceder.

Las contras son que al ejecutar, tambien saltará la excepcion y que, ademas, el flag es one-shot; osea, deberas proteger nuevamente la sección despues de cada excepcion.

Saludos!
¡Perfecto!
Parece ser bastante viable. A la que vuelva a casa, lo pruebo y reporto :) La idea es muy buena.

Muchas gracias!


Título: Re: ¿Cómo detectar cambios en .text?
Publicado por: Eternal Idol en 1 Octubre 2014, 20:13 pm
Yep, he editado el mensaje (estoy desde tapatalk y no me salía tu respuesta). Fíjate.

Las paginas son de 4KB, incluso podrias guardar en un buffer antes de llamar a la funcion original y comparar X tiempo despues ...


Título: Re: ¿Cómo detectar cambios en .text?
Publicado por: MCKSys Argentina en 1 Octubre 2014, 20:22 pm
Las paginas son de 4KB, incluso podrias guardar en un buffer antes de llamar a la funcion original y comparar X tiempo despues ...

O bien implementar un CRC de codigo. Hay muchas opciones...


Título: Re: ¿Cómo detectar cambios en .text?
Publicado por: Eternal Idol en 1 Octubre 2014, 20:47 pm
O bien implementar un CRC de codigo. Hay muchas opciones...

Seguro aunque no te permitiria mas que saber que hubo cambios, algo que se podria derivar directamente de interceptar el cambio de proteccion de la pagina ...


Título: Re: ¿Cómo detectar cambios en .text?
Publicado por: MCKSys Argentina en 1 Octubre 2014, 21:09 pm
Seguro aunque no te permitiria mas que saber que hubo cambios, algo que se podria derivar directamente de interceptar el cambio de proteccion de la pagina ...

Estoy de acuerdo. Creo que la opcion mas viable seria hookear VirtualProtect y VirtualAlloc y verificar las direcciones en que se esta intentando usar la API.

Saludos!

PD: Agregue VirtualAlloc porque usando esa API con MEM_COMMIT y PAGE_EXECUTE_READWRITE da permisos de ejecucion a una pagina sin allocar nada (tecnica usada en exploits).


Título: Re: ¿Cómo detectar cambios en .text?
Publicado por: Eternal Idol en 1 Octubre 2014, 22:38 pm
Estoy de acuerdo. Creo que la opcion mas viable seria hookear VirtualProtect y VirtualAlloc y verificar las direcciones en que se esta intentando usar la API.

Saludos!

PD: Agregue VirtualAlloc porque usando esa API con MEM_COMMIT y PAGE_EXECUTE_READWRITE da permisos de ejecucion a una pagina sin allocar nada (tecnica usada en exploits).

Si, aunque mejor interceptar en NTDLL.