Autor
|
Tema: [SOLUCIONADO] Acceso a dirección de memoria con pointers en varios niveles (Leído 4,273 veces)
|
panax
Desconectado
Mensajes: 5
|
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.
|
|
« Última modificación: 6 Mayo 2014, 17:00 pm por Mad Antrax »
|
En línea
|
|
|
|
Miseryk
Desconectado
Mensajes: 225
SI.NU.SA U.GU.DE (2NE1 - D-Unit)
|
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!
|
|
|
En línea
|
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
Desconectado
Mensajes: 5
|
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.
|
|
|
En línea
|
|
|
|
x64core
Desconectado
Mensajes: 1.908
|
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
|
|
|
En línea
|
|
|
|
panax
Desconectado
Mensajes: 5
|
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: hwnd = 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 . Saludos.
|
|
|
En línea
|
|
|
|
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
|
|
|
En línea
|
No hago hacks/cheats para juegos Online. Tampoco ayudo a nadie a realizar hacks/cheats para juegos Online.
|
|
|
panax
Desconectado
Mensajes: 5
|
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 . 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: GetWindowThreadProcessId(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.
|
|
|
En línea
|
|
|
|
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.
|
|
|
En línea
|
No hago hacks/cheats para juegos Online. Tampoco ayudo a nadie a realizar hacks/cheats para juegos Online.
|
|
|
panax
Desconectado
Mensajes: 5
|
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: ReadProcessMemory(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!
|
|
|
En línea
|
|
|
|
Mad Antrax
|
Ok, te marco el tema como solventado. Saludos
|
|
|
En línea
|
No hago hacks/cheats para juegos Online. Tampoco ayudo a nadie a realizar hacks/cheats para juegos Online.
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Error de acceso a memoria (no trabajo con memoria :S)
Programación Visual Basic
|
SERBice
|
8
|
4,926
|
21 Junio 2008, 13:56 pm
por Lambda
|
|
|
imprimir los bits que hay en una direccion de memoria
« 1 2 »
ASM
|
lapras
|
11
|
10,815
|
4 Diciembre 2009, 16:26 pm
por Yurix
|
|
|
Darle la vuelta a una direccion de memoria.
Análisis y Diseño de Malware
|
0xDani
|
2
|
2,890
|
2 Diciembre 2012, 21:02 pm
por 0xDani
|
|
|
Problema representación dirección de memoria en C.
Programación C/C++
|
lanun
|
6
|
2,825
|
28 Febrero 2014, 19:44 pm
por lanun
|
|
|
[Solucionado] Liberar memoria de 2 punteros apuntando a la misma dirección(C)
« 1 2 »
Programación C/C++
|
NOB2014
|
13
|
6,489
|
4 Mayo 2016, 14:41 pm
por MAFUS
|
|