(Duda) Pregunta readprocessmemory array

Iniciado por Cromatico, 12 Abril 2011, 19:26 PM

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

Cromatico

Hola que tall, queria hacer una pregunta... Yo programo en vb6, pero la verdad queria pasar parte de las funciones de mi programa a c++ e interactuar con una dll... Ya logre crear una funcion de readprocessmemory y usarla desde vb:

void ReadLong(DWORD lpAddress, void* buf, long len)
{
  DWORD oldprot, dummy = 0;
  HWND hwnd = FindWindow(NULL, "VENTANA");

  if (hwnd)
  {
     DWORD proc_id;
     GetWindowThreadProcessId(hwnd, &proc_id);
     HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, proc_id);

     ReadProcessMemory(hProcess, (void *) lpAddress, buf, len, 0);
    CloseHandle(hProcess);
   
  }
  else
  {
     // Error
  }
}



El problema es que esta funcion, me devuelve un valor de 4 bytes, y estoy tratando de leer un texto, "70 00 72 00 75 00 65 00 62 00 61" ("prueba" sin los nops), y en 4bytes seria "7471216", la cuestion es que no se como hacer que la funcion me devuelva el array "70 00 72 00 75 00 65 00 62 00 61", para luego convertirlo a texto :(...

Alguien me puede dar una mano? Gracias!!!

Arkangel_0x7C5

el parámetro len de ReadProcessMemory(hProcess, (void *) lpAddress, buf, len, 0); le dice cuanto puede leer de maximo.

Cromatico

Hola Arcangel_0x7C5, gracias por contestarme... Bueno aver yo la llamo asi mira:

DWORD dwHP;
ReadLong(Address,&dwHP,"4");


Pero si en vez de 4 pongo mas, me tira error :(

Esto me devuelve la funcion: "7471216"
Que no se que tiene que ver con: "70 00 72 00 75 00 65 00 62 00 61"

:S Gracias!

Arkangel_0x7C5

#3
Cita de: Cromatico en 12 Abril 2011, 21:22 PM
Hola Arcangel_0x7C5, gracias por contestarme... Bueno aver yo la llamo asi mira:

DWORD dwHP;
ReadLong(Address,&dwHP,"4");


Pero si en vez de 4 pongo mas, me tira error :(

Esto me devuelve la funcion: "7471216"
Que no se que tiene que ver con: "70 00 72 00 75 00 65 00 62 00 61"

:S Gracias!
porque un DWORD solo permite almacenar 4 bytes. De todas maneras, el 4 entre comillas es una cadena de caracteres y no un numero entero. por lo que me extraña que no te de error

yo haria esto:
Código (cpp) [Seleccionar]

BYTE Array[20];
ReadLong(Address,&Array,20);

y con DWORD asi:
Código (cpp) [Seleccionar]

DWORD Array[20];
ReadLong(Address,&Array,sizeof(DWORD)*20);

Cromatico

#4
Si disculpame es que lo escribi desde aca, y tengo muy adoptado el vb me olvide de las comillas...
Ahora pruebo y te comento, muchas gracias!


EDIT:
Mejor imposible, muchisimas gracias Arcangel_0x7C5!!!


SOLUCIONADO!

Cromatico

Hola disculpen que postee de nuevo, tengo una duda!!

yo llamo asi a la funcion:

long ReadLongVb (long Address)
{
BYTE Array[30];
ReadLong(Address,&Array,30);
return (Array[0]);
}


Esa es la funcion a la que llamo desde vb, seguramente se podra hacer directamente a la funcion ReadLong, pero bueno es la forma mas facil que encontre y funciona bien :P.

Entonces en vb recibo el array 0, pero la pregunta es, como hago para que me retorne todo el array completo?
E intentado muchas cosas pero no logre hacer que me retorne todo el array: 30...

Gracias!

Иōҳ

as que retorne un puntero al array y luego solo accedes a sus items....

Salu2!
Eres adicto a la Ing. Inversa? -> www.noxsoft.net

Cromatico

Mmm no entiendo lo que me intentas decir... yo llamo desde vb a la funcion ReadLongVb, la cual llama a ReadLong y le da el array...
Pero ReadLongVb me retorna solo 1 valor del array, en este caso el array[0]
No hay alguna forma de que me envie todos?
return (array[0] && array[1]); ...............

Gracias!

Arkangel_0x7C5

#8
Cita de: Cromatico en 13 Abril 2011, 00:22 AM
Hola disculpen que postee de nuevo, tengo una duda!!

yo llamo asi a la funcion:

long ReadLongVb (long Address)
{
BYTE Array[30];
ReadLong(Address,&Array,30);
return (Array[0]);
}


Esa es la funcion a la que llamo desde vb, seguramente se podra hacer directamente a la funcion ReadLong, pero bueno es la forma mas facil que encontre y funciona bien :P.

Entonces en vb recibo el array 0, pero la pregunta es, como hago para que me retorne todo el array completo?
E intentado muchas cosas pero no logre hacer que me retorne todo el array: 30...

Gracias!
para eso necesitas usar punteros, el problema es que VB no te deja manejar punteros directamente. tambien necesitarias usar memoria dinamica, porque las variables locales son sobrescritas al salir de la funcion que las creo, por lo que si la funcion debuelve un puntero a una variable local en esta no estara el contenido que uno espera.

EDIT:
mirate esta pagina: http://www.psicofxp.com/forums/programacion.313/292049-punteros-en-vb.html