Título: Ayuda con hooks Publicado por: Josta en 24 Diciembre 2013, 05:48 am Hola, realmente no se nada de ASM, en c++ hice unos hooks buscando en internet y apoyandome con detours, en windows mi hook funciona a la perfeccion, pero resulta que quiero hacer uno para linux, y con una funcion que encontre, segun lo que lei, esta ingresa un jmp en la funcion original para hacer la llamada a mi funcion, eso funciona hasta ahi, lo que pasa es que yo quiero que al finalizar mi funcion, esta continue en la original, un esquema sería algo así:
Código
El código que tengo es el siguiente, el que incluye mi hook hecho en windows con detours, por si acaso tienen duda, el hook lo hago a una función que está en un ejecutable del cual no tengo el código fuente( samp-server.exe ), ahí viendo el código ustedes se darán cuenta de lo que intento hacer.. Código
Por cierto, las direcciones las saque con IDA Pro, aquí están Código
Título: Re: Ayuda con hooks Publicado por: xv0 en 24 Diciembre 2013, 11:02 am Ese hook lo que hace por lo que veo es bloquear direcciones de entrada, pero como es C++ no dijo nada mas.
segun lo que lei, esta ingresa un jmp en la funcion original para hacer la llamada a mi funcion, eso funciona hasta ahi, lo que pasa es que yo quiero que al finalizar mi funcion, esta continue en la original Supongo que esa es la pregunta, ya que no veo nigun codigo en ASM. La mejor opcion seria si puedes substituir ese jmp por un call, el call de la funcion original llama a tu funcion y esta instruccion carga en el stack la siguiente direccion de la funcion original, cuando estes en tu funcion simplemente retornas a la original con un ret. Vamos es lo normal, pero si no puedes substituir nada tienes que replantearlo de otra manera. Un saludo. Título: Re: Ayuda con hooks Publicado por: Josta en 24 Diciembre 2013, 22:49 pm Lo hice así, nomás cambie el 0xE9 por 0xE8, que lo que hace es el call, y en la funcion al final puse asm("ret"); pero al momento de ejecutarse da crash y en la ventana aparece Violación de segmento (`core' generado)
Código
Código
Título: Re: Ayuda con hooks Publicado por: xv0 en 25 Diciembre 2013, 06:09 am Pero acaso sabes el estado del stack?
Esa funcion utilizara la pila, y la direccion con la que ret salta a lo mejor se modifica, depuralo. Un saludo. P.D: Creo que estas en el subforo equivocado. Título: Re: Ayuda con hooks Publicado por: Josta en 26 Diciembre 2013, 02:21 am No, no lo se. Crees que puedas enseñarme lo básico? Tienes skype? Sería de mucha ayuda
Título: Re: Ayuda con hooks Publicado por: xv0 en 27 Diciembre 2013, 11:35 am No utilizo Skype, prueba desensamblando las funciones para saber como esta el estado del stack. Igualmente como no se trata de mi lenguaje no tengo muy claro que se hace, se llama ala funcion OnSAMPQuery y si no es un win32 retorna.
Pero no entiendo, si no es win32 no llama a esa funcion no? Mejor explica paso a paso y si te lias con el dissasembler dimelo. Un saludo. Título: Re: Ayuda con hooks Publicado por: Josta en 27 Diciembre 2013, 23:17 pm Esos if's son ejecutados por el compilador, _WIN32 se define cuando el compilador esta bajo windows, si es así se incluye ese código, si no, significa que es linux y se añade el equivalente para linux
Esta es la función original desensamblada http://pastebin.com/pQTwxJPt Y esta es la del .so http://pastebin.com/Dd5xSdhP P.D: Alguna forma por la que podamos conversar? sería mas rápido que aquí en el foro Por cierto, tengo entendido que en linux los códigos se compilan bajo la sintax AT&T y no la de Intel EDIT: Encontré la forma de sacar el asm del código generado por el mismo compilador, y puedo compilar el .so con el asm directamente, te lo dejo aquí, creo que así sería más fácil para ti comprender el código, si tu modificas el asm yo veo como implementarlo en C++ http://pastebin.com/PED4a3QG Título: Re: Ayuda con hooks Publicado por: xv0 en 28 Diciembre 2013, 01:32 am No, no hace falta que sean de la sintaxis AT&T, depende del ensamblador pero yo estoy acostumbrado ala de AT&T.
Bien ese dissasembler generado por gcc no me gusta, no pretendo ser quisquilloso pero te importaria poner el dissasembler del binario con objdump? Código: objdump -d <binario> Es la costumbre ;D. Leyendo un poco, bueno supongo que tu tambien llegaste a eso, la funcion OnSAMPQuery comienza en .LC7, en .L267 se pasan los parametros de la funcion logprintf como puedes observar se mueve el offset .LC7 que es donde esta la direccion del mensaje, mas abajo en .LEHB8 esta la funcion BanIP. Pero si me das el dissasembler con el objdump ya lo entiendo todo, es que asi no me gusta leerlo. Un saludo. Bueno como no me pasas el dissasembler con la sintaxis que me gusta no podre ayudarte mejor, pero porque no dejas el codigo como antes, sin el call, y donde pusiste el ret pon un simple salto hacia tu funcion origional. Código
Un saludo. Título: Re: Ayuda con hooks Publicado por: Josta en 31 Diciembre 2013, 01:59 am Andaba un poco ocupado, y eso que dices creo ya haberlo hecho y lo único que causa es un loop infinito creo
Título: Re: Ayuda con hooks Publicado por: xv0 en 2 Enero 2014, 10:47 am Cierto, no se porque dije eso, la funcion original llamaria a OnSAMPQuery y al comprobar el if volveria a saltar al principio de la funcion original y esta volveria a llamar a OnSAMPQuery se volveria a comprobar el if y volveria a saltar creando un bucle infinito.
Ya que o me subes el codigo dessemsamblado con objdump y no se donde poner el retn, seme ocurre que pongas una "etiqueta" en la funcion original despues de la llamada a la funcion OnSAMPQuery y diciendo que al if que salte a esa "etiqueta" o offset llamalo como quieras. No se como se hace eso en C++, pero aqui tienes un ejemplo en ASM mezclado. Código
Creo que asi funcionaria, no tiene porque hacer un ciclo infinito. Un saludo. Título: Re: Ayuda con hooks Publicado por: Josta en 3 Enero 2014, 04:24 am http://pastebin.com/rU337ft7
Ahí tienes el desensamblado Eso que me dices no tengo idea como hacerlo, déjame investigar un poco Título: Re: Ayuda con hooks Publicado por: xv0 en 3 Enero 2014, 05:45 am Bien, creo que esa seria una solucion, antes de leer todo eso. En la funcion OnSAMPQuery si es un Linux quieres que retorne a alguna direccion. Bien colocando una etiqueta que no es mas que un simbolo enrealidad saltas a una direccion, pues pon esa etiqueta donde quieras que salte si es un Linux, para que no cree un ciclo infnito, o lo que sea.
Como ya tengo un lio montado no se si te refieres a esto. Código
Si no es asi, puedes colocar esa etiqueta donde quieras que salte, en los if de OnSAMPQuery. Espero que lo entiendas. Un saludo. Título: Re: Ayuda con hooks Publicado por: Josta en 4 Enero 2014, 01:11 am Lo que pasa es que no tengo acceso al fuente del ejecutable
Título: Re: Ayuda con hooks Publicado por: xv0 en 4 Enero 2014, 06:28 am Pues estamos como antes, biendo el dissasembler anterior prefiero hacer esto que te digo, se puede hacer igual no importa que no tengas el codigo, simplemente tienes que buscar el offset al que quieres saltar haciendo un dissasembler a ese ejecutable y luego poner un jmp en el if como te comente antes.
Quieres que salte despues de una llamada concreta no? Intenta hacerlo tu solo, si no puedes ya sabes que tienes que subir el dissasembler, pero algunas partes no hace falta que lo subas todo. Un saludo. |