Wenn Sie in der Lage sind, Speicherbereiche zwischen Prozessen zu teilen, sollten Sie shm_open (2) und mmap (2) ausprobieren. Es ist ziemlich einfach, einen Teil des Speichers in einem Prozess zuzuweisen und den Pfad (für shm_open) an einen anderen zu übergeben, und beide können dann gemeinsam verrückt werden. Dies ist viel sicherer, als im Adressraum eines anderen Prozesses herumzustochern, wie Chris Hanson erwähnt. Natürlich, wenn Sie beide Prozesse nicht kontrollieren können, wird Ihnen das nicht viel nützen.
(Beachten Sie, dass der maximale Weglänge für shm_open erscheint 26 Bytes zu sein, obwohl dies nicht überall dokumentiert zu sein scheint.)
// 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()
Ich interessiere mich besonders für den Fall, in dem ich den anderen Prozess nicht kontrolliere - d. H. Herumstochern in jemand anderen Programm, um zu sehen, was es macht. (Vermutlich nach [ASLR deaktivieren] (http://stackoverflow.com/questions/6325537/disabling-aslr-in-mac-os-x-snow-leopard).) –
Ich verstehe nicht, welchen Teil des Prozesses Sie möchte lesen. Haben Sie den Adressraum für den Wandprozess wie in den Core-Dump-Dateien? Sie benötigen Code, um Threads und (manchmal) gemeinsam genutzte Bibliotheken zu bearbeiten. Sie brauchen (meistens) diesen Code nicht, wenn er zum Beispiel nur das Programm binary in ram sucht. – user2284570
@ user2284570 Ich interessiere mich dafür, den Arbeitsgedächtnis eines Prozesses zu beobachten oder zu manipulieren, nicht den ausführbaren Code. –