Dudas sobre API hooking

Iniciado por Kaxperday, 4 Abril 2016, 15:09 PM

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

Kaxperday

Hola a todos, resulta que ayer estuve leyendo sobre este método un buen rato, pero sin embargo hay algo que no logro comprender.

Si bien he conseguido hookear una función para que haga lo que yo quiera (En este caso MessageBoxW), el hook no va más allá de mi aplicación, el hook solo me afecta a mi.

Ya que abro otro programa que ejecuta MessageBoxW y no muestra el mensaje del hook.

Luego ¿para que vale esto si solo afecta a nuestro propio programa, o que paso por alto?.

Continue leyendo este tutorial, que esta muy bien y seguro que todos lo habréis leido:

http://www.codeproject.com/Articles/2082/API-hooking-revealed

Y bueno para ejecutar codigo en otro proceso necesitamos inyectar una DLL al proceso del que queremos manipular una función. Para inyectar una DLL con nuestro código si el proceso al que queremos inyectarla usa User32.dll se puede modificar un registro para que cargue nuestra DLL, sino hay otros métodos...

Suponiendo que hemos conseguido que el programa objetivo cargue nuestra DLL, ahora ¿cómo podemos interceptar una función suya y manipularla?. No lo tengo claro, ¿acaso ahora la DLL debería de hookear la función en cuestión que queremos modificar y ahora ya funcionaría debido a que pertenece al mismo proceso?, ¿en eso consiste?, porque sno no veo claro la relación.

Ejemplo: Si queremos manipular HttpSendRequestW de InternetExplorer desde un proceso externo. Planteamiento: cargar nuestra DLL en iexplorer.exe y nuestra DLL tendría un hook para HttpSendRequestW que al ser ejecutada por iexplorer.exe hookearía la API ejecutando nuestro código en cada llamada a la función. ¿Consiste en eso o como?.

Es que estoy empezando a probar un poco de que va esto.

Saludos.

Puff acabo de inyectarme en chorme.exe y ha sido ORGASMICO, ahora voy a probar a manipular sus funciones con algún hook a una de sus funciones.  A ver si se puede.
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

fary

Hola,

La dirección de memoría de la función es la misma para todo el proceso, si es eso a lo que te refieres. Entonces cuando tu pones un salto en esa dirección de memoria afecta a todas las llamadas que se realicen a ella.

CitarEjemplo: Si queremos manipular HttpSendRequestW de InternetExplorer desde un proceso externo. Planteamiento: cargar nuestra DLL en iexplorer.exe y nuestra DLL tendría un hook para HttpSendRequestW que al ser ejecutada por iexplorer.exe hookearía la API ejecutando nuestro código en cada llamada a la función. ¿Consiste en eso o como?.

Sí.

saludos.
Un byte a la izquierda.

Kaxperday

Hola gracias por la respuesta,

He estado haciendo pruebas y funciona, esto esta MUY GUAPO es como mear al SO.

Hasta día de hoy no lo había probado aunque sabía que se podía hacer.

Fácilmente hacer un Form grabber con este nuevo poder XD, solo hay que saber que funciones usa el navegador para hacer las requests la librería donde se encuentra la función y la función en si, nada más me parece.

Es que ví una oferta de 3700€ por un form grabber XD, por eso me intrigué un poco en como sería la idea, la pena que de ingeniería inversa no se mucho, solo ver las librerías que usa y demás, pero no se como detener en el momento que un navegador lanza la request, allí sería solo ver la función y que dependencia tiene, se que hay que hacer pero no como XD, me mirare algo de ollydbg supongo XD.

Saludos y a divertirse!!! ;D ;D ;D ;D
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

Kaxperday

Hola de nuevo, siento el doble post, pero lo veo mejor que abrir otro hilo del mismo tema.

En este caso, mi pregunta es, ¿se puede hacer DLL inyection sin DLL?, es decir sin tener que apuntar a un archivo dll para que se cargue en memoria.

Una solución sería compilar las DLL y crear una variable en la app con su contenido en hexadecimal y luego en ejecución copiar esos bytes en un archivo e inyectarla.

Pero seguro existen otros métodos mejores.

Saludos!!.
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

fary

Aquí tienes un artículo sobre inyecciones de código en memoria.

http://foro.elhacker.net/analisis_y_diseno_de_malware/inyecciones_de_codigo_en_memoria-t446557.0.html

Inyectar código de una dll no sería viable ya que las direcciones en el código no se reubican. Lee el artículo y lo vas a comprender el por qué.

Saludos.
Un byte a la izquierda.

Kaxperday

#5
Cita de: fary en  4 Abril 2016, 20:50 PM
Inyectar código de una dll no sería viable ya que las direcciones en el código no se reubican. Lee el artículo y lo vas a comprender el por qué.

Buenas, a lo que me refería era a pasar el codigo compilado de la DLL con el hook a la API en hexadecimal, y en ejecución a crear un archivo .dll pasando los valores hexadecimales a bytes, en ese caso ya tendríamos el archivo dll y lo podríamos inyectar.

Me he leído tu POST, y no logro comprender pues allí haces un hook a MessageBoxA (una función de la API que no hookeas), inyectando la DLL de User32 que seguramente se encontraría en  el IPC de los programas a los que inyectas.

El caso es, en tu ejemplo les haces cargar una DLL que ya tiene el sistema, no tu propia DLL que contiene las funciones que hookearán la API del programa, por lo tanto es distinto.

Por ejemplo puedo hacer que cualquier programa ejecute lo que quiera haciendole una inyección de DLL, esa DLL puede ser de la API y cargarla y ejecutar sus funciones con los parámetros de la API, O lo que quiero hacer cargar mi propia DLL que no tiene que ver con la de la API inyectarla en proceso y que al hacer el ATTACH hookee una función de la API de ese programa haciendo que haga lo que quiera. Lo que digo se puede hacer y ya lo he probado, lo que me refería era a si puede hacerse sin pasar la DLL, es decir API hooking sin DLL, mediante alguna artimaña para así no estar creando un archivo DLL por cada hook y hacerlo directamente todo desde el ejecutable.

https://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/fd706e03-9385-4d39-ac0f-1076dc282df2/hooking-api-functions-without-dll-c?forum=windowsgeneraldevelopmentissues

Saludos.

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

fary

Un byte a la izquierda.

Kaxperday

Cita de: fary en  5 Abril 2016, 09:52 AM
Te he dicho y te repito que se puede inyectar código en un proceso.

http://foro.elhacker.net/analisis_y_diseno_de_malware/inyecciones_de_codigo_en_memoria-t446557.0.html



Eso ya lo tengo bastante claro, y por supuesto no es a lo que me refiero.

Lo que haces en el hilo es cargar user32.dll en calc.exe y llamar a MessageBoxA desde calc.exe.

Y no, no es eso. Claro que puedes inyectar código, mi pregunta es si se puede hacer sin dll mediante otro método u artimaña.

Porque si queremos crear un hook para una aplicación, deberemos inyectarnos en ella como DLL para poder ejecutar los hooks a sus APIs.

Y como ya dije anteriormente... es costoso porque habría que crear una DLL por cada aplicación a hookear.

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.

fary

#8
Cita de: Kaxperday en  5 Abril 2016, 10:17 AM
Porque si queremos crear un hook para una aplicación, deberemos inyectarnos en ella como DLL para poder ejecutar los hooks a sus APIs.

NO, NO y mil veces mas NO. No tienes porque inyectar una DLL... inyectando código es suficiente.

Te dejo la evidencia aquí:

https://foro.elhacker.net/analisis_y_diseno_de_malware/srcfasm_user_mode_rootkit_findnextfilew-t263230.0.html;new

Es un rootkit viejo, que la última versión de windows en la que funciona es en Windows XP.

CitarY como ya dije anteriormente... es costoso porque habría que crear una DLL por cada aplicación a hookear.

¿Una por cada aplicación? ¿Se puede saber porque tienes que crear una por cada aplicación?
¿No te referirás a hacer un hook genérico para todas las API?


Un byte a la izquierda.

Kaxperday

Cita de: fary en  5 Abril 2016, 10:28 AM
NO, NO y mil veces mas NO. No tienes porque inyectar una DLL... inyectando código es suficiente.

Eso es lo que estoy preguntando, que si se puede hacer sin DLL, luego la respuesta es que sí.

Cita de: fary en  5 Abril 2016, 10:28 AM
¿Una por cada aplicación? ¿Se puede saber porque tienes que crear una por cada aplicación?
¿No te referirás a hacer un hook generico para todas las API?

No solo para una.

Si por ejemplo quieres hookear MessageBox de una aplicación y FindNextFile de otra. Si lo haces inyectando DLLs lo suyo sería hacer una para cada aplicación hookeando la API de cada una, también puedes hacer una sola que hookee una u otra dependiendo del proceso que la llame.

Saludos.
Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.