Sunteți pe pagina 1din 6

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

Despues de estar ms desaparecido que Poltico 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 pequeo programa que se corre en segundo plano, junto con el game para el cual fue diseado 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 cdigos. 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

que explicare ahora: Parmetros:

[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 direccin 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 direccin base y la memoria del tamao especificado es accesible para acceso de lectura, y si no es accesible falla la funcin. lpBuffer Un puntero a un bfer que recibe el contenido desde el espacio de direcciones del proceso especificado. nSize El nmero de bytes que se pueden leer desde el proceso especificado.

lpNumberOfBytesRead Un puntero a una variable que recibe el nmero de bytes transferidos en el bfer especificado. Si lpNumberOfBytesRead es NULL, el parmetro es ignorado.

y su "Valor de retorno": Si la funcin tiene xito, el valor de retorno es distinto de cero. Si la funcin falla, el valor de retorno es 0 (cero). Para obtener informacin sobre el error, llamar a GetLastError. La funcin falla si la operacin de lectura solicitada cruza en un rea del proceso que es inaccesible.

Una vez explicado todo, manos a la obra!

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) W indow. ) y lo llamamos hWnd, este Handle contendra el "valor de retorno de la fun cion 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) mu estra 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 P ID del proceso que estamos buscando. GetWindowThreadProcessId(hWnd, &pId); //la funcion "GetWindowThreadPro cessId" 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 crea ra otro HANDLE llamado proceso el cual usara la funcion "OpenProcess" la cual ret orna el proceso en base a la pId obtenida anteriormente.

if (!hProc) {

//si hubo algun problema anteriormente

*agregar lo que quiera para mostrar error* } else { [/color][/color] // sino ...

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 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"), "LoadLib raryA"); / / Asignar espacio en el proceso de nuestra DLL StringRemoto = (LPVOID)VirtualAllocEx(Proc, NULL, strlen(DLL_NAME), MEM_RESERV E | MEM_COMMIT, PAGE_READWRITE); / / Escribir el nombre del string de nuestro archivo DLL en la memoria asignad a WriteProcessMemory(Proc, (LPVOID)StringRemoto , DLL_NAME, strlen(DLL_NAME), NU LL); // y carga nuestro dll en el proceso

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

*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!