Si desea poder compartir fragmentos de memoria entre procesos, debe consultar shm_open (2) y mmap (2). Es bastante fácil asignar un trozo de memoria en un proceso y pasar la ruta (para shm_open) a otro y ambos pueden volverse locos. Esto es mucho más seguro que hurgar en el espacio de direcciones de otro proceso como menciona Chris Hanson. Por supuesto, si no tiene control sobre ambos procesos, esto no le servirá de mucho.
(Tenga en cuenta que la longitud del recorrido máximo para shm_open parece ser 26 bytes, aunque esto no parece no ser documentada en cualquier lugar.)
// Create shared memory block
void* sharedMemory = NULL;
size_t shmemSize = 123456;
const char* shmName = "mySharedMemPath";
int shFD = shm_open(shmName, (O_CREAT | O_EXCL | O_RDWR), 0600);
if (shFD >= 0) {
if (ftruncate(shFD, shmemSize) == 0) {
sharedMemory = mmap(NULL, shmemSize, (PROT_READ | PROT_WRITE), MAP_SHARED, shFD, 0);
if (sharedMemory != MAP_FAILED) {
// Initialize shared memory if needed
// Send 'shmemSize' & 'shmemSize' to other process(es)
} else handle error
} else handle error
close(shFD); // Note: sharedMemory still valid until munmap() called
} else handle error
...
Do stuff with shared memory
...
// Tear down shared memory
if (sharedMemory != NULL) munmap(sharedMemory, shmemSize);
if (shFD >= 0) shm_unlink(shmName);
// Get the shared memory block from another process
void* sharedMemory = NULL;
size_t shmemSize = 123456; // Or fetched via some other form of IPC
const char* shmName = "mySharedMemPath";// Or fetched via some other form of IPC
int shFD = shm_open(shmName, (O_RDONLY), 0600); // Can be R/W if you want
if (shFD >= 0) {
data = mmap(NULL, shmemSize, PROT_READ, MAP_SHARED, shFD, 0);
if (data != MAP_FAILED) {
// Check shared memory for validity
} else handle error
close(shFD); // Note: sharedMemory still valid until munmap() called
} else handle error
...
Do stuff with shared memory
...
// Tear down shared memory
if (sharedMemory != NULL) munmap(sharedMemory, shmemSize);
// Only the creator should shm_unlink()
Estoy particularmente interesado en el caso en que no controlo el otro proceso, es decir, hurgando en el programa de otra persona para ver qué está haciendo. (Presumiblemente después de [deshabilitar ASLR] (http://stackoverflow.com/questions/6325537/disabling-aslr-in-mac-os-x-snow-leopard).) –
No entiendo qué parte del proceso Quiero leer. ¿Tienes que obtener el espacio de direcciones del proceso de muro como en los archivos de volcado del núcleo? Necesita código para manejar hilos y (a veces) bibliotecas compartidas. Usted (en su mayoría) no necesita este código si solo busca el programa binario en RAM por ejemplo. – user2284570
@ user2284570 Me interesa observar o manipular la memoria de trabajo de un proceso, no el código ejecutable. –