Título: [C++] Inyección de código en memoria- Aplicación crashea Publicado por: Kaxperday en 6 Abril 2016, 18:58 pm Hola buenas, hace pocos días estuve leyendo sobre el API hooking y de allí salté a la inyección de DLL, y más adelante pasé a la inyección de código, y ayudándome con un código que encontré en rohitab fuí dando forma a mi código y puse control de errores. Este es el link por si a alguien le interesa, me fue muy útil:
http://www.rohitab.com/discuss/topic/39357-code-cave-injection-tutorial-c/ El programa inyecta un MessageBox en la aplicación objetivo, tras salir el MessageBox y pulsar aceptar se cierra la aplicación objetivo. Desconozco el porqué, os dejo el código a ver si me podéis ayudar a saber: Código
Al ejecutar el programa ejecuta todo sin errore y muestra "Injection completed!", pero al cerrar el MessageBox que invoco el la aplicación a la que inyecto esta se me cierra también. Creo que se debe al calculo del tamaño de la función a inyectar, quizás dependiendo de un compilador pueda variar el resultado. Saludos y gracias. Título: Re: [C++] Inyección de código en memoria- Aplicación crashea Publicado por: fary en 7 Abril 2016, 11:15 am ¿GetTargetThreadIDFromProcName?
¿Podrías poner el código completo e indicar que compilador estas usando? saludos. Título: Re: [C++] Inyección de código en memoria- Aplicación crashea Publicado por: Kaxperday en 7 Abril 2016, 12:39 pm ¿GetTargetThreadIDFromProcName? ¿Podrías poner el código completo e indicar que compilador estas usando? saludos. Hola fary, gracias por la respuesta. GetTargetThreadIDFromProcName es GetPIDFromProcName que lo cambié el nombre para que fuera más sencillo, eso ha sido un fallo de edición, es simplemente una función que devuelve el PID de un proceso que le pasas como argumento. Es GetPIDFromProcName vamos XD. El caso es el compilador y que no se como usar el debugger para pillar las direcciones de las funciones y en qué puede ayudarme a pesar de que he estado buscando sobre ello. Uso visual studio 2013 (v120). El compilador es derivado de g++ es propio de VS. Calculo el tamaño de la función con delimitandola con otra función static, pero ese método inestable para calcular el tamaño de la función dependiendo del compilador. Es probable que el mismo código funcione en codeblocks sin problemas. Pero en caso de ser eso lo que falle, ¿como puedo arreglarlo?, ¿dónde debería de inspeccionar?. Seguiré probando más adelante con la versión release y otros compiladores, pero tengo que hacerlo con el de VS. Un saludo. Edito: Buenas acabo de probar el código en codeblocks y funciona sin problemas, codeblocks usa g++ y para C gcc si no mal recuerdo. Luego no es problema del código, es del compilador. Título: Re: [C++] Inyección de código en memoria- Aplicación crashea Publicado por: fary en 7 Abril 2016, 13:40 pm Me alegro de que hallas podido solucionar el problema.
En este caso podrías haber mirado lo que sucedia abriendo el ejecutable en cuestion en el que se va a inyectar el código con OllyDbg y poniendo en BP en la API MessageBoxA. Al inyectar el código se te pararía el programa y podrías ver donde esta el error. saludos. Título: Re: [C++] Inyección de código en memoria- Aplicación crashea Publicado por: Kaxperday en 7 Abril 2016, 17:26 pm Bueno solucionado todavía no está, aunque si he confirmado que el problema tiene que ver con el compilador como suponía, luego el código está bien.
Ahora, creo que se puede solucionar de las siguientes maneras: - Cargando el código a inyectar ya compilado en una variable e inyectar desde ella (no me acaba de gustar, pero ahí esta). - Cambiando de compilador, el compilador de visual studio creo que ofusca el código y es por eso que falla, con otro funcionaría. Pero aún así no se podrian usar crypters ni nada por el estilo con el ejecutable, ya que al acceder al código a inyectar si esta ofuscado no funcionaría (aunque dependería del crypter algunos si), y eso es buena **. - Como tú dices abriendo el ejecutable con el ollydbg, pero si por cada vez que lo vuelvo a compilar o cada cambio que añado tengo que estar haciendo eso para que funcione y buscando las direcciones de memoria y tal, tampoco me parece un buen método, pero es lo que más me convence aunque ahora mismo no sabría como hacerlo. El problema de la inyección de código es: ¿es compatible con crypters?. Luego me pondré a mirar como va eso del ollydbg a ver si encuentro algo X"D Saludos!. Título: Re: [C++] Inyección de código en memoria- Aplicación crashea Publicado por: fary en 7 Abril 2016, 21:12 pm Aqui tienes un código de ejemplo en C funcional.
https://foro.elhacker.net/net/inyeccion_dll_sin_dll_by_e0n_problema_edicion_de_memoria_convertir_a_c-t267355.0.html Se puede inyectar código que tengas almacenado en una variable, sí, eso se llama Shellcode. Con lo de los cripters te refieres si se puede cifrar el exe que inyecta? Título: Re: [C++] Inyección de código en memoria- Aplicación crashea Publicado por: pinkiepie en 8 Abril 2016, 00:38 am No se trata del compilador exactamente, sino de características del código compilado (el compilador añade cosas caprichosamente que se pueden desactivar/remover [?]).
Deberías revisar las instrucciones de la función a inyectar mediante IDA o algún debugger. Lo más probable es que encuentres al menos un CALL a una dirección de memoria, situado posteriormente al MessageBoxA, "perteneciente" al 'inyector' y no a chrome.exe. La función a la que intenta llamar el thread corresponde a _RTC_CheckEsp (al menos en VS2015). Pertenece a un conjunto de funciones que agrega el compilador para reportar errores en run-time, y se encuentra dentro del mismo ejecutable compilado. Te recomiendo visitar este enlace para que conozcas con más detalle sobre lo que es RTC (Run-Time Error Checking) y cómo desactivarlo: https://msdn.microsoft.com/en-us/library/8wtf2dfz.aspx Título: Re: [C++] Inyección de código en memoria- Aplicación crashea Publicado por: burbu_1 en 8 Abril 2016, 18:08 pm Culpar al compilador de que tu código falle me parece muy chulito......
Aqui tienes un código de ejemplo en C funcional. https://foro.elhacker.net/net/inyeccion_dll_sin_dll_by_e0n_problema_edicion_de_memoria_convertir_a_c-t267355.0.html ésos son códigos....... has probado a reservar memoria como hace él/ella???? Título: Re: [C++] Inyección de código en memoria- Aplicación crashea Publicado por: fary en 8 Abril 2016, 19:21 pm Culpar al compilador de que tu código falle me parece muy chulito...... ésos son códigos....... has probado a reservar memoria como hace él/ella???? :huh: no entiendo tu post :s Lo más fácil y mejor es que suba el ejecutable que genera y lo revisamos desde un debugger... Saludos!! Título: Re: [C++] Inyección de código en memoria- Aplicación crashea Publicado por: pinkiepie en 8 Abril 2016, 19:53 pm Pues yo insisto en que el problema son las verificaciones run-time que agrega VS a las funciones.
Quité Run-Time Error Checking en las opciones del proyecto, compilé el programa (con VS2015), y no hubieron más crashes. Función inyectada con RTC activado: Código
Función inyectada sin RTC: Código
Título: Re: [C++] Inyección de código en memoria- Aplicación crashea Publicado por: Kaxperday en 8 Abril 2016, 20:39 pm Bueno siento no haber respondido antes, pero estoy ocupado sin embargo he ido leyendo poco a poco los mensajes, y ahora he hecho un hueco para responder.
El código como dije funcionaba el codeblocks luego no era problema de código, iba a probar a compilarlo release, y buscar la función que se inyectaba aunque si bine la primera por tiempo, la segunda no tuve suerte. He probado lo que decía pinkiepie de desactivar el RTC y ha funcionado a la primera. ¡BRAVOO! Así que muchas gracias a todos, en especial a pinkiepie, bienvenido al foro que te has creado cuenta solo para responder parece XD, un abrazo. Cuando tenga tiempo estudiaré a fondo el tema, y me pondré con hexadecimal y ollydbg. Saludos. |