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.
*/