Tema destacado: Deseas probar algunas mejoras a la interfaz del foro? Prueba cake! acerca de
Autor
|
Tema: [VB6] Memoria (Leído 759 veces)
|
calk9
Desconectado
Mensajes: 55
|
Bueno, les explico: Estoy leyendo unas porciones de memoria de un programa con las siguientes funciones... 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 
|
|
|
|
« Última modificación: 11 Diciembre 2011, 00:09 por raul338 »
|
En línea
|
|
|
|
|
|
Unbr0ken
Desconectado
Mensajes: 248
|
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.
|
|
|
|
|
En línea
|
Discutir 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
Desconectado
Mensajes: 24
|
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.
|
|
|
|
|
En línea
|
|
|
|
Unbr0ken
Desconectado
Mensajes: 248
|
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?...
|
|
|
|
|
En línea
|
Discutir 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
Desconectado
Mensajes: 55
|
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  ? Gracias!
|
|
|
|
|
En línea
|
|
|
|
Arconte
Desconectado
Mensajes: 24
|
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
|
|
|
|
|
En línea
|
|
|
|
|
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 
|
|
|
|
|
En línea
|
|
|
|
calk9
Desconectado
Mensajes: 55
|
Discuplen, pero he intentado y aun no he podido... me dan una manito mas ?  Gracias!
|
|
|
|
|
En línea
|
|
|
|
BlackZeroX (Astaroth)
Wiki
Desconectado
Mensajes: 2.832
I'Love...!¡.
|
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...: '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!¡.
|
|
|
|
« Última modificación: 11 Diciembre 2011, 03:59 por BlackZeroX (Astaroth) »
|
En línea
|
|
|
|
Unbr0ken
Desconectado
Mensajes: 248
|
No me agrada ni poco VB6; por eso no perderé tiempo creando funciones que nunca usaré. Te dejo aquí un proyecto (incompleto por desgracia) de un amigo del CE-F... el cual tiene lo que necesitas, una lectura en memoria se te haría fácil si usas la función ReadString. Ojo, el proyecto en su totalidad (por tanto el crédito) pertenece a Wiccan. Salud.
|
|
|
|
|
En línea
|
Discutir 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.
|
|
|
BlackZeroX (Astaroth)
Wiki
Desconectado
Mensajes: 2.832
I'Love...!¡.
|
* Hacer una función de unas cuantas lineas no lleva ni siquiera 1 minuto, pero de alguna manera es mejor no hacerla, si no GUIAR al individuo en la creación de una funcion.
Nota: La funcion ReadString hace esactamente lo que mencione... se puede pulir pero no creo que sea el caso.
Dulces Lunas!¡.
|
|
|
|
« Última modificación: 11 Diciembre 2011, 16:01 por raul338 »
|
En línea
|
|
|
|
|
raul338
|
No me agrada ni poco VB6; por eso no perderé tiempo creando funciones que nunca usaré.
Cuales son las ganas de trollear? 
|
|
|
|
|
En línea
|
|
|
|
calk9
Desconectado
Mensajes: 55
|
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...: '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!¡. Gracias!! No me agrada ni poco VB6; por eso no perderé tiempo creando funciones que nunca usaré. Te dejo aquí un proyecto (incompleto por desgracia) de un amigo del CE-F... el cual tiene lo que necesitas, una lectura en memoria se te haría fácil si usas la función ReadString. Ojo, el proyecto en su totalidad (por tanto el crédito) pertenece a Wiccan. Salud. Gracias!! Me ha servido Suerte!
|
|
|
|
|
En línea
|
|
|
|
|
|