elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Curso de javascript por TickTack


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Compilador para hookear funciones
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Compilador para hookear funciones  (Leído 3,122 veces)
Halos

Desconectado Desconectado

Mensajes: 14



Ver Perfil
Compilador para hookear funciones
« en: 2 Abril 2013, 14:07 pm »

Buenas, estoy haciendo un programa en C++ que me hookea varias funciones del sistema para monitorizar las acciones del usuario. Empecé hookeando el típico MessageBox y va sin ningún problema. El problema viene ahora cuando aspiro a algo más, como por ejemplo InternetConnect. Inyecto la DLL en el proceso sin ningún problema y se parchean bien las APIs de mi interés. La ejecución dentro de mi función no da fallos, pero el problema viene al hacer el 'retn'.

Con el Olly he visto que la pila queda niveles diferentes (que no se limpia bien al salir de la función inyectada) cuando vuelve de la llamada InternetConnectA sin hookear y hookeada. Me da la sensación de que la culpa es de mi compilador, ya que uso el g++ de MinGW. He probado el compilador de Borland y me da fallos que por lo visto se pueden arreglar si instalo la interfaz gráfica. El hecho es que yo soy más de editor de texto y terminal para programar y compilar. No sé si seguir buscando otro compilador más Microsoft y menos "linuxero" como el de MinGW o si es un fallo mio.

Básicamente mi manera de hookear es la siguiente:
1. Aprovechando el hotpatching de windows y hago un salto a los 5 bytes anteriores, donde se encuentra el salto a mi código (compilado con g++)
2. Desde mi código guardo en un fichero info de la conexión obtenida a través de los parámetros. Vamos, que no modifico los parámetros para nada. (El fallo no está en este código del fichero, probé a comentarlo y seguía dando el fallo).
3. Llamo a la función original.  (Esta dirección la obtendo sumando 2 a la dirección que me devuelve GetProcAddress, así evito el salto a mi código.
4. Devuelvo el valor que me ha dado la función original.

Mi sensación es que al mezclar código de windows con código compilado con g++ es cuando empiezan a ocurrir las cosas extrañas. ¿Puede ser esa la razón? ¿Qué usáis vosotros para crear vuestras DLL para inyectarlas?

Un saludo y gracias


En línea

Halos

Desconectado Desconectado

Mensajes: 14



Ver Perfil
Re: Compilador para hookear funciones
« Respuesta #1 en: 2 Abril 2013, 14:54 pm »

Sigo analizando qué es lo que ocurre y he visto que la función MessageboxA, cuando la hookeo, aunque no me da ningún problema, en verdad se queda la pila sucia, y cada vez con más y más basura.

Os dejo aquí el código de las funciones inyectadas: https://gist.github.com/anonymous/63c842a743a8ea49fea9

¿Puede ser que el fallo esté ne los typedef? Me da que por algún lado el código no sabe limpiar la pila porque no "sepa" la cantidad de parámetros que le llegó.


« Última modificación: 2 Abril 2013, 14:57 pm por Halos » En línea

ukol

Desconectado Desconectado

Mensajes: 55


Ver Perfil
Re: Compilador para hookear funciones
« Respuesta #2 en: 2 Abril 2013, 14:59 pm »

Hace mucho hice un hooker en C (con objetivo de hacerlo lo más que pudiera en C), ya no recuerdo mucho, me acordé porque ayer rebuscando por el disco buscando música encontré el proyecto aunque ya no sé donde está de nuevo :( y no tengo ganas de buscarlo.
Pero creo que había varios problemas.
Primero no usas el hotpatching de Windows, eso me lió un poco, corrígeme si me equivoco. O sea, lo haces tu a mano. Si no es así de esa tecnología no sé nada, seguro que encuentras info por ahí.
En otro caso, en C puro no lo puedes hacer (pero sí con extensiones de los compiladores).
C++ creo que es más complicado a nivel binario, añaden mucha porquería... no te sé decir.

Mmmm... cuanto lío, acabo de borrar un tocho que tenía escrito detallando las cosas a tener en cuenta...
creo que lo más sencillo es esto:
Coge el debuguer y pon un break en la api (en el patch), sigue paso a paso hasta volver a la función llamada, la pila tiene que ser la misma, es lo único que importa. Rastrea lo que la modificó.

(No leí el nuevo mensaje)
En línea

ukol

Desconectado Desconectado

Mensajes: 55


Ver Perfil
Re: Compilador para hookear funciones
« Respuesta #3 en: 2 Abril 2013, 15:06 pm »

La convención de llamada por defecto de C/C++ no es cdecl? puede ser eso?
En línea

85

Desconectado Desconectado

Mensajes: 206



Ver Perfil WWW
Re: Compilador para hookear funciones
« Respuesta #4 en: 2 Abril 2013, 16:35 pm »

si capo, si el problema fuera ese fijate los typedef

y mirá esto de paso http://foro.elhacker.net/programacion_cc/gltest1_problema_con_la_convencion_de_llamada-t384879.0.html

Saludos

En línea

Me cerraron el Windows Live Spaces, entonces me creé un WordPress XD
http://etkboyscout.wordpress.com/
BloodSharp


Desconectado Desconectado

Mensajes: 804


El Messi-Vegeta :D


Ver Perfil
Re: Compilador para hookear funciones
« Respuesta #5 en: 3 Abril 2013, 04:57 am »

La convención de llamada por defecto de C/C++ no es cdecl? puede ser eso?

Sí, la convención por defecto de Mingw es cdecl, lo recuerdo por un problema que tuve de corrupción de pila en kernel en un hook de sysenter :silbar: (Lindas pantallas azules que tuve por eso...  :rolleyes:)

en cuanto al prototipo de tu función que apunta a la dirección original fijate que la declaraste con la convención stdcall, por lo cuál la función hookeada también debería estar escrita de la misma manera:

Ejemplo:
Código
  1. HINTERNET __stdcall HookerInternetConnect(...)


B#
En línea



Halos

Desconectado Desconectado

Mensajes: 14



Ver Perfil
Re: Compilador para hookear funciones
« Respuesta #6 en: 3 Abril 2013, 09:06 am »

Gracias por las respuestas! La cosa andaba por donde apuntasteis, por la convención de las llamadas utilizada. He compilado la DLL con el cambio que me sugirió IEAX añadiendo __stdcall en las funciones, ya que no era suficiente añadir el __stdcall en el typedef, y va a las mil maravillas.  ;-)

Gracias también por el enlace de 85. De depurar y depurar programas había visto que el manejo de la pila era diferente de un programa a otro, pero desconocía los diferentes estándares, así que no sabía la razón de poner el "__stdcall" en el typedef.
En línea

85

Desconectado Desconectado

Mensajes: 206



Ver Perfil WWW
Re: Compilador para hookear funciones
« Respuesta #7 en: 4 Abril 2013, 02:43 am »

si son detalles importantes, mirá este es otro 'aprouch' XD
http://foro.elhacker.net/programacion_cc/dll_wrapper_1_creando_nuestra_psapidll_sin_def-t386998.0.html


En línea

Me cerraron el Windows Live Spaces, entonces me creé un WordPress XD
http://etkboyscout.wordpress.com/
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
hookear un browser en vb
Programación Visual Basic
achernar_ 5 2,961 Último mensaje 1 Octubre 2008, 17:04 pm
por achernar_
Sobre hookear teclado en c#
.NET (C#, VB.NET, ASP)
Foxzer 1 2,688 Último mensaje 15 Mayo 2010, 07:05 am
por BlackZeroX
Error intentando hookear FindNextFileA
Análisis y Diseño de Malware
fary 2 2,876 Último mensaje 5 Agosto 2011, 13:13 pm
por fary
Duda si hookear TerminateProcess
Programación C/C++
t4r0x 3 2,804 Último mensaje 14 Febrero 2012, 12:18 pm
por Eternal Idol
Compilador de Borlland c++ para 64 bits
Programación C/C++
RICHI140206 1 2,249 Último mensaje 20 Octubre 2021, 02:11 am
por Eternal Idol
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines