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


 


Tema destacado: Deseas probar algunas mejoras a la interfaz del foro? Prueba cake! acerca de


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  Introducción a la inyección de código
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Introducción a la inyección de código  (Leído 4,344 veces)
astaroth7

Desconectado Desconectado

Mensajes: 98


Ver Perfil WWW
Introducción a la inyección de código
« en: 28 Julio 2009, 20:35 »

He escrito este código-tutorial enseñando lo básico sobre inyección de código en memoria sin hacer uso de una DLL.

La inyección de código (code injection) es una técnica que permite introducir y ejecutar una función en una aplicación remota que ya está corriendo. Básicamente se trata de reservar memoria en un ejecutable, copiar un trocito de código en la memoria reservada e iniciar un hilo que ejecute esa función.

Recomiendo mirar en la MSDN la definición de cada API que llamo en este programa , para tener un entendimiento absoluto de lo que está pasando.

Voy a comentar el código de un programa que busca la calculadora de Windows y hace que salte un mensaje desde este programa.

Primero tenemos que definir un tipo para poder llamar a la API MessageBoxA (más información aquí http://msdn.microsoft.com/en-us/library/ms645505(VS.85).aspx). Lo hacemos de esta forma:

Código
  1. typedef int (WINAPI *_MessageBoxA)(HWND, LPCTSTR, LPCTSTR, UINT);



Básicamente, es un puntero a una dirección de memoria, donde se definen los tipos de los parámetros que le vamos a pasar.

Puesto que ejecutaremos la función "en el aire", nos hace falta reservar un lugar en la memoria para poder pasarle parámetros. La estructura será la siguiente:

Código
  1. struct TDatos_MessageBoxA
  2. {
  3.    _MessageBoxA direccionMessageBoxA;
  4.    char titulo[255], texto[255];
  5. };



En direccionMessageBoxA irá la dirección a la API, y en las dos cadenas irán los parámetros de la función.

Ahora voy a definir la función que vamos a inyectar en la memoria:

Código
  1. void Hilo_MessageBoxA(TDatos_MessageBoxA *datos)
  2. {
  3.    datos->direccionMessageBoxA(0, datos->texto, datos->titulo, 0);
  4. }



Básicamente lo que hace es llamar a la API MessageBoxA y pasarlo los parámetros definidos.

El main de la aplicación sería el siguiente:

Código
  1. int main()
  2. {
  3.    DWORD pID;
  4.    HWND hWnd;
  5.  
  6.    hWnd = FindWindow("SciCalc", NULL);
  7.  
  8.    if(hWnd!=NULL)
  9.    {
  10.        GetWindowThreadProcessId(hWnd, &pID);
  11.        Inyectar_MessageBoxA(pID, "descifra.me", "Codigo inyectado!");
  12.    }
  13.  
  14.    return 0;
  15. }
  16.  


Lo que hacemos aquí es buscar la ventana de la calculadora, que tiene el nombre de clase "SciCalc". Si la encuentra, llama a una API para obtener el identificador del proceso, y una vez lo tiene llama a la función inyectora de código, que es la que voy a tratar ahora.

Esta es la función más importante. Lo que hace es abrir el proceso que se le pasa con OpenProcess, entonces copia los datos a una estructura, así como la dirección de la API con GetProcAddress. Entonces reserva memoria con VirtualAllocEx, y escribe esos datos con WriteProcessMemory.

Código
  1. void Inyectar_MessageBoxA(DWORD pID, char* titulo, char* texto)
  2. {
  3.    DWORD tamFunc;
  4.    HANDLE tHandle, funcionRemota;
  5.    TDatos_MessageBoxA datos, *direccionDatosRemotos;
  6.    void* direccionFuncionRemota;
  7.  
  8.    tHandle = OpenProcess(PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION | PROCESS_VM_WRITE, false, pID);
  9.  
  10.    datos.direccionMessageBoxA = (_MessageBoxA)GetProcAddress(GetModuleHandle("USER32.DLL"), "MessageBoxA");
  11.    sprintf(datos.titulo, titulo);
  12.    sprintf(datos.texto, texto);
  13.  
  14.    direccionDatosRemotos = (TDatos_MessageBoxA*)VirtualAllocEx(tHandle, 0, sizeof(TDatos_MessageBoxA), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
  15.    WriteProcessMemory(tHandle, direccionDatosRemotos, &datos, sizeof(TDatos_MessageBoxA), NULL);
  16.  


Lo siguiente es obtener el tamaño necesario para escribir el hilo remoto, hay formas mejor de hacerlo, pero de momento esta nos sirve:

Código
  1.    tamFunc = (DWORD)Inyectar_MessageBoxA - (DWORD)Hilo_MessageBoxA;
  2.  


A continuación, escribimos la función remota a ejecutar, como hicimos con la estructura anterior:

Código
  1.    direccionFuncionRemota = VirtualAllocEx(tHandle, 0, tamFunc, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
  2.    WriteProcessMemory(tHandle, direccionFuncionRemota, (void*)Hilo_MessageBoxA, tamFunc, NULL);



Y una vez la tenemos, creamos el hilo remoto con CreateRemoteThread:

Código: Seleccionar todo
    funcionRemota = CreateRemoteThread(tHandle, NULL, 0, (LPTHREAD_START_ROUTINE)direccionFuncionRemota, direccionDatosRemotos, 0, NULL);



Por último, esperamos a que el hilo termine (con WaitForSingleObject), liberamos la memoria reservada con VirtualFreeEx y cerramos el proceso con CloseHandle:

Código
  1.   WaitForSingleObject(funcionRemota,INFINITE);
  2.   CloseHandle(funcionRemota);
  3.  
  4.   VirtualFreeEx(tHandle,direccionFuncionRemota,0,MEM_RELEASE);
  5.   VirtualFreeEx(tHandle,direccionDatosRemotos,0,MEM_RELEASE);  
  6.  
  7.   CloseHandle(tHandle);  
  8. }



Este ejemplo debería de servir para cualquier ejecutable, si lo has entendido bien sabrás qué cambiar, si no leete todo de nuevo ;D

Para que quede más claro, subo el fichero .cpp


« Última modificación: 28 Julio 2009, 21:33 por Eternal Idol » En línea

h0oke


Desconectado Desconectado

Mensajes: 2.059


Coder ~


Ver Perfil WWW
Re: Introducción a la inyección de código
« Respuesta #1 en: 28 Julio 2009, 20:36 »

Nada mal.

Un saludo!


En línea

Eternal Idol
Moderador
***
Desconectado Desconectado

Mensajes: 5.512


La mano invisible del mercado me robo la billetera


Ver Perfil WWW
Re: Introducción a la inyección de código
« Respuesta #2 en: 28 Julio 2009, 20:45 »

¿No es esto spam? Podes copiar y pegar el tutorial ...
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
astaroth7

Desconectado Desconectado

Mensajes: 98


Ver Perfil WWW
Re: Introducción a la inyección de código
« Respuesta #3 en: 28 Julio 2009, 20:49 »

¿No es esto spam? Podes copiar y pegar el tutorial ...

Bueno, el código de los foros phpBB difiere un poco de los SMF... ya me quedó bonito en la otra web, sería pesado "traducirlo", aún así si tengo tiempo lo hago luego.
En línea

Eternal Idol
Moderador
***
Desconectado Desconectado

Mensajes: 5.512


La mano invisible del mercado me robo la billetera


Ver Perfil WWW
Re: Introducción a la inyección de código
« Respuesta #4 en: 28 Julio 2009, 21:01 »

Bueno, el código de los foros phpBB difiere un poco de los SMF... ya me quedó bonito en la otra web, sería pesado "traducirlo", aún así si tengo tiempo lo hago luego.

No hay problema, yo te ayudo.
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
h0oke


Desconectado Desconectado

Mensajes: 2.059


Coder ~


Ver Perfil WWW
Re: Introducción a la inyección de código
« Respuesta #5 en: 28 Julio 2009, 21:04 »

Bueno, el código de los foros phpBB difiere un poco de los SMF... ya me quedó bonito en la otra web, sería pesado "traducirlo", aún así si tengo tiempo lo hago luego.

No hay problema, yo te ayudo.
:xD , Me gusta como ha quedado aqui.
En línea

astaroth7

Desconectado Desconectado

Mensajes: 98


Ver Perfil WWW
Re: Introducción a la inyección de código
« Respuesta #6 en: 28 Julio 2009, 21:28 »

Bueno, el código de los foros phpBB difiere un poco de los SMF... ya me quedó bonito en la otra web, sería pesado "traducirlo", aún así si tengo tiempo lo hago luego.

No hay problema, yo te ayudo.

Gracias.
En línea

Eternal Idol
Moderador
***
Desconectado Desconectado

Mensajes: 5.512


La mano invisible del mercado me robo la billetera


Ver Perfil WWW
Re: Introducción a la inyección de código
« Respuesta #7 en: 28 Julio 2009, 21:33 »

De nada amigo pero la intencion era justamente que NO hicieras spam. ¿Se entendio o no? No hace falta que cites la fuente, al fin y al cabo es tu trabajo (o eso quiero creer), sino pareciera que entraste a este foro para que nosotros entremos al tuyo (no es que yo lo crea, pero cualquier mal pensado lo puede suponer asi).
« Última modificación: 28 Julio 2009, 21:36 por Eternal Idol » En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
0x0309

Desconectado Desconectado

Mensajes: 215


Ver Perfil
Re: Introducción a la inyección de código
« Respuesta #8 en: 28 Julio 2009, 22:09 »

No sabía que podía hacerse algo así. Cuando lo compilé saltó mi antivirus.
Pero funciona.

En línea

protos

Desconectado Desconectado

Mensajes: 26


Ver Perfil
Re: Introducción a la inyección de código
« Respuesta #9 en: 30 Julio 2009, 23:18 »

Ya lo leí todo de nuevo, más de una vez. Pero no veo como utilizarlo. No, no quiero que me digas que cambiar, simplemente entenderlo.

gracias
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Inyección de Codigo para API Hook
Programación C/C++
Keyen Night 5 2,872 Último mensaje 16 Abril 2011, 23:03
por Karman
Introduccion a la ofuscacion de codigo c#
.NET
aixeiger 3 2,429 Último mensaje 30 Agosto 2012, 15:34
por Keyen Night
Dudas con inyeccion de codigo
Programación C/C++
Vaagish 2 595 Último mensaje 24 Septiembre 2013, 20:53
por Vaagish
código de una dll detectada, inyeccion no funcionara?
Análisis y Diseño de Malware
Ragaza 1 1,176 Último mensaje 3 Diciembre 2016, 05:37
por xiruko
Inyeccion de código y persistencia - Zero Day
Bugs y Exploits
Ragaza 2 1,583 Último mensaje 1 Abril 2017, 12:17
por berz3k
Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines