Как получить доступ к памяти из одной программы в другой

У меня есть сторонняя программа с закрытым исходным кодом, и я хочу иметь возможность

  • Знайте, какая память выделена программе
  • Доступ к этой памяти (только чтение в порядке)

Утилиты, такие как vmmap (1), куча (1) и утечки (1), похоже, имеют сходную функциональность с тем, что мне нужно, но я не могу найти их источник нигде (версии OS X) и не могу как они работают. Предпочтительно, это все будет сделано в пользовательском пространстве, возможно, выполняется как root, я не хочу писать код ядра для обхода защиты памяти, если я могу его избежать.

Я попытался использовать разделяемую память, передав адрес того, что я хочу прочитать как 2-й аргумент shmat (2), но это было в конечном счете безуспешным (и, вероятно, не его предполагаемым использованием и/или плохой практикой), и все же оставило меня без способ определить, какую память я ищу в любом случае (программа, которой принадлежит память, должна была сообщить свой адрес мне).

Есть ли способ отключить защиту памяти для определенной программы, чтобы она не выполнялась при попытке чтения/записи памяти, выделенной для другого процесса? Есть ли лучший способ, который бы не позволял ошибкам серьезно повредить всю мою систему?

Как это достигается?

Ответ 2

В принципе, этот парень прав.

Загрузите исходный код, который сопровождает эту книгу и см. vm_rw_master.c примера 8-16 для рабочей реализации.

Смотрите http://web.mit.edu/darwin/src/modules/xnu/osfmk/man/ для документации, она немного устарела и сомнительно правильная, но она лучше всего доступна.

EDIT: см. http://lightbulbone.com/2011/05/dumping-process-memory-on-mac-os-x/ (обратите внимание, что задача, у которой есть память, которую вы пытаетесь прочитать, НЕ должна быть ребенок процесса пытается сделать чтение, вам просто нужно иметь правильное разрешение.)

EDIT: см. http://os-tres.net/blog/2010/02/17/mac-os-x-and-task-for-pid-mach-call/ для хорошего примера авторизации.