Buenas hoy quiero empezar a transferir un conocimiento hacerca de como hackear un juego con dll injection, voy a tratar de ser lo mas explicativo posible.
El juego que voy a utilizar es el Residen Evil 5===>Directx10.
El software que utilizo es Visual Studio 2010 RC,c++. Cheat Engine y OllyDbg
ESTE TUTORIAL ES PARA PERSONAS QUE SEPAN ALGO DE PROGRAMACION Y COMO BUSCAR EN GOOGLE
CREAND PROYECTO VS2010 c++
-Archivo->NUevo->Proyecto
vamos a crear un proyecto WIN32 Project.
para efectos del tutorial el proyecto lo llamare Tutorial1.
Seleccionamos en el Ayudante la opcion DLL y finalizamos el Ayudante.
Ahora tenemos la siguiente estructura
Header Files=>stdafx.h,targetver.h
Source Files=>dllmain.cpp,stdafx.cpp,Tutorial1.cpp
sobre el proyecto tutorial1 click derecho propiedades,en general camiamos la opcion de caracteres Unicode por Multi-Byte y guardamos.
luego sobre el proyecto tutorial1 clieck derecho, Agregar Nuevo Item y Agregamos un Archivo de Cabecera y lo ponemos hacksdisponibles.h y le agregamos el siguiente codigo
Código:
#pragma once
#include "stdafx.h"
void HackDisponibles();
abrimos el archivo stdafx.h y agregamos al final
Código:
#include "hacksdisponibles.h"
ahora abrimos el archivo dllmain
y debe quedarnos de esta manera
Código:
// dllmain.cpp : Defines the entry point for the DLL application.
#include "stdafx.h"
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
HackDisponibles();
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
habrimos el archivo Tutorial1.cpp, aqui empezamos la magia
lo primero que haremos es realizar el "bypass" del live.dll ya que este checkea si la memoria fue cambiada y hace que se cierre resident evil.
esto es realizado con Residen evil 5 version Directx10
Código:
// Tutorial1.cpp : Defines the exported functions for the DLL application.
//
#include "stdafx.h"
void ByPassxLive()
{
DWORD address_xlive=(DWORD)GetModuleHandle("xlive.dll");
address_xlive+=0x0ED690;
unsigned long antes=NULL;
VirtualProtect((void*)(address_xlive),3,PAGE_EXECUTE_READWRITE,&antes);
//colocamos retn c
//Aqui va el hack
*(BYTE*)(address_xlive)=0xC2; //RETN
*(WORD*)(address_xlive+1)=0x000C; //10
//Termina El hack
VirtualProtect((void*)(address_xlive),3,antes,NULL);
}
con olly o con cheatengine se puede buscar
MOV EDI,EDI que se encuentra en xlive.dll+ED690 y lo cambiamos a
RETN 0C (0xC2000C), este quiero agradecer a la persona que se molesto en encontrar donde y como solucionar el checkeo de memoria, para hacer estos cambios utilizamos la funcion VirtualProtect para habilitar la escritura, y lo usamos para 3 bytes que es lo que se necesita, y por supuesto devolvemos el valor anterior de prteccion a esos bytes.
ahora agregamos la funcion HackDisponibles en el archivo Tutorial1.cpp
Código:
// Tutorial1.cpp : Defines the exported functions for the DLL application.
//
#include "stdafx.h"
//recortado por motios de compresion
void ByPassxLive(){....}
void HackDisponibles ()
{
ByPassxLive();
}
ya con esto nos permite realizar nuestros hack tranquilamente
de a pocos colocare los ejemplos, empezemos con hackear el dinero ponerlo en 999.999, no voy a explicar el como encontre la direccion de memoria esto lo pueden hacer con olly o cheat, un poco de astucia y mirar el codigo aqui expuesto:
Código:
// Tutorial1.cpp : Defines the exported functions for the DLL application.
//
#include "stdafx.h"
#define Address_Gold 0x00a0097f
unsigned long Address_GoldBack =0x00a00984;
//codigo para poner el oro en 999.999
_declspec(naked) void hookGold()
{
_asm
{
lea edx,[ecx+eax+1c0h] //explicacion *1
mov dword ptr[edx],000F423fh //explicacion *2
mov edx,[ecx+eax+1c0h] //explicacion *3
//explicacion *4
push eax
mov eax,Address_GoldBack
jmp eax
}
}
void HackGold()
{
//desprotejo la memoria
unsigned long antes=NULL;
VirtualProtect((void*)Address_Gold,7,PAGE_EXECUTE_READWRITE,&antes);
//Aqui va el hack del JUMP a nuestro codigo
*(BYTE*)(Address_Gold)=0xE9; //JMP
*(DWORD*)(Address_Gold+1)=(unsigned long)&hookGold-(Address_Gold+5); //a mi dll
*(BYTE*)(Address_Gold+5)=0x58; //POP eax
*(BYTE*)(Address_Gold+6)=0x90; //NOP
//Termina El hack
VirtualProtect((void*)Address_Gold,7,antes,NULL);
}
void ByPassxLive(){...}
void HackDisponibles (){...}
creamos una funcion con el nombre HackGold que se encarga de colocar un JMP a nuestro hookGold al codigo original, el codigo assembly es
JMP MEMORIA(E900000000) donde memoria es la distancia entre nuestro codigo hook de la posicion de memoria donde se modifica el oro.
explicacion *1 lea edx,[ecx+eax+1c0h]
aqui obtenemos un puntero a la posicion de memoria donde se encuentra el dato de cuando gold tenemos
explicacion *2 mov dword ptr[edx],000F423fh
aqui esta la magia le pasamos 999.999 en hexadecimal al puntero donde se encuentra el dato del gold
explicacion *3 mov edx,[ecx+eax+1c0h]
este codigo ya es el orginal para evitar algun error
explicacion *4
push eax
mov eax,Address_GoldBack
jmp eax
aqui lo que se hace es realizar el salto a donde debe continuar la secuencia del codigo.
con esto ya tenemos listo el hack de dinero.
Ahora hagamos el de municion siempre en 99 lo mismo que "infinito"
vamos a utilizar el mismo concepto de poner un jmp en el codigo original y lo enviamos a nuestra funcion para realizar la magia.
en el mismo archivo Tutorial1.cpp
Código:
// Tutorial1.cpp : Defines the exported functions for the DLL application.
//
#include "stdafx.h"
#define Address_Gold 0x00a0097f
#define Address_Munition 0x00c15278
unsigned long Address_MunitionBack =0x00c15282;
unsigned long Address_GoldBack =0x00a00984;
//Procedimiento para colocar las balas en 99
_declspec(naked) void hookMunition()
{
_asm
{
mov [ecx+8],63h //explicacion *1
mov eax,Address_MunitionBack
jmp eax
}
}
void HackMunition()
{
//desprotejo la memoria
unsigned long antes=NULL;
VirtualProtect((void*)Address_Munition,7,PAGE_EXECUTE_READWRITE,&antes);
//Aqui va el hack
*(BYTE*)(Address_Munition)=0xE9; //JMP
*(DWORD*)(Address_Munition+1)=(unsigned long)&hookMunition-(Address_Munition+5); //a mi dll
*(BYTE*)(Address_Munition+5)=0x90; //POP ecx
*(BYTE*)(Address_Munition+6)=0x90; //NOP
//Termina El hack
VirtualProtect((void*)Address_Munition,7,antes,NULL);
}
//recortado por compresion
_declspec(naked) void hookGold(){...}
void HackGold(){...}
void ByPassxLive(){...}
void HackDisponibles ()
{
ByPassxLive();
//habilitamos los hacks
HackGold();
HackMunition();
}
aqui lo mas importe es
explicacion *1 mov [ecx+8],63h
aqui le estamos pasando 99 a el puntero que contiene el dato de cuantas balas nos queda
y por ultimo habilitamos los hack en el codigo.
LIsto eso es todo en codigo.
Compilamos y ahora procedemos a utilizar nuestro hack para poder usarlo debes injectarlo en el proceso RE5DX10.EXE.
yo utilizo el programa Inject-TOR para hacerlo, solo especificamos la DLL a injectar, de ahi en la zona inferior izquierda (Name of Process) ponemos "RE5DX10.EXE" y accionamos la opcion "use Watch" y lo ultimo es abrir nuestro juego si se injecta correctamente veran como su oro es inifinito y la municion.
POR FAVOR SI NO ENTIENDEN ALGO PREGUNTEN, esto me tomo 20 dias aprender manualmente como se hacia dll injection, como se debuggeaba y como encontrar posiciones de memoria, al igual existen miles de tutoriales en video de como buscar dichas posiciones
por ultimo quiero decirles que actualmente estoy relizando el codigo para hackear el dx10 para pintar nuestros propios obejtos, y asi poner que se visualizen las gemas rapidamente. Apenas lo tenga listo lo posteo
att
trompetin17
PD. Espero sea de utilidad y disculpen la Horrografia
Marcadores