PDA

Ver la versión completa : TUTORIAL Hack RE5 dx10



trompetin17
06-03-2010, 07:50
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


#pragma once
#include "stdafx.h"

void HackDisponibles();

abrimos el archivo stdafx.h y agregamos al final

#include "hacksdisponibles.h"

ahora abrimos el archivo dllmain
y debe quedarnos de esta manera

// 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


// 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_EXECU TE_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

// 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:


// 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

// 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_EXEC UTE_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,NUL L);
}

//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.
:0=

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

j8k6f4v9j
06-03-2010, 09:15
Hola trompetin17,

Bienvenido al foro y gracias por el aporte.


Salu2

trompetin17
07-03-2010, 05:10
Buenas el dia de hoy vamos a realizar el codigo para que los puntos de caracteristicas especiales sea infinito. Hoy explicare un poco mas en detalle el codigo assembly.
Les recuerdo que es con Resident Evil 5 DX10

Con ayuda de cheat me encontre esta direccion 00ca903a en la cual se encuentra el siguiente codigo assembly


00CA9030 /$ 8B81 8C010000 MOV EAX,DWORD PTR DS:[ECX+18C]
00CA9036 |. 8B5424 04 MOV EDX,DWORD PTR SS:[ESP+4]
00CA903A 3BC2 CMP EAX,EDX
00CA903C 73 0B JNB SHORT RE5DX10.00CA9049
00CA903E 33C0 XOR EAX,EAX
00CA9040 8981 8C010000 MOV DWORD PTR DS:[ECX+18C],EAX
00CA9046 |. C2 0400 RETN 4
00CA9049 2BC2 SUB EAX,EDX
00CA904B 8981 8C010000 MOV DWORD PTR DS:[ECX+18C],EAX
00CA9051 \. C2 0400 RETN 4

basicamente en eax contiene el valor de los puntos que tengo actualmente, y en edx contiene los puntos que se se van a descontar, luego compara(cmp EAX,EDX) si nuestrsos puntos son menores y si lo es no salta(JNB SHORT RE5DX10.00CA9049) y lo que hace es poner en cero eax, ahora bien si salta por que nuestros puntos son mayores a 00CA9049, lo que hace alli es restarle(SUB EAX,EDX) a nuestros puntos lso que se deben descontar, y por ultimo actualiza nuestros puntos(MOV DWORD PTR DS:[ECX+18C],EAX)

ok, despues de analizado voy a realizar un cambio en el codigo assembly para que lusca asi

00CA9030 /$ 8B81 8C010000 MOV EAX,DWORD PTR DS:[ECX+18C]
00CA9036 |. 8B5424 04 MOV EDX,DWORD PTR SS:[ESP+4]
00CA903A B8 3F420F00 MOV EAX,0F423F
00CA903F EB 0A JMP SHORT RE5DX10.00CA904B
00CA9041 90 NOP
00CA9042 90 NOP
00CA9043 90 NOP
00CA9044 90 NOP
00CA9045 90 NOP
00CA9046 |. C2 0400 RETN 4
00CA9049 2BC2 SUB EAX,EDX
00CA904B 8981 8C010000 MOV DWORD PTR DS:[ECX+18C],EAX
00CA9051 \. C2 0400 RETN 4

comparen con el original para que vean los cambios, simplemente lo que hago es actualizar(MOV EAX,0F423F) nuestors puntos con 999.999(0F423F) en hexadecimal, y luego salto(JMP SHORT RE5DX10.00CA904B) al alinea que actualiza nuestros puntos.

sugerencia: tener al menos 500 puntos , compran algo y ya quedan con 999.999

ahora bien actulizemos nuestra dll para que contenga este codigo

// Tutorial1.cpp : Defines the exported functions for the DLL application.
//

#include "stdafx.h"

#define Address_Gold 0x00a0097f
#define Address_Munition 0x00c15278
#define Address_Points 0x00ca903a
unsigned long Address_MunitionBack =0x00c15282;
unsigned long Address_GoldBack =0x00a00984;

void HackPuntos()
{
//desprotejo la memoria
unsigned long antes=NULL;
VirtualProtect((void*)Address_Points,12,PAGE_EXECU TE_READWRITE,&antes);
//Aqui va el hack
*(BYTE*)(Address_Points)=0xB8; //MOV Eax
*(DWORD*)(Address_Points+1)=0x000F423f; //a 999999
*(BYTE*)(Address_Points+5)=0xEB; //JMP
*(BYTE*)(Address_Points+6)=0x0A; //Salto 10 lineas adelante
*(BYTE*)(Address_Points+7)=0x90; //NOP
*(BYTE*)(Address_Points+8)=0x90; //NOP
*(BYTE*)(Address_Points+9)=0x90; //NOP
*(BYTE*)(Address_Points+10)=0x90; //NOP
*(BYTE*)(Address_Points+11)=0x90; //NOP
//Termina El hack
VirtualProtect((void*)Address_Points,12,antes,NULL );
}
//recortado por compresion
_declspec(naked) void hookMunition(){...}
void HackMunition(){...}
_declspec(naked) void hookGold(){...}
void HackGold(){...}
void ByPassxLive(){...}

void HackDisponibles ()
{
ByPassxLive();
HackGold();
HackMunition();
HackPuntos(); //actualizo para que funcione
}


este es el tip del dia de hoy. Compilen e injectan y listo.

att
trompetin17

PD. Si tiene dudas por favor pregunten
PD.2 aun estoy trabajando en el hack del metodo D3DCreateDevice ya que no se puede cambiar el bin del RE5DX10.exe por que el xlive comprueba la integridad al inicializar, y la injection ocurre despues de que se llama a este metodo, aun sigo investigando si alguno tiene algun consejoo bienvenido es.

Marchi
09-03-2010, 04:09
Buen aporte trompetin, no le voy al RE pero siempre se agradecen aportes de este estilo.

Saludos

gondar_f
10-03-2010, 18:41
Se bienvenido hh, encantados de tenerte aqui.

Muy buen trabajo, felicidades.

Salu2

trompetin17
12-03-2010, 04:27
Buenas hoy vengo contento por que por fin logre capturar el puntero de ID3D10Device.
Despues de analizar el codigo y seguirlo encontre. Ando Cansado pero mañana coloco bien explicado.
Hoy por el memoento quiero comentar que aquellos que han intentado ejecutar el cheat o olly y les sale un mensaje diciendo "ERR08:Memory overrun" le spuede servir este truco.
En RE5DX10 esta esta posicion de memoria 045BB90 aparentemente este metodo gestiona los errores que contiene el programa. Si echamos un vistazo con olly podemos encontrar cosas interesante pero a lo que respecta este tips es lo siguiente

0045BB90 /$ 85C0 TEST EAX,EAX
0045BB92 |. 0F84 C0010000 JE RE5DX10.0045BD58
0045BB98 |. 3D 0E000780 CMP EAX,8007000E
0045BB9D |. 75 0F JNZ SHORT RE5DX10.0045BBAE
0045BB9F |. 68 A4D20F01 PUSH RE5DX10.010FD2A4 ; ASCII "ERR08 : Memory overrun."
0045BBA4 |. 68 886F2701 PUSH RE5DX10.01276F88
0045BBA9 |. E8 F2CF2800 CALL RE5DX10.006E8BA0



basicamente revisa que si en EAX biene el codigo 8007000(CMP EAX,8007000E) que pues no se que quiere decir exactamente pero asumo que indica que hay un debugger abordo, Luego de comparar encontramos el salto condicional(JNZ SHORT RE5DX10.0045BBAE) indicando que solo saltara si no es el codigo esperado, Si lo es vemos que aparece "ERR08 : Memory overrun." y se ejecuta un metodo(CALL RE5DX10.006E8BA0)
para mi en este caso es sencillo simplemente cambiamos el salto condicional por un salto fijo

0045BB90 /$ 85C0 TEST EAX,EAX
0045BB92 |. 0F84 C0010000 JE RE5DX10.0045BD58
0045BB98 |. 3D 0E000780 CMP EAX,8007000E
0045BB9D EB 0F JMP SHORT RE5DX10.0045BBAE
0045BB9F |. 68 A4D20F01 PUSH RE5DX10.010FD2A4 ; ASCII "ERR08 : Memory overrun."
0045BBA4 |. 68 886F2701 PUSH RE5DX10.01276F88
0045BBA9 |. E8 F2CF2800 CALL RE5DX10.006E8BA0

y queda listo. Aqui el donde el como, les queda como trabajo(usen dll Injection).

Por Ultimo les adelanto en el RE5DX10 el puntero esta en [0134f238]+34, hoy termine de examinar y probar. Ya mañana les detallo el codigo, de aqui en adelante lo que voy a realizar es que los emblemas se vean facilmente, para encontrarlos rapido y asi sucesivamente, bienvenida las ideas.

Y si quieren sugerir algun juego para tratar de crackearlo tambien bienvenido es, se hara lo posible.

Att
trompetin17