Чтение памяти другого процесса в OS X?

Вы можете использовать параметр key для list.sort():

my_list.sort(key=lambda x: x[1])

или, немного быстрее,

my_list.sort(key=operator.itemgetter(1))

(Как и в любом модуле, вы будете необходимо import operator, чтобы иметь возможность использовать его.)

19
задан Adam Tyszecki 24 November 2016 в 23:37
поделиться

5 ответов

Matasano Chargen имел хорошее сообщение некоторое время назад при портировании некоторого кода отладки к OS X, который включал изучение, как считать и записать память в другом процессе (среди прочего).

Это должно работать, иначе GDB не был бы :

оказывается, что Apple, в их бесконечной мудрости, разрушила ptrace(). Страница справочника OS X перечисляет следующие коды запроса:

  • PT_ATTACH — для выбора процесса для отладки
  • PT_DENY_ATTACH —, таким образом, процессы могут мешать себе быть отлаженными
    [...]

Никакое упоминание о чтении или записи памяти или регистров. Который был бы обескураживающим, если бы страница справочника также не упомянула PT_GETREGS, PT_SETREGS, PT_GETFPREGS, и PT_SETFPREGS в разделе кодов ошибок. Так, я проверил ptrace.h. Там я нашел:

  • PT_READ_I — для чтения командных слов
  • PT_READ_D — для чтения слов данных
  • PT_READ_U — для чтения данных области U, если you’re достаточно взрослый для запоминания то, что область U
    [...]

There’s одна решенная проблема. Я могу считать и записать память для точек останова. Но я все еще can’t получаю доступ к регистрам, и я должен смочь смешать с EIP.

10
ответ дан 30 November 2019 в 03:25
поделиться

Используйте task_for_pid() или другие методы для получения цели process’s порт задачи. После этого можно непосредственно управлять process’s адресным пространством с помощью vm_read(), vm_write(), и другие.

14
ответ дан 30 November 2019 в 03:25
поделиться

Она Вы надеетесь смочь совместно использовать блоки памяти между процессами, необходимо проверить shm_open (2) и mmap (2). Довольно легко выделить блок памяти в одном процессе и передать путь (для shm_open) другому, и оба могут затем сойти с ума вместе. Это намного более безопасно, чем ввод по абсолютному адресу вокруг в адресном пространстве другого процесса, как Chris Hanson упоминает. Конечно, если Вы не будете управлять обоими процессами, то это не сделает Вас много пользы.

(Знать, что макс. длина пути для shm_open, кажется, составляет 26 байтов, хотя это, кажется, не документируется нигде.)

// 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()
5
ответ дан 30 November 2019 в 03:25
поделиться

Управление памятью процесса за ее спиной является Плохой Вещью и чревато опасностью. Вот почему Mac OS X (как любая система Unix) защитил память и сохраняет процессы изолированными друг от друга.

, Конечно, это может быть сделано: существуют средства для общей памяти между процессами, которые явно сотрудничают. Существуют также способы управлять адресными пространствами других процессов, пока процесс, делающий так, имеет явное право сделать так (как предоставлено концепцией безопасности). Но это там для людей, которые пишут средства отладки для использования. Это не что-то, что должно быть нормальным — или даже редким — В возникновение для подавляющего большинства разработки на Mac OS X.

0
ответ дан 30 November 2019 в 03:25
поделиться

​​В целом я бы порекомендовал использовать Regular Open (), чтобы открыть временный файл. После того, как он открыт в обоих процессах, вы можете открыть () его из файловой системы, и вы будете настраиваться, как будто вы были бы, если бы вы использовали SHM_OPEN. Процедура чрезвычайно похожа на то, что указывается Скоттом Марси для Shm_open.

Недостатком этого подхода заключается в том, что если процесс, который будет выполнять сбои unlink (), вы заканчиваете неиспользуемый файл, и этот процесс не несет ответственности за его уборку. Этот недостаток совместно используются с SHM_OPEN, потому что, если ничего не в Shm_unlinks не имеет данного имени, имя остается в общем пространстве памяти, доступно для будущих процессов Shm_Oped.

1
ответ дан 30 November 2019 в 03:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: