Lectura directa de Memoria

Las preguntas relacionadas con la automatización de juegos van aquí.

Moderator: Flipeador

LEPTIS
Posts: 5
Joined: 23 Mar 2020, 15:48

Lectura directa de Memoria

25 Mar 2020, 06:17

Buenas.

Estoy tratando de escribir un script que lea una posición específica de memoria, utilizada por un programa (en este caso "Vsk5.exe").
El que la posición sea específicamente esa lo se porque la encuentro con Cheat Engine. La cuestión de los pointers y demás lo dejo para más adelante. El problema ahora es saber como acceder a la memoria utilizada por el programa, aunque sea solo por una vez.

El script es

Code: Select all

ReadMemory(MADDRESS,PROGRAM)
{
winget, pid, PID, %PROGRAM%

VarSetCapacity(MVALUE,4,0)
ProcessHandle := DllCall("OpenProcess", "Int", 24, "Char", 0, "UInt", pid, "UInt")
;DllCall("ReadProcessMemory","UInt",ProcessHandle,"UInt",MADDRESS,"Str",MVALUE,"UInt",4,"UInt *",0)
DllCall("ReadProcessMemory", "UInt", ProcessHandle, "Ptr", MADDRESS, "Ptr", &MVALUE, "Uint",4)

return, result
DllCall("CloseHandle", "UInt", ProcessHandle)
}

address:=F27CF24

value := ReadMemory(%address%, "Vsk5.exe")

MsgBox Value is %value%
La lectura de ReadMemory me da siempre "0", y no el valor reconocible que veo en Cheat Engine.

Aquí la dirección utilizada en el ReadMemory es la suma de la conocida más la dirección base del programa, es decir 1914 + 0F27B610.

Cheat Engine, en el momento de la localización de la dirección 0F27B610, me muestra arriba que estoy trabajando con el programa "00001940-Vsk5.exe".

Ya digo que el problema de que la dirección sea dinámica ya lo resolveré luego y se que tengo que cambiar la dirección tantas veces como cambie en el programa.

¿Que estoy haciendo mal? (o rematadamente mal)

Muchas gracias.
User avatar
Flipeador
Posts: 1172
Joined: 15 Nov 2014, 21:31
GitHub: Flipeador
Location: Argentina
Contact:

Re: Lectura directa de Memoria

Yesterday, 06:12

Hola,
1) Tal vez querías usar Process Exist en lugar de WinGet.
2) Los tipos de datos de tus DllCall son incorrectos:

Code: Select all

DllCall("OpenProcess", "UInt", 24, "Int", FALSE, "UInt", pid, "UPtr")
DllCall("ReadProcessMemory", "Ptr", ProcessHandle, "Ptr", MADDRESS, "Ptr", &MVALUE, "Ptr", 4, "PtrP", 0)
DllCall("CloseHandle", "Ptr", ProcessHandle)
3) return result debe estar despues de DllCall("CloseHandle") para cerrar ProcessHandle.
4) La variable result no está definida en ninguna parte, por lo que la función ReadMemory devuelve una cadena vacía. Debes devolver el valor de NumGet pasando MVALUE. Si el valor que se va a recuperar es un número, el código se puede reducir/optimizar quitando VarSetCapacity y ajustando el tipo de datos del parámetro LPVOID de la función ReadProcessMemory, por ejemplo a "UIntP", valor:=0 si se trata de un número entero sin signo de 32-Bit.
5) F27CF24 no es un número, es el nombre de una variable, en este caso indefinida. Si se supone debería ser un número en hexadecimal, usar 0xF27CF24 en su lugar.
6) Debes quitar % en %address% (ver Expressions).
LEPTIS
Posts: 5
Joined: 23 Mar 2020, 15:48

Re: Lectura directa de Memoria

Yesterday, 14:08

Muchas gracias.

Ya veo que era más de un problema.

Return to “Automatización de Juegos”

Who is online

Users browsing this forum: No registered users and 24 guests