Autor
|
Tema: [VB6] Memoria (Leído 4,621 veces)
|
calk9
Desconectado
Mensajes: 69
|
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 am por raul338 »
|
En línea
|
|
|
|
BlackZeroX
Wiki
Desconectado
Mensajes: 3.158
I'Love...!¡.
|
. Lee completamende la descripción de ReadProcessMemomy con eso sabras que hacer. Dulces Lunas!¡.
|
|
|
En línea
|
The Dark Shadow is my passion.
|
|
|
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: 43
|
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: 69
|
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: 43
|
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
Desconectado
Mensajes: 2.633
La sonrisa es la mejor forma de afrontar las cosas
|
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: 69
|
Discuplen, pero he intentado y aun no he podido... me dan una manito mas ? Gracias!
|
|
|
En línea
|
|
|
|
BlackZeroX
Wiki
Desconectado
Mensajes: 3.158
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 am por BlackZeroX (Astaroth) »
|
En línea
|
The Dark Shadow is my passion.
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
cambiar memoria de un juego y escribir en memoria By Sacha
Ingeniería Inversa
|
EL PRINTERO
|
0
|
3,694
|
24 Agosto 2007, 23:36 pm
por EL PRINTERO
|
|
|
Error de acceso a memoria (no trabajo con memoria :S)
Programación Visual Basic
|
SERBice
|
8
|
4,723
|
21 Junio 2008, 13:56 pm
por Lambda
|
|
|
Memoria interna versus memoria RAM
Desarrollo Web
|
gatomadrid
|
1
|
4,178
|
2 Septiembre 2010, 12:26 pm
por XXXXXX
|
|
|
Desarrollan una memoria flexible que podría almacenar más datos que la memoria..
Noticias
|
wolfbcn
|
0
|
2,580
|
23 Octubre 2010, 18:08 pm
por wolfbcn
|
|
|
[DUDA] Acerca de Memoria Virtual Y Memoria Fisica Entre otros...
Programación C/C++
|
x64core
|
9
|
6,851
|
28 Noviembre 2011, 17:20 pm
por x64core
|
|