Как проверить исполняемый файл MacOS (Mach-O)? - PullRequest
0 голосов
/ 02 июня 2018

Как просмотреть некоторую базовую информацию о двоичном файле MacOS, в частности, что использовалось для его создания, с какими платформами он связан и какие системные вызовы он использует?

Я пробовал nm и otool -L но их вывод только частично полезен.

Например, что будет означать, что двоичный файл был создан с помощью компилятора xcode или golang?

NB.Я не заинтересован в обратном инжиниринге MacOS двоичных файлов.Я просто хочу лучше узнать, что работает в моей системе, используя только те инструменты, которые уже включены OOTB.

1 Ответ

0 голосов
/ 02 июня 2018

Используемый компилятор не является тривиальным вопросом.Некоторые компиляторы встраивают информацию о себе, и иногда вы обнаруживаете, что запускаете strings, но это не гарантируется.Тем не менее, ответ на Mac почти всегда clang, поэтому не так уж сложно получить основы.В качестве примера:

strings iTunes | grep clang
COMPILER=clang-9.0.0

Но это всего лишь удача (и может даже не быть точной).

IDA Pro хорошо справляется с этой задачей и являетсязолотой стандарт для реверс-инжиниринга.Если для вас это важно, тогда IDA Pro - это инструмент.Это дорого.

Чтобы получить список платформ, на которые он ссылается во время выполнения, otool -L - это инструмент, который вам нужен.Я не понимаю, что вы подразумеваете под "не очень читабельным".Он просто распечатывает все рамки, по одной на строку.Трудно представить что-нибудь более читабельное, чем это.Что вы ищете здесь?

otool -L не скажет вам, какие статические библиотеки были использованы, поэтому «какие фреймворки были построены» могут быть слишком широкими, чтобы ответить.Как правило, вы можете найти символы для хорошо известных статических библиотек (например, OpenSSL), но там непросто точно знать, что было включено в двоичный файл, особенно если отладочная информация удалена.(Если есть отладочная информация, то пути к файлам будут, как правило, доступны, что может рассказать вам гораздо больше о том, как оно было построено.)

Нет простого статического способа получить список всех системные вызовы, так как они могут быть похоронены в библиотеках.nm обычно то, что вы хотите.Он включает в себя множество вещей, которые не являются «системными» вызовами, поскольку он будет включать в себя каждый символ, связанный с внешними источниками (вы, вероятно, захотите что-то вроде nm -ju).Опять же, я не уверен, что вы подразумеваете под "не очень читабельным".Это один символ на строку.

Чтобы получить список системных вызовов во время выполнения, запустите приложение с dtruss.Он будет выводить каждый системный вызов в том виде, как он сделан, и сосредоточится на реальных «системных» вызовах (т. Е. Системном вызове).

...