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