[Tutorial] Usar Cheat Engine para modificar juegos + inyección de código

Iniciado por Mad Antrax, 1 Febrero 2013, 11:46 AM

0 Miembros y 4 Visitantes están viendo este tema.

apuromafo CLS

yo siempre leo el foro..realmente esta bien los aportes ||MadAntrax||, cuidate y disfruta las vacaciones en caso que aun queden dias libres

saludos Apuromafo

POLLITOXD

Holas  soy pollito  tengo un problema q pasa
cuando le doy  "Find out what writes to this address"
se cierra el juego no es el juego q pusistes es otro
como podria en caso como sacar las andress pointer offzet....

Mad Antrax

Cita de: POLLITOXD en 12 Febrero 2013, 17:36 PM
Holas  soy pollito  tengo un problema q pasa
cuando le doy  "Find out what writes to this address"
se cierra el juego no es el juego q pusistes es otro
como podria en caso como sacar las andress pointer offzet....

Buenas, lo que te ocurre es que el juego que estás tratando de debuggear tiene protecciones anti-debugg, al lanzar el debugger interno de CE se cierra por protección.

Que juego estás tratando de hackear?
No hago hacks/cheats para juegos Online.
Tampoco ayudo a nadie a realizar hacks/cheats para juegos Online.

POLLITOXD

Umm bueno ai alguna otra forma se sacar el andress  o pointer
estatico  q no se por debuger aver si me pordrian orientar
en algo toy provando con dos juegos el mu heroes mu sanluis
y gunbound   :P :o  :silbar:

Mad Antrax

Cita de: POLLITOXD en 13 Febrero 2013, 04:18 AM
Umm bueno ai alguna otra forma se sacar el andress  o pointer
estatico  q no se por debuger aver si me pordrian orientar
en algo toy provando con dos juegos el mu heroes mu sanluis
y gunbound   :P :o  :silbar:

Esas juegos usan tecnologia Game Shield, además son juegos online (server side) así que no lograrás nada :D
No hago hacks/cheats para juegos Online.
Tampoco ayudo a nadie a realizar hacks/cheats para juegos Online.

gonzalo57

Mad mira hace tiempo jugaba a un juego llamado BoomBang y se me ocurrio entrar y probar para ponerme mucho dinero, y lo consegui lo que pasa esque siempre que me pongo dinero en un juego tan solo es visual, en realidad es como si no tuviera nada. Igual me ocurre en el juego Plants Vs Zombies.
Espero que me resuelvas la duda
@echo off
title Gonzalo57
color 5a
echo Estoy aprendiendo Batch :3
echo.
pause
cls
echo un saludo elhacker.net :)
pause > nul

Mad Antrax

Cita de: gonzalo57 en 13 Febrero 2013, 15:09 PM
Mad mira hace tiempo jugaba a un juego llamado BoomBang y se me ocurrio entrar y probar para ponerme mucho dinero, y lo consegui lo que pasa esque siempre que me pongo dinero en un juego tan solo es visual, en realidad es como si no tuviera nada. Igual me ocurre en el juego Plants Vs Zombies.
Espero que me resuelvas la duda

Bueno, eso que te ocurre puede ser por varios motivos. Te explico:

Imaginate que soy programador de un juego, en el juego tienes monedas (o dinero), de forma interna el juego almacena el valor de tu dinero así

VariableDinero = 50 * 10 = 500

Tú en el juego verás de forma gráfica que tienes 500 monedas, pero en realidad el juego almacena el valor 50 y lo multiplica por 10 para mostrarlo. Cuando uses CE para buscar 500 jamás te saldrá bien, ya que de forma interna, la variable de 500 monedas se almacena de una forma distinta. Eso sería un método de protección para evitar éste tipo de trampas. Lo mejor es usar búsquedas en Increased o Decreased para no fallar.

Por cierto, el Plant vs Zombi lo conseguí hackear con CE, no es complicado, que versión estás jugando tú? Yo lo tengo para Steam, si quieres te puedo ayudar.
No hago hacks/cheats para juegos Online.
Tampoco ayudo a nadie a realizar hacks/cheats para juegos Online.

Mad Antrax

Ya he terminado la parte 3 del tutorial, creo que no me he dejado nada. Inyección de código y creación de script's en Auto-Assemble. Si hay algo mal o que no se entienda avisad!!

Está posteado en el reply #3 de la primera página
No hago hacks/cheats para juegos Online.
Tampoco ayudo a nadie a realizar hacks/cheats para juegos Online.

[NelSito*]

Te felicito y agradezco por tomarte el tiempo por enseñar partes de un debugger como es el CE, tengo muy claro todo lo unico que aun no aprendia era la parte de crear scripts en AA, ahora que lo se me gustaria saber ya que hablastes del alloc y label, podrias decirme en que casos o para que sirve el registersymbol y un ejemplo para que asi los demas tambien puedan entenderlo.

Gracias.

Mad Antrax

Cita de: [NelSito*] en 14 Febrero 2013, 03:50 AM
Te felicito y agradezco por tomarte el tiempo por enseñar partes de un debugger como es el CE, tengo muy claro todo lo unico que aun no aprendia era la parte de crear scripts en AA, ahora que lo se me gustaria saber ya que hablastes del alloc y label, podrias decirme en que casos o para que sirve el registersymbol y un ejemplo para que asi los demas tambien puedan entenderlo.

Gracias.

alloc es para indicar a CE cuanto espacio en memoria necesitas para tu script, normalmente con 2kbytes tienes espacio suficiente paa inyectar tu código.
label sirve para utilizar una palabra como si fuera una dirección de memoria, te dejo un ejemplo:

[ENABLE]
alloc(InfiniteHull,2048)
label(SkipDmg)
label(return)

"FTLGame.exe"+B133F:
jmp InfiniteHull
nop
return:

InfiniteHull:
cmp [eax+04],0
je SkipDmg
fistp dword ptr [eax+38]
db D9 6D FE
jmp return
SkipDmg:
mov [eax+38],1E
db D9 6D FE
jmp return

[DISABLE]
dealloc(newmem)
"FTLGame.exe"+B133F:
fistp dword ptr [eax+38]
db D9 6D FE


Si lees el código desde arriba verás que empiezo con un jmp InfiniteHull (mi primer label). Comparo la estructura [eax+4] con un je SkipDmg (mi segundo label). Es un claro ejemplo de uso de labels, éste script AA comprueba el registro [eax+4] para determinar si es un enemigo o un amigo, si es un amigo el valor será 0 y lanzo el código de evitar daño, si es un enemigo ejecuto el código original para aplicar daño. Así de sencillo.

RegisterSymbol es algo más avanzado, sirve para registrar una palabra como variable interna. A efectos prácticos será tratada como una dirección de memoria más y podrás trabajarla con CE, te dejo un ejemplo inventado:

En algunos casos, los videojuegos utilizan direcciones estáticas donde almacenan sus variables, dichas direcciones nunca varían y las puedes utilizar para hacer "hacks". Imagínate que tenemos un juego llamado "game.exe" y que en la dirección de memoria BCA64 el registro EAX contiene las videas de tu personaje, podrías hacer lo siguiente:

[ENABLE]
//code from here to '[DISABLE]' will be used to enable the cheat
alloc(newmem,2048) //2kb should be enough
label(exit)
alloc(y_addr,4)
registersymbol(y_addr)


"game.exe"+BCA64:
jmp newmem
jmp exit
nop

newmem:
mov [y_addr],eax

exit:

[DISABLE]
...
dealloc(y_addr)
unregistersymbol(y_addr)


Aquí lo que hemos hecho es saltar a la dirección de memoria BCA64 y guardar en nuestro símbolo y_addr el valor de EAX que contiene las vidas. A partir de aquí el símbolo y_addr podrá ser utilizado en cualquier ventana del CE, incluso en otros script's. Es otra forma de trabajar, pero yo lo veo algo complicado. Si te interesa el tema de las funciones en AA te dejo las que hay (en inglés)

There are 3 special commands you can give it, ALLOC , LABEL and FULLACCESS. With LABEL you can give a address a name by declaring it before you use it. ALLOC is basicaly the same as LABEL but allocates some memory for you.
Usage:
LABEL(labelname) //Enables the word labelname to be used as a address
ALLOC(allocname,sizeinbytes, preferedregion OPTIONAL) //same as label, but allocates the memory it points to itself
DEALLOC(allocname) //Deallocates a block of memory allocated with alloc. It always gets executed last, no matter where it is positioned in the code, and only actually frees the memory when all allocations have been freed.  only usable in a script designed as cheattable. (e.g used for the disable cheat)
FULLACCESS(address,size)  //makes a memory region at the specified address and at least "size" bytes readable, writable and executable

REGISTERSYMBOL(symboname) //adds the symbol to the userdefined symbol list so cheattables and the memory browser can use that name instead of a address (The symbol has to be declared in the script when using it)
UNREGISTERSYMBOL(symbolname) //removes the symbol from the userdefined symbol list. It won't give a error if it isn't found


DEFINE(name,whatever) :Will replace all tokens with the specified name with the text of whatever
INCLUDE(filename) :includes another auto assembler file at that spot
LOADBINARY(address,filename) :Will load a binary file at the specified address
CREATETHREAD(address) :Will spawn a thread in the process at the specified address
LOADLIBRARY(filename) :Will inject the specified dll into the target process
READMEM(address,size) :Will write the addresses at address at the location this instruction is placed


GLOBALALLOC(name,size) : Will allocate a certain amount of memory and registers the specified name. Using GlobalAlloc in other scripts will then not allocate the memory again, but reuse the already existing memory. (Or allocate it anyhow if found it was not allocated yet)


ASSERT(address, array of byte) : Will check the memory address for the given address. If the memory is not what is defined by the array of byte given, the auto assemble script will not execute.
AOBSCAN(name, array of byte) : Will scan the memory for the given array of byte (Wildcards are supported) and replaces all tokens with the specified name with the address the array of byte was found. If it's not found, the auto assemble script will not execute


Value notation:
Normally everything is written as hexadecimal in auto assembler, but there are ways to override this so you can input decimal values, and even floating point values.
for example, a integer value of 100 can be written in hex as 64, but you can also write it as #100, or as (int)100
for floating point value like 100.1 you can use (float)100.1


Y por si te interesa, te dejo un AA script de un juego real, el script es bastante extenso, por suerte está bien escrito y comentado, quizás aprendas algo de él :D

//=========================================
// Majesty 2 - The Fantasy Kingdom Sim
// Game Version  : 1.0.0.0
// Script Version: 1.0
// CE Version    : 5.5
// Gold, GodMode
// 08-Oct-2009
//=========================================

[ENABLE]
alloc(MyCode,1024)

//=========================================
// Declaration section
label(_MonGold)
label(_BackMG)
label(_ExitMG)
label(_GodMode)
label(_BackGM)
label(_ExitGM)
label(_GodM0)
label(pGold)
label(fMinGold)
label(iEnableMG)
label(iEnableGM)

registersymbol(MyCode)
registersymbol(pGold)
registersymbol(fMinGold)
registersymbol(iEnableMG)
registersymbol(iEnableGM)

//=========================================
// Hacking Points
Game.dll+1d7d07:
jmp _MonGold
nop
_BackMG:

Game.dll+20ff5e:
jmp _GodMode
_BackGM:

MyCode:
//=========================================
_MonGold:
push eax
 
mov [pGold],ecx              // Save ptr for further use
 
cmp dword ptr [iEnableMG],0
je _ExitMG                   // Jump if feature is disabled
 
mov eax,[fMinGold]           // Get minimum gold value
cmp eax,[ecx+00040474]       // Current value >= minimum?
jle _ExitMG                  // Jump if true
 
mov [ecx+00040474],eax       // Make current value = minimum
mov [ecx+04],eax             // Make current value = minimum (display)

_ExitMG:
pop eax
fld dword ptr [ecx+00040474] // Original code
jmp _BackMG                  // Back to main code

//=========================================
_GodMode:
push ebx
mov ebx,ecx
 
cmp dword ptr [iEnableGM],0
je _GodM0                    // Jump if feature is disabled

mov ecx,[ecx+14]             // Get ptr Level 1
or ecx,ecx                   // Valid pointer?
jz _GodM0                    // Jump if false

mov ecx,[ecx+000000a0]       // Get ptr Level 2
or ecx,ecx                   // Valid pointer?
jz _GodM0                    // Jump if false

mov ecx,[ecx+00000014]       // Get ptr Level 3
or ecx,ecx                   // Valid pointer?
jz _GodM0                    // Jump if false
 
mov ecx,[ecx+000000A4]       // Get ptr Level 4
cmp ecx,07000000             // Valid pointer?
jle _GodM0                   // Jump if false

mov ecx,[ecx+00000024]       // Get ptr to owner
cmp ecx,[pGold]              // Player´s unit?
jne _GodM0                   // Jump if false

fld dword ptr [ebx+24]       // Get Maximum HP
jmp _ExitGM  

_GodM0:
fld dword ptr [eax]          // Original code

_ExitGM:
mov ecx,ebx
pop ebx
 
fstp dword ptr [ecx+1c]      // Original code
jmp _BackGM                  // Back to main code

//=========================================
// Variables
iEnableMG:
dd 1
iEnableGM:
dd 1
pGold:
dd 0
fMinGold:
dd 461c4000                  // 10000

//=========================================
// Original Codes
[DISABLE]
Game.dll+1d7d07:
fld dword ptr [ecx+00040474]

Game.dll+20ff5e:
fld dword ptr [eax]
fstp dword ptr [ecx+1c]

dealloc(MyCode)
unregistersymbol(MyCode)
unregistersymbol(pGold)
unregistersymbol(fMinGold)
unregistersymbol(iEnableMG)
unregistersymbol(iEnableGM)
No hago hacks/cheats para juegos Online.
Tampoco ayudo a nadie a realizar hacks/cheats para juegos Online.