¿Cómo detectar cambios en .text?

Iniciado por Shout, 1 Octubre 2014, 18:39 PM

0 Miembros y 7 Visitantes están viendo este tema.

Shout

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:

*(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...
I'll bring you death and pestilence, I'll bring you down on my own

Eternal Idol

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 ...
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Shout

Cita de: Eternal Idol en  1 Octubre 2014, 18:57 PMSiempre 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.
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...
I'll bring you death and pestilence, I'll bring you down on my own

Eternal Idol

Cita de: Shout en  1 Octubre 2014, 19:50 PM

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.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Shout

Cita de: Eternal Idol en  1 Octubre 2014, 19:51 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.
I'll bring you death and pestilence, I'll bring you down on my own

MCKSys Argentina

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!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


Shout

Cita de: 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!
¡Perfecto!
Parece ser bastante viable. A la que vuelva a casa, lo pruebo y reporto :) La idea es muy buena.

Muchas gracias!
I'll bring you death and pestilence, I'll bring you down on my own

Eternal Idol

Cita de: Shout en  1 Octubre 2014, 19:54 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 ...
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

MCKSys Argentina

Cita de: Eternal Idol en  1 Octubre 2014, 20:13 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...
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


Eternal Idol

Cita de: MCKSys Argentina en  1 Octubre 2014, 20:22 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 ...
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón