Foro de elhacker.net

Programación => Ingeniería Inversa => Mensaje iniciado por: xavieeee en 9 Julio 2015, 13:04 pm



Título: Proyecto inyección de código Superstackporker con Cheat Engine
Publicado por: xavieeee en 9 Julio 2015, 13:04 pm
Buenas,

Primero de todo agradecer a Mad Antrax su ayuda el la elaboración de los siguientes códigos.

Estoy intentando inyectar código mediante Cheat Engine en el casino SuperStackPoker.

El objetivo es convertir el stack de los jugadores y las apuestas que realizan en función de la ciega grande de la mesa en la que se encuentren. Lo explicare de otro modo por si no jugáis a Poker.

Si un jugador esta sentado con 200 € en una mesa y el nivel de la mesa es 25NL, la ciega grande o apuesta mínima sera de 0,25 €. Por lo que este jugador esta sentado con 800 ciegas grandes o apuestas mínimas (200/0,25)
En cambio si el jugador tiene los mismos 200 €, pero esta en una mesa de nivel 200NL solo tendrá 100 apuestas mínimas. (200/2)

He conseguido realizar parte del código:

EL siguiente script multiplica el stack de todos los jugadores de la mesa por el valor de la apuesta mínima de la mesa.
Este scrip es solo para cuando un jugador iguala una apuesta, tengo otros dos para cuando suben o se retiran. Son las tres instrucciones que escriben el valor del stack.

Código:
[ENABLE]

aobscanmodule(INJECT,ClientRuntime.dll,00 CC CC 55 8B EC 8B 55 08 8B 02 89 81 E0 00 00 00) // should be unique
alloc(newmem,$1000)
alloc(var1,4)

label(code)
label(return)

var1:
dd #1

newmem:

code:

  mov [ecx+000000E0],eax
  push ebx
    mov ebx,[ecx+000000E0]
    imul ebx,[var1]
    mov [ecx+000000E0],ebx
  pop ebx
  jmp return

INJECT+0B:
  jmp code
  nop
return:
registersymbol(INJECT)
registersymbol(var1)
[DISABLE]

INJECT+0B:
  db 89 81 E0 00 00 00

unregistersymbol(INJECT)
dealloc(newmem)
unregistersymbol(var1)
dealloc(var1)

Con el siguiente scrip cargo el valor en var1

Código:
[ENABLE]

aobscanmodule(LeerApuestaMinima,ClientRuntime.dll,89 57 28 8B 4E 5C) // should be unique
alloc(newmem,$1000)

label(code)
label(return)

newmem:

code:
  mov [edi+28],edx
  mov [var1],edx
  mov ecx,[esi+5C]
  jmp return

LeerApuestaMinima:
  jmp code
  nop
return:
registersymbol(LeerApuestaMinima)

[DISABLE]

LeerApuestaMinima:
  db 89 57 28 8B 4E 5C

unregistersymbol(LeerApuestaMinima)
dealloc(newmem)

Funciona bien con algunos matices.
He utilizado el comando imul, pero en realidad lo que necesito es dividir. No he sido capaz de utilizar los comandos div y idiv.
El segundo problema es que como la instrucción que carga el valor de apuesta mínima es diferente de las de igualar, subir o retirarse pues cuando hay mas de una mesa abierta de distintos niveles pues el valor de var1 va cambiando constantemente y la multiplicación no se realiza por el valor que le corresponde a cada mesa.

He intentado juntar los dos scripts para que antes de realizar la operación lea el valor de la apuesta mínima, pero no he sido capaz.


Espero que podáis ayudarme.

Un saludo,