2015-10-22 27 views
7

starałem się sprawdzić, które syscall ps używa uzyskać z wiersza poleceń procesu na OS X 10.11 (El Capitan), i wpadł na następujący błąd:dtruss nie na PS OS X 10.11

# dtruss ps -p 43520 -o args 

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

Googling spowodował sugestię, że zrobienie kopii ps pozwoliłoby mi ominąć to, ale to nie zadziałało. Dlaczego nie mogę już uruchomić dtruss w dowolnych plikach binarnych i czy jest jakiś sposób przywrócenia starego zachowania?

Odpowiedz

10

Kwestia ma do czynienia z podpisem kodu. Jeśli utworzysz kopię, a następnie ponownie ją podpisujesz z własną tożsamością (lub prawdopodobnie inną tożsamością niż Apple), wtedy dtrace dołączy do niej po prostu dobrze.

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

Tak, to ma sens, ponieważ komentarz w kodzie źródłowym odnosi się do procesu podpisanego z ograniczonymi uprawnieniami, więc usunięcie podpisu zmieniłoby sposób obsługi tej logiki. – TheDarkKnight

4

cannot control executables signed with restricted entitlements

Ochrona integralności zabezpieczeń ("rootless") uniemożliwia obecnie działanie dtruss.

Można disable it przez uruchomienie w trybie odzyskiwania, ale wygląda na to dtrace został specjalnie został zablokowany niezależnie od stanu rootless, jak widać w source code jeśli szukać „DTrace'owi nie mogą kontrolować”.

Można również zobaczyć z uwagami w 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. 
    */ 
+0

Czy wyłączenie to faktycznie działa dla Ciebie? – Glyph

+0

@ Glyph, no dtrace zostało specjalnie zaprojektowane, aby nie działało na procesach systemowych. Zaktualizowałem odpowiedź. – TheDarkKnight