2015-11-16 6 views

ответ

2

К сожалению, функция поиска основного исполняемого файла процесса vnode, proc_getexecutablevnode() находится в закрытом KPI, который доступен только для kexts, опубликованных Apple.

Информация хранится в поле p_textvpstruct proc, что еще раз не является частью публики. ABI - Apple может изменить свое расположение, поэтому, даже если вы импортируете свое определение в свой код, ваш код может быть неверно в будущих или более старых версиях OS X.

Возможно, вы сможете получить информацию через механизм sysctl, но я не вижу очевидного способа сделать это. Вы должны иметь возможность получать информацию в пользовательском пространстве с помощью системного вызова proc_info(). Apple не документирует, но вы можете прочитать источник.

Наконец, если ваш kext загружен во время загрузки, вы можете сами отслеживать исполняемый файл процесса, зарегистрировав слушателя KAUTH в KAUTH_SCOPE_FILEOP. Событие KAUTH_FILEOP_EXEC расскажет вам, когда процесс (успешно) вызывает одну из функций exec(), включая рассматриваемый vnode.

И, наконец, имейте в виду, что путь к исполняемому файлу необязательно определен. В отличие от Windows, исполняемые файлы могут быть перемещены или удалены, поэтому путь может измениться или полностью исчезнуть. Более того, файлы могут быть жестко привязаны, и в этом случае они имеют несколько путей. vnode_t - это тип ядра, который идентифицирует файл, независимо от его имени/пути/и т. Д. - обычный пользовательский процесс всегда будет иметь исполняемый файл vnode, но у vnode может отсутствовать допустимый путь. Убедитесь, что ваш код этого не ожидает.

+0

Большое спасибо @pmdj. Я попробую подход 'p_textvp'. Дай вам знать, что все получится! – Joseph

+0

_ «p_textvp» не используется. В Дарвине proc не является корнем адресного пространства, задача такова: нет понятия «vnode» для адресного пространства задачи, поскольку оно не обязательно изначально заполняется картографированием один. [...] "_ [cont] (https://lists.apple.com/archives/Darwin-drivers/2005/Dec/msg00026.html) – Joseph

+0

Вы знаете, как получить доступ к' p-> p_textvp' ? Поскольку я получаю «неполное определение ошибки типа struct proc» типа [здесь] (https://stackoverflow.com/questions/17512950/xnu-incudes-in-kext). Добавление 'proc_internal.h' вызывает много других ошибок, связанных с определением структур' lck_mtx_t', которые не видны. – Joseph