inyeccion de dll en c++

7
Hola a todos y bienvenidos nuevamente a otro post sobre programacion! Despues de estar más desaparecido que Político con honestidad, he vuelto con unos tutoriales sobre programacion en C/C++ Hoy aprenderemos como editar los valores de la/las variables de nuestro proceso a "hookear" y como inyectar DLL/s en proceso/s ajeno/s en c++... + ¿Y que son los trainers e inyectores? - Buena pregunta, comenzemos por lo que es un "trainer" Un "trainer" es un pequeño programa que se corre en segundo plano, junto con el game para el cual fue diseñado y sirve para "hackear" el juego, de tal modo que puedas tener por ejemplo salud infinita, todas las armas, balas infinitas, etc., con solo presionar una tecla y sin necesidad de introducir códigos. y un inyector de DLL: es un programa el cual inyecta el codigo de un DLL dentro de un proceso ajeno ,por ejemplo los hacks, que son partes del codigo que interactuan con el codigo del juego el cual representa graficamente por ejemplo cuadrados rojos como los conosidos ESP. + Pero ph3nn0m, ¿para que nos podria servir esto? - y... esto seria el principio basico de como funcionan los famosos "Trainers de juegos" e inyectores de DLL para hacks/cheats, para juegos como el Counter-Strike, entre otros..

Upload: sam-smith-de-la-vega-contreras

Post on 13-Aug-2015

381 views

Category:

Documents


6 download

TRANSCRIPT

Page 1: Inyeccion de Dll en c++

Hola a todos y bienvenidos nuevamente a otro post sobre programacion!

Despues de estar más desaparecido que Político con honestidad, he vuelto con unos tutoriales sobre programacion en C/C++ 

Hoy aprenderemos como editar los valores de la/las variables de nuestro proceso a "hookear" y como inyectar DLL/s en proceso/s ajeno/s en c++... 

+ ¿Y que son los trainers e inyectores? 

- Buena pregunta, comenzemos por lo que es un "trainer" 

Un "trainer" es un pequeño programa que se corre en segundo plano, junto con el game para el cual fue diseñado y sirve para "hackear" el juego, de tal modo que puedas tener por ejemplo salud infinita, todas las armas, balas infinitas, etc., con solo presionar una tecla y sin necesidad de introducir códigos. 

y un inyector de DLL: es un programa el cual inyecta el codigo de un DLL dentro de un proceso ajeno ,por ejemplo los hacks, que son partes del codigo que interactuan con el codigo del juego el cual representa graficamente por ejemplo cuadrados rojos como los conosidos ESP. 

+ Pero ph3nn0m, ¿para que nos podria servir esto? 

- y... esto seria el principio basico de como funcionan los famosos "Trainers de juegos" e inyectores de DLL para hacks/cheats, para juegos como el Counter-Strike, entre otros.. 

y otras razones serian, por las de temor de infectarse de virus al usar trainers o inyectores ajenos de paginas que no conosen y/o dudan de su procedencia... 

bueno, comenzare por explicarles la funcion que usaremos para lograr nuestro cometido (editar variables de procesos ajenos), toda esta explicacion ronda sobre la funcion: 

"WriteProcessMemory" procedente de la libreria "windows.h" cual su sintaxis es la siguiente

Page 2: Inyeccion de Dll en c++

que explicare ahora: 

Parámetros: 

[color=#000000][color=#000000] BOOL WINAPI ReadProcessMemory(     HANDLE hProcess,     LPCVOID lpBaseAddress,     LPVOID lpBuffer,     SIZE_T nSize,     SIZE_T *lpNumberOfBytesRead ); 

[/color][/color]

hProcess Un identificador para el proceso con la memoria que se está leyendo. El HANDLE debe tener acceso PROCESS_VM_READ al proceso. 

lpBaseAddress Un puntero a la dirección de base en el proceso especificado de la que leer. Antes de cualquier transferencia de datos, el sistema verifica que todos los datos de la dirección base y la memoria del tamaño especificado es accesible para acceso de lectura, y si no es accesible falla la función. 

lpBuffer Un puntero a un búfer que recibe el contenido desde el espacio de direcciones del proceso especificado. 

nSize El número de bytes que se pueden leer desde el proceso especificado. 

lpNumberOfBytesRead Un puntero a una variable que recibe el número de bytes transferidos en el búfer especificado. Si lpNumberOfBytesRead es NULL, el parámetro es ignorado. 

y su "Valor de retorno": 

Si la función tiene éxito, el valor de retorno es distinto de cero. Si la función falla, el valor de retorno es 0 (cero). Para obtener información sobre el error, llamar a GetLastError. La función falla si la operación de lectura solicitada cruza en un área del proceso que es inaccesible. 

Una vez explicado todo, manos a la obra! 

Page 3: Inyeccion de Dll en c++

TUTORIAL DE "TRAINER" en C/C++ 

una vez explicado que es, y como funciona la funcion "WriteProcessMemory" debemos encontrar una forma de poder conseguir el ID del proceso.. 

he aqui una breve parte del codigo explicando como conseguir el ID del proceso a partir de la busqueda de una ventana con un titulo en especial: 

[color=#000000][color=#000000]  HWND hWnd = FindWindow(0, "Escritorio");  //creamos un HWND ( (h) handle (Wnd) Window. ) y lo llamamos hWnd, este Handle contendra el "valor de retorno de la funcion FindWindows, la cual busca la ventana que diga (en este caso) Escritorio.

  

    if (hWnd == 0) {         //se chequea, si el hWnd obtubo el valor 0 (NULL) muestra error y sale del programa...

        *agregar lo que quiera para mostrar error*         

    } else {                //  si llega a ver otro dato que no sea 0 

        DWORD pId;          //se crea un DWORD llamado pid el cual contendra el PID del proceso que estamos buscando.

        GetWindowThreadProcessId(hWnd, &pId);    //la funcion "GetWindowThreadProcessId" hace que al encontrar la ventana en el "hWnd" vuelque su PID actual en el DWORD pId.

        HANDLE proceso = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pId);   //se creara otro HANDLE llamado proceso el cual usara la funcion "OpenProcess" la cual retorna el proceso en base a la pId obtenida anteriormente.

  

Page 4: Inyeccion de Dll en c++

        if (!hProc) {   //si hubo algun problema anteriormente 

          *agregar lo que quiera para mostrar error* 

        } else {        // sino ... 

[/color][/color]

ya pudiendo "Handlear" nustro proceso a editar ya estamos listos para poder usar la funcion "WriteProcessMemory" 

utilizando parte del codigo anterior para conseguir el proceso y guardarlo en su variable "proceso" solo tendremos que poner el codigo en HEX de la variable a editar (el cod HEX de la variable a editar se puede conseguir mediante programas que lean la memoria del proceso, por ejemplo el Cheat Engine) luego creamos una variable a la que llamaremos en este caso "val" la cual contendra el nuevo valor del proceso a editar... 

ejemplo del codigo: 

[color=#000000][color=#000000] int val = 999; 

WriteProcessMemory(proceso, (LPVOID)0x00000CC4, &val, (DWORD)sizeof(val), NULL); 

[/color][/color]

y asi es como creariamos nuestro editor de memoria a.k.a. "Primer Trainer" en C/C++ (vale aclarar que todo el codigo tiene compatibilidad tanto en C como en C++) 

TUTORIAL "INYECTOR DE DLL" en C/C++ 

en este caso, en vez de editar algun valor de la memoria del programa, haremos una inyeccion de DLL, un sistema comunmente usado por los hacks de los juegos, sean

Page 5: Inyeccion de Dll en c++

wallhacks, aimbots, ESP, No Recoil, ETC 

en este caso usaremos una funcion BOOL la cual retorna "TRUE" o "FALSE" para saber si se inyecto o no 

utilizando la misma API de windows volveremos a utilizar a nuestro querido "WriteProcessMemory" 

aqui les dejo la funcion que utilizaremos* explicada paso a paso: 

[color=#000000][color=#000000] BOOL inyectar(const char * DLL_NAME)  {           HMODULE hLib;     char buf[50] = {0}; //creamos un buffer de 50 caracteres de largo    LPVOID StringRemoto, LoadLibAddy;  

   LoadLibAddy = (LPVOID)GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");    / / Asignar espacio en el proceso de nuestra DLL 

   StringRemoto = (LPVOID)VirtualAllocEx(Proc, NULL, strlen(DLL_NAME), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);    / / Escribir el nombre del string de nuestro archivo DLL en la memoria asignada  

   WriteProcessMemory(Proc, (LPVOID)StringRemoto , DLL_NAME, strlen(DLL_NAME), NULL);     // y carga nuestro dll en el proceso 

   CreateRemoteThread(Proc, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibAddy, (LPVOID)StringRemoto , NULL, NULL); //funcion que provoca un nuevo hilo de ejecución para comenzar en el espacio de direcciones del proceso especificado. El hilo tiene acceso a todos los objetos que el proceso se abre.      CloseHandle(Proc);  //luego cierra el hilo que abrimos    return true;  }  [/color][/color]

Page 6: Inyeccion de Dll en c++

*vale aclarar que volveremos a usar parte del tutorial anterior 

una vez creada nuestra funcion BOOL a la que llamaremos inyectar 

solamente llamamos a la funcion inyectar(nombre_del_dll) despues de a ver obtenido nuestro proceso a inyectar 

Bueno, espero que les alla servido de algo estos 2 tutoriales, dentro de poco subire muchas mas, un saludo y hasta luego!