elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Curso de javascript por TickTack


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  [VB6] Memoria
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: [VB6] Memoria  (Leído 4,628 veces)
calk9

Desconectado Desconectado

Mensajes: 69


Ver Perfil
[VB6] Memoria
« en: 10 Diciembre 2011, 19:54 pm »

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

Código
  1. Public Function ReadAnInt(gamewindowtext As String, address As Long, valbuffer As Integer)
  2. Dim hwnd As Long
  3. Dim pid As Long
  4. Dim phandle As Long
  5. hwnd = FindWindow(vbNullString, gamewindowtext)
  6. GetWindowThreadProcessId hwnd, pid
  7. phandle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)
  8. ReadProcessMem phandle, address, valbuffer, 2, 0&
  9. CloseHandle hProcess
  10. End Function
  11.  
  12. Public Function ReadAByte(gamewindowtext As String, address As Long, valbuffer As Byte)
  13. Dim hwnd As Long
  14. Dim pid As Long
  15. Dim phandle As Long
  16. hwnd = FindWindow(vbNullString, gamewindowtext)
  17. GetWindowThreadProcessId hwnd, pid
  18. phandle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)
  19.  
  20. ReadProcessMem phandle, address, valbuffer, 1, 0&
  21. CloseHandle hProcess
  22. End Function
  23.  

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


« Última modificación: 11 Diciembre 2011, 00:09 am por raul338 » En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: [VB6] Memoria
« Respuesta #1 en: 10 Diciembre 2011, 20:21 pm »

.
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 Desconectado

Mensajes: 248



Ver Perfil
Re: [VB6] Memoria
« Respuesta #2 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.
En línea

Cita de: Snowcrash
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 Desconectado

Mensajes: 43



Ver Perfil
Re: [VB6] Memoria
« Respuesta #3 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.
En línea

Unbr0ken

Desconectado Desconectado

Mensajes: 248



Ver Perfil
Re: [VB6] Memoria
« Respuesta #4 en: 10 Diciembre 2011, 21:18 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?...
En línea

Cita de: Snowcrash
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 Desconectado

Mensajes: 69


Ver Perfil
Re: [VB6] Memoria
« Respuesta #5 en: 10 Diciembre 2011, 23:22 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!
En línea

Arconte

Desconectado Desconectado

Mensajes: 43



Ver Perfil
Re: [VB6] Memoria
« Respuesta #6 en: 11 Diciembre 2011, 00:07 am »

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 Desconectado

Mensajes: 2.633


La sonrisa es la mejor forma de afrontar las cosas


Ver Perfil WWW
Re: [VB6] Memoria
« Respuesta #7 en: 11 Diciembre 2011, 00:12 am »

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 Desconectado

Mensajes: 69


Ver Perfil
Re: [VB6] Memoria
« Respuesta #8 en: 11 Diciembre 2011, 02:16 am »

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

Gracias!
En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: [VB6] Memoria
« Respuesta #9 en: 11 Diciembre 2011, 03:55 am »

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
  1. 'Puedo tener errores debido que lo hice aqui en el foro.
  2. dim i as long
  3. dim bData() as byte
  4. dim sBuff as string
  5. ...
  6. Codigo que copia el array de bytes aqui...
  7. ...
  8. sBuff = space(Ubound(bData) + 1)
  9. for i = 0 to Ubound(bData)
  10.    Mid$(sBuff, (i*2) ,1) = chr(bData(i))
  11. next i
  12.  

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.
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines