[VB6] Memoria

Iniciado por calk9, 10 Diciembre 2011, 19:54 PM

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

calk9

Bueno, les explico: Estoy leyendo unas porciones de memoria de un programa con las siguientes funciones...

Código (vb) [Seleccionar]
Public Function ReadAnInt(gamewindowtext As String, address As Long, valbuffer As Integer)
Dim hwnd As Long
Dim pid As Long
Dim phandle As Long
hwnd = FindWindow(vbNullString, gamewindowtext)
GetWindowThreadProcessId hwnd, pid
phandle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)
ReadProcessMem phandle, address, valbuffer, 2, 0&
CloseHandle hProcess
End Function

Public Function ReadAByte(gamewindowtext As String, address As Long, valbuffer As Byte)
Dim hwnd As Long
Dim pid As Long
Dim phandle As Long
hwnd = FindWindow(vbNullString, gamewindowtext)
GetWindowThreadProcessId hwnd, pid
phandle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)

ReadProcessMem phandle, address, valbuffer, 1, 0&
CloseHandle hProcess
End Function


Estas me funcionan perfectamente, pero no he encontrado alguna para leer porciones de memoria las cuales devuelvan una cadena (string), en vez de un valor numérico. Si me pueden ayduar... estaría muy agradecido  :)

Gracias  :D

BlackZeroX

.
Lee completamende la descripción de ReadProcessMemomy con eso sabras que hacer.

Dulces Lunas!¡.
The Dark Shadow is my passion.

Unbr0ken

Para ser más específicos: Debes leer la dirección en memoria que contiene por valor tal cadena de texto, obviamente si haces esto tendrás que leer byte a byte, o un gran pedazo de memoria (que te devuelva una matriz de bytes) y convertir ésta a una cadena de texto, ya sea ANSI o Unicode. Mira éste enlace.

Salud.
Cita de: SnowcrashDiscutir con desconocidos por internet es un ejercicio de imbéciles; todos acaban siendo quinceañeros arrogantes con cantidades infinitas de tiempo libre.

NO resuelvo dudas vía MP, para algo está el foro.

Arconte

Ambas funciones hacen uso deReadProcessMen, en realidad su nombre es ReadProcessMemory , esa es la que debes buscar  aunque lo q encuentres seguro estara en ingles , pero es mejor q la comprendas en vez de q uses esas dos q no las entiendes, usando la q te digo puedes indicar  la porcion de memoria q kieres leer y q lo ponga en una variable string.

Unbr0ken

Cita de: Arconte en 10 Diciembre 2011, 21:03 PM
Ambas funciones hacen uso deReadProcessMen, en realidad su nombre es ReadProcessMemory , esa es la que debes buscar  aunque lo q encuentres seguro estara en ingles , pero es mejor q la comprendas en vez de q uses esas dos q no las entiendes, usando la q te digo puedes indicar  la porcion de memoria q kieres leer y q lo ponga en una variable string.

Y... ¿de qué valdría que la alojase en una variable de tipo string si no ha hecho la previa conversión?...
Cita de: SnowcrashDiscutir con desconocidos por internet es un ejercicio de imbéciles; todos acaban siendo quinceañeros arrogantes con cantidades infinitas de tiempo libre.

NO resuelvo dudas vía MP, para algo está el foro.

calk9

Cita de: Unbr0ken en 10 Diciembre 2011, 20:31 PM
Para ser más específicos: Debes leer la dirección en memoria que contiene por valor tal cadena de texto, obviamente si haces esto tendrás que leer byte a byte, o un gran pedazo de memoria (que te devuelva una matriz de bytes) y convertir ésta a una cadena de texto, ya sea ANSI o Unicode. Mira éste enlace.

Salud.

Creo que esto es lo que necesito, gracias! :) Ahora, me podrías informar de como leer   byte a byte,  si sos tan amable  :D ?

Gracias!

Arconte

No te entiendo a q te refieres con eso de hacer una previa conversion, lo q entendi es q el user q q pregunto kiere leer una cantidad de memoria superior a un byte y un integer  y necesita guardarlo en una var tipo string.
Creo q el user no sabe manejar las funciones api  .
Una breve explicacion:

La funcion OpenProcess lo q hace es abrir un acceso a un proceso "x" para hacer diversas cosas, en este caso para leer datos de su memoria, la funcion te devolvera un valor  q es el handle o manipulador para ese proceso "x" . Su primer parametro es el tipo de acceso   ,pomle PROCESS_SLL_ACCESS, el segundo dejalo en false, el tercero es el PID (id del proceso) q puedes verlo en el administrador de tarea.

La funcion ReadProcessMemory lee en la memoria de un proceso (cada proceso tiene su propio espacio de memoria), el primer parametro debes pasar el handle devuelto por OpenProcess, el segundo la direccion de memoria del proceso donde kieres leer ,el tercero la var string donde kieres almacenar esos datos leidos , pero primero debes inicializar la var string con espacios o lo q sea y debes pasarla como byval, el cuarto es la cantidad de bytes q vas a leer , este debe ser igual o menor a la cantidad de caracteres con q inicializaste tu var string, el quinto es una var numerica donde la funcion pondra la cantidad de bytes q pudo leer.

La funcion CloseHandle cierra el acceso abierto por OpenProcess, su unico parametro iria el handle, una vez q se termina de hacer lo q se kiere (leer), se debe cerrar ese acceso y el handle ya no valdra.
.
Las otras funciones FindWindow y GetWindowThreadProcessId lo q hacen es buscar una ventana por su titulo y obtener el PID . No importan si puedes obtener el PID en el admin. de tareas. 

Ahora debes buscar la sintaxis de esas funcioneso

raul338

Supongo que seria un string accesible desde otros lados, prueba con lstrlen para obtener cuanto necesita reservar, y de ahi lo lees o lo copias :)

calk9

Discuplen, pero he intentado y aun no he podido... me dan una manito mas ? :)

Gracias!

BlackZeroX

#9
Cita de: Unbr0ken en 10 Diciembre 2011, 21:18 PM
Y... ¿de qué valdría que la alojase en una variable de tipo string si no ha hecho la previa conversión?...

Lo que debe realmente saber es que tipo de String es... Unicole o ANSI, en vb6 el tipo String es Unicode es decir que SOLO debe transformar el tipo ANSI a Unicode... pero no es cuarlquier tipo de String es un BSTR

4Bytes : Longitud.
(Lotitud*2) Bytes: Datos.
2 Bytes de Terminación.

Lo que debe de hacer el compañero es:

1.- Copiar N Bytes en una cadena String o un Array de Bytes (segun el caso: ANSI = Array de Bytes, UNICODE = String) con un Buffer X (Anticipadamente)
2.- Verificar si lo copiado es de tipo ANSI.
2.1.- Para ANSI Cada caracter No debe tener una separacion de un Byte en valor 0.
2.2.- Para Unicode Cada Caracter deberia tener un Byte 0 y los 2 ultimos bytes serian 2 bytes en valor 0 (NULOS)
3.A.- Para el caso de que sea Unicode No hacer Nada (Solo fizear los espacios entre cada caracter y dejarlos en byte 0, almenos que sean caracteres ESPECIALES como caracteres CHINOS etc...).
3.A.- Para el caso de que sea una cadena tipo ANSI debera realizar un for next desde el indice inferior al mazimo y asignarlos en un String...:

Código (vb) [Seleccionar]

'Puedo tener errores debido que lo hice aqui en el foro.
dim i as long
dim bData() as byte
dim sBuff as string
...
Codigo que copia el array de bytes aqui...
...
sBuff = space(Ubound(bData) + 1)
for i = 0 to Ubound(bData)
    Mid$(sBuff, (i*2) ,1) = chr(bData(i))
next i


TODO lo puedes hacer con un array de bytes y despues solo intercalar puenteros... es un poco mas complejo si aun no sabes manipular estas cosillas.

Nopta: Recuerda Cambiar el parametro Size de ReadProcessMemomy (es el 4to parametro de izquierda a derecha) ya que este indica CUANTOS Bytes vas a copiar... aun asi leete mas la MSDN.

Dulces Lunas!¡.
The Dark Shadow is my passion.