Hola.
Doy a entender que se debe estar refiriendo al espacio de memoria asignado/alojado por "X" proceso.
Puedes mencionar ese foro. Muestra la firma de las funciones VirtualQueryEx y ReadProcessMemory, una firma equivocada podría ser el causante de todo un problema, y no somos adivinos. Un valor de retorno de Cero en cualquiera de ambas funciones significa ERROR; si es eso lo que te devuelve Cero entonces depura dicho error con el miembro System.Runtime.InteropServices.Marshal.GetLastWin32Error() + la clase System.ComponentModel.Win32Exception.
En general ese código es bastante spaghetti.
Lo que no sé es si quieres leer un segmento/región/página de la memoria, o el espacio de memoria al completo. En el segundo caso a esto lo podriamos llamar un dump o dumpeo de la memoria, y para ello la API de Windows nos proporciona una función de nombre MiniDumpWriteDump:
Dicha función es útil en escenarios de depuración, en casos donde queramos dumpear la memoria junto a otra información de depuración de un proceso (ej. los módulos cargados), a un archivo local. Hay que tener en cuenta que esto no se limita a escribir los datos/bytes "raw" del espacio de memoria, sino un archivo de extensión .dmp (minidump) que podemos leer con ciertas herramientas de depuración. Funciona tanto para dumpear executables .NET, como executables nativos, pero lo cierto es que por experiencia sé que puede dar problemas extraños al intentar dumpear algún proceso (nunca llegué a averiguar muy bien la razón).
...Pero todo esto que he explicado aquí arriba es puramente informativo, es para tomárselo como una alternativa (puesto que su propósito es escribir información de depuración, no solo los bytes raw de la memoria, como ya expliqué). La solución tradicional para leer/escanear la memoria de un proceso externo, bueno, lo cierto es que no soy un experto en temas de ing. inversa, pero yo diría que podría ser de la siguiente forma:
1. Utilizar la clase System.Diagnostics.Process (o en su defecto la función Win32 OpenProcess) para localizar el proceso objetivo y obtener su handle.
2. Utilizar la función Win32 VirtualQueryEx para determinar el tamaño de cada región de la memoria.
3. Utilizar la función Win32 ReadProcessMemory para leer la región de memoria.
Ejemplos por separado y para todo, los tienes en la World Wide Web.
Saludos.
Cita de: TickTack en 23 Julio 2017, 20:28 PMO a que te refieres con memoria? Que memoria?
Doy a entender que se debe estar refiriendo al espacio de memoria asignado/alojado por "X" proceso.
Cita de: Rekt en 22 Julio 2017, 12:37 PMHe encontrado esto en un foro, pero siempre devuelve 0
Puedes mencionar ese foro. Muestra la firma de las funciones VirtualQueryEx y ReadProcessMemory, una firma equivocada podría ser el causante de todo un problema, y no somos adivinos. Un valor de retorno de Cero en cualquiera de ambas funciones significa ERROR; si es eso lo que te devuelve Cero entonces depura dicho error con el miembro System.Runtime.InteropServices.Marshal.GetLastWin32Error() + la clase System.ComponentModel.Win32Exception.
En general ese código es bastante spaghetti.
Lo que no sé es si quieres leer un segmento/región/página de la memoria, o el espacio de memoria al completo. En el segundo caso a esto lo podriamos llamar un dump o dumpeo de la memoria, y para ello la API de Windows nos proporciona una función de nombre MiniDumpWriteDump:
Dicha función es útil en escenarios de depuración, en casos donde queramos dumpear la memoria junto a otra información de depuración de un proceso (ej. los módulos cargados), a un archivo local. Hay que tener en cuenta que esto no se limita a escribir los datos/bytes "raw" del espacio de memoria, sino un archivo de extensión .dmp (minidump) que podemos leer con ciertas herramientas de depuración. Funciona tanto para dumpear executables .NET, como executables nativos, pero lo cierto es que por experiencia sé que puede dar problemas extraños al intentar dumpear algún proceso (nunca llegué a averiguar muy bien la razón).
...Pero todo esto que he explicado aquí arriba es puramente informativo, es para tomárselo como una alternativa (puesto que su propósito es escribir información de depuración, no solo los bytes raw de la memoria, como ya expliqué). La solución tradicional para leer/escanear la memoria de un proceso externo, bueno, lo cierto es que no soy un experto en temas de ing. inversa, pero yo diría que podría ser de la siguiente forma:
1. Utilizar la clase System.Diagnostics.Process (o en su defecto la función Win32 OpenProcess) para localizar el proceso objetivo y obtener su handle.
2. Utilizar la función Win32 VirtualQueryEx para determinar el tamaño de cada región de la memoria.
3. Utilizar la función Win32 ReadProcessMemory para leer la región de memoria.
Ejemplos por separado y para todo, los tienes en la World Wide Web.
Saludos.