dtruss терпит неудачу на пс на OS X 10.11

Я пытался увидеть, какой системный вызов ps использует, чтобы получить командную строку процесса в OS X 10.11 (El Capitan), и столкнулся со следующей ошибкой:

# dtruss ps -p 43520 -o args

dtrace: failed to execute ps: dtrace cannot control executables signed with restricted entitlements

Гугл привел к предположению, что создание копии ps позволил бы мне обойти это, но это не сработало для меня. Почему я не могу бежать dtruss на произвольных двоичных файлах больше, и есть ли способ для меня восстановить старое поведение?

2 ответа

Решение

Проблема связана с подписью кода. Если вы делаете копию, а затем повторно подписываете ее под своей собственной идентификацией (или, предположительно, любой идентификацией, не принадлежащей Apple), то dtrace прикреплю к нему просто отлично.

$ mkdir ~/temp
$ cp /bin/ps ~/temp/
$ codesign -f -s `whoami` ~/temp/ps
$ sudo dtruss ~/temp/ps -p 43520 -o args

не может управлять исполняемыми файлами, подписанными с ограниченными правами

Security Integrity Protection ("rootless") теперь не позволяет dtruss работать здесь.

Вы можете отключить его, загрузившись в режиме восстановления, но похоже, что dtrace был специально заблокирован независимо от состояния без root, что можно увидеть в исходном коде, если вы ищете "dtrace не может контролировать".

Вы также можете увидеть из комментариев в Pcreate:

    /*
     * <rdar://problem/13969762>:
     * If the process is signed with restricted entitlements, the libdtrace_dyld
     * library will not be injected in the process. In this case we kill the
     * process and report an error.
     */
Другие вопросы по тегам