CitarTe explico como es lo que quiero hacer:
Tengo este Pointer: "Proceso"+001913B8 - Offset0: 104 - Offset1: bdc - Offset2: 60
Y quiero mostrarlo en una label del proyecto.
Como podria lograrlo? Estuve investigando lo de clase Marshal pero no lo entendi muy bien.
Quieres representar los datos de un puntero a una dirección que reside en otro proceso. Cuando veas un puntero de la forma "Proceso" + Dirección (0x...) lo que tienes realmente es la dirección base del proceso (base address) + la dirección. Por ejemplo: "Firefox" + 0x456A será la base address de firefox digamos 0x400000 quedaría 0x400000 + 0x456A.
En .NET es sencillo coger la base address de un proceso cualquiera (mientras tengas los mismos permisos que el proceso al que se abrirá el HANDLE):
Código (csharp) [Seleccionar]
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool ReadProcessMemory(
IntPtr hProcess,
IntPtr lpBaseAddress,
[Out] byte[] lpBuffer,
int dwSize,
out IntPtr lpNumberOfBytesRead);
public static void Main (string[] args)
{
Process proc = Process.GetProcessesByName ("Firefox")[0];
IntPtr ptr = 0xDEADBEEF + proc.MainModule.BaseAddress;
IntPtr prochandle = proc.Handle;
byte[] bytes = new byte[40];
IntPtr readbytes = new IntPtr();
ReadProcessMemory (prochandle, ptr, bytes, bytes.Length, out readbytes);
string data = Encoding.ASCII.GetString(bytes);
}
En data tendrías el valor del puntero leído. Cambia 0xDEADBEEF y Firefox por la dirección del puntero y por el nombre del proceso. Cambia el 40 de byte[] bytes=new byte[40] por la longitud que quieres leer del puntero. Si todo va bien debería salirte.
Saludos!