[SOLUCIONADO] Acceso a dirección de memoria con pointers en varios niveles

Iniciado por panax, 6 Mayo 2014, 01:08 AM

0 Miembros y 1 Visitante están viendo este tema.

panax

He intentado hacer un pequeño programa en C++ que he probado de multiples maneras poder acceder a este valor de la dirección de memoria pero no he podido. Sera que alguien puede hecharme una mano?


Seria algo asi? : ReadProcessMemory(hproc, (LPCVOID)((((((ClientDLL + 0x007C3D1C) + 0x10) + 0x2c) + 0x3e0) + 0x17c)), &buff, 1, NULL);

Quiero obtener la dirección a la que apuntan (y obviamente su valor).

A nivel de sintaxis, que debo hacer?

PD: Se que debo obtener el handler del modulo client.dll y de alli partir (base address creo que se llama) pero he intentado de todo y nada :( alguna idea?.

Saludos.

Miseryk

Cita de: panax en  6 Mayo 2014, 01:08 AM
He intentado hacer un pequeño programa en C++ que he probado de multiples maneras poder acceder a este valor de la dirección de memoria pero no he podido. Sera que alguien puede hecharme una mano?


Seria algo asi? : ReadProcessMemory(hproc, (LPCVOID)((((((ClientDLL + 0x007C3D1C) + 0x10) + 0x2c) + 0x3e0) + 0x17c)), &buff, 1, NULL);

Quiero obtener la dirección a la que apuntan (y obviamente su valor).

A nivel de sintaxis, que debo hacer?

PD: Se que debo obtener el handler del modulo client.dll y de alli partir (base address creo que se llama) pero he intentado de todo y nada :( alguna idea?.

Saludos.

Lo que hace el multi level es lo siguiente.

mov eax, address
mov eax, [eax]
add eax, offset

osea que la 1ra vez que sumás un offset, tenés que leer ese address el cual es la suma de: Address + offset

La sintaxis sería:
[[[Address + offset] + offset] + offset] + ...

Saludos!
Can you see it?
The worst is over
The monsters in my head are scared of love
Fallen people listen up! It's never too late to change our luck
So, don't let them steal your light
Don't let them break your stride
There is light on the other side
And you'll see all the raindrops falling behind
Make it out tonight
it's a revolution

CL!!!

panax

Cita de: Miseryk en  6 Mayo 2014, 01:36 AM
Lo que hace el multi level es lo siguiente.

mov eax, address
mov eax, [eax]
add eax, offset

osea que la 1ra vez que sumás un offset, tenés que leer ese address el cual es la suma de: Address + offset

La sintaxis sería:
[[[Address + offset] + offset] + offset] + ...

Saludos!

Gracias por tu respuesta :).

Lo he probado pero presento errores de compilacion: main.cpp expected primary-expression before '[' token

Lo he colocado asi: ReadProcessMemory(hproc, (LPCVOID)[[[[[ClientDLL + 0x007C3D1C] + 0x10] + 0x2c] + 0x3e0] + 0x17c] ), &buff, 1, NULL);

De este modo (o parecido) no funciona? O es que debo ir haciendo Read a Read hasta llegar al ultimo offset?

Saludos.

x64core

Cita de: panax en  6 Mayo 2014, 01:08 AM
He intentado hacer un pequeño programa en C++ que he probado de multiples maneras poder acceder a este valor de la dirección de memoria pero no he podido. Sera que alguien puede hecharme una mano?


Seria algo asi? : ReadProcessMemory(hproc, (LPCVOID)((((((ClientDLL + 0x007C3D1C) + 0x10) + 0x2c) + 0x3e0) + 0x17c)), &buff, 1, NULL);

Quiero obtener la dirección a la que apuntan (y obviamente su valor).

A nivel de sintaxis, que debo hacer?

PD: Se que debo obtener el handler del modulo client.dll y de alli partir (base address creo que se llama) pero he intentado de todo y nada :( alguna idea?.

Saludos.
No entiendo la imagen con lo de varios de niveles de apuntamiento pero supongo que te referis a punteros que apuntan a otros y así sucesivamente,
Si es así, se debe llamar multiples veces a ReadProcessMemory:

ReadProcessmMemory(h,DLLBase+Off,&Ptr1,sizeof(Ptr1),&read)
ReadProcessmMemory(h,Ptr1,&Ptr2,sizeof(Ptr2),&read)
ReadProcessmMemory(h,Ptr2,&Ptr3,sizeof(Ptr3),&read)
ReadProcessmMemory(h,ptr3,&Value,sizeof(Value),&read)

En el programa del proceso remoto ese puntero deberia estar declarado como: Type*** Ptr


panax

Hola x64Core gracias por tu respuesta.

He intentado lo que dijiste pero no entendi muy bien lo de "En el programa del proceso remoto ese puntero deberia estar declarado como: Type*** Ptr"


De todos modos te adjunto mi código:



Citarhwnd = FindWindow(0, "Game Exec");
    GetWindowThreadProcessId(hwnd, &pId);
    hproc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pId);
    DLL = GetModuleBase(pId, "client.dll");
    DWORD ptr1;
    DWORD ptr2;
    DWORD ptr3;
    DWORD ptr4;
    DWORD ptr5;
    DWORD read;
    while(true)
    {
        ReadProcessMemory(hproc, (LPCVOID)(DLL + 0x007c3d1c), &ptr1, sizeof(ptr1), &read);
        ReadProcessMemory(hproc, &ptr1, &ptr2, sizeof(ptr2), &read);
        ReadProcessMemory(hproc, &ptr2, &ptr3, sizeof(ptr3), &read);
        ReadProcessMemory(hproc, &ptr3, &ptr4, sizeof(ptr4), &read);
        ReadProcessMemory(hproc, &ptr4, &ptr5, sizeof(ptr5), &read);
        cout << ptr5 << endl;
        Sleep(100);
    }

Offsets:



Que es lo que esta mal?, disculpen las molestias :P.

Saludos.

Mad Antrax

Tienes que leer offset por offset, no puedes hacerlo de golpe. Es como te ha explicado x64Core

Lee el primer offset e imprimelo por pantalla, deberás ver 21840e38
Luego deberas leer el offset 21840e38+10
...

Así hasta llegar al final. Ánimo
No hago hacks/cheats para juegos Online.
Tampoco ayudo a nadie a realizar hacks/cheats para juegos Online.

panax

Cita de: Mad Antrax en  6 Mayo 2014, 14:55 PM
Tienes que leer offset por offset, no puedes hacerlo de golpe. Es como te ha explicado x64Core

Lee el primer offset e imprimelo por pantalla, deberás ver 21840e38
Luego deberas leer el offset 21840e38+10
...

Así hasta llegar al final. Ánimo

Gracias por tu pronta respuesta :D.

Entiendo lo que hay que hacer a nivel teorico pero he intentado lo que dices (imprimir las direcciones) y me salen otras que no son.

Lo he intentado con este:

CitarGetWindowThreadProcessId(hwnd, &pId);
   hproc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pId);
   DLL = GetModuleBase(pId, "client.dll");
   DWORD ptr1;
   while(true)
   {                      
       ReadProcessMemory(hproc, (LPCVOID)(DLL + 0x007C3D1C), &ptr1, sizeof(ptr2), NULL);
       cout << ptr1 << endl;
       
       Sleep(100);
   }

Y mi salida es:



Creo que mi problema es algún desreferenciamiento para ver la direccion de memoria que almacena (o ese valor que me arroja es la direccion de memoria en decimal?).

Saludos.

Mad Antrax

Lo estás haciendo bien, ese numero que estás imprimiendo está en decimal. Pasalo a HEX y tendrás el valor del primer offset.

Es decir, coge ese numero, pasalo a hexadecimal y sumale 0x10. El resultado de esa operación deberás de usarlo para ejecutar otro ReadProcessMemory. Así hasta llegar a tu offset deseado.

(es un coñazo) xD

Te recomiendo que te leas mi tutorial avanzado de cheatengine, quizás puedas adquirir más conocimientos.
No hago hacks/cheats para juegos Online.
Tampoco ayudo a nadie a realizar hacks/cheats para juegos Online.

panax

Cita de: Mad Antrax en  6 Mayo 2014, 16:28 PM
Lo estás haciendo bien, ese numero que estás imprimiendo está en decimal. Pasalo a HEX y tendrás el valor del primer offset.

Es decir, coge ese numero, pasalo a hexadecimal y sumale 0x10. El resultado de esa operación deberás de usarlo para ejecutar otro ReadProcessMemory. Así hasta llegar a tu offset deseado.

(es un coñazo) xD

Te recomiendo que te leas mi tutorial avanzado de cheatengine, quizás puedas adquirir más conocimientos.

UN MILLÓN!!! muchisimas gracias, al fin lo he logrado jejeje.

Finalmente a quedado asi para los que en un futuro tengan mi problema:

CitarReadProcessMemory(hproc, (LPCVOID)(DLL + 0x007C3D1C), &ptr1, sizeof(ptr1), NULL);
       ReadProcessMemory(hproc, (LPCVOID)(ptr1 + 0x10), &ptr1, sizeof(ptr1), NULL);
       ReadProcessMemory(hproc, (LPCVOID)(ptr1 + 0x2c), &ptr1, sizeof(ptr1), NULL);
       ReadProcessMemory(hproc, (LPCVOID)(ptr1 + 0x3e0), &ptr1, sizeof(ptr1), NULL);
       ReadProcessMemory(hproc, (LPCVOID)(ptr1 + 0x17c), &ptr1, sizeof(ptr1), NULL);
       printf("CAST: %x\n", ptr1); //un casteo bastante balurdo xD

Me pasare por tu tutorial de cheat engine como lo has mencionado, soy nuevo en esto y es un tema bastante interesante ya que lo poco que se lo aprendi a coñazos xD :).

Saludos y repito muchisimas gracias a los que se molestaron en responder!

Mad Antrax

No hago hacks/cheats para juegos Online.
Tampoco ayudo a nadie a realizar hacks/cheats para juegos Online.