OS X: Изменяются ли разделы в сегменте __TEXT другими программами?

Бывает ли так, что какая-то программа (или даже сама ОС) изменяет содержимое сегмента __TEXT исполняемого файла по какой-либо причине?

  • Примечание. Здесь я имею в виду сегмент «__TEXT», а не раздел «__text».

Другими словами: могу ли я полагаться на байты в сегменте __TEXT моего исполняемого файла, чтобы определить, был ли мой исполняемый файл поврежден (скажем, путем вычисления контрольной суммы в этом сегменте), или есть вероятность, что я получу ложные срабатывания, потому что этот сегмент может быть изменен после установки программы на компьютер пользователя?

Спасибо!


person Carl Seleborg    schedule 06.11.2009    source источник


Ответы (1)


Сегменты, по сути, являются конструкцией виртуальной памяти: они обычно выравниваются по границам страниц, поэтому в конечном итоге они могут содержать немного больше, чем код вашего приложения. Поскольку сегмент __TEXT обычно начинается в начале файла Mach-O, он обычно также включает заголовки Mach-O.

В OS X 10.3 и более ранних версиях предварительная привязка могла повлиять на сегмент __TEXT (который подробно описан здесь< /а>). В более поздних версиях подпись кода также может изменить сегмент __TEXT.

Возможно, вам захочется изучить встроенный в OS X механизм подписи кода (причина и решение вашей проблемы?). Некоторые рекомендуемые ссылки:

Вы можете найти macholib полезными для изучения. (Он включен в последние версии OS X для поддержки py2app.) Вот простой сценарий, который я использовал для извлечения сегмента __TEXT.

from macholib.MachO import MachO

m = MachO('foo')
__TEXT = (cmd for load_cmd, cmd, data in m.headers[0].commands
          if getattr(cmd, 'segname', '').rstrip('\0') == '__TEXT').next()
print '__TEXT segment: offset %x size %x' % (__TEXT.fileoff, __TEXT.filesize)
f = open('foo', 'rb')
f.seek(__TEXT.fileoff)

open('foo__TEXT', 'wb').write(f.read(__TEXT.filesize))

Конечно, вы также можете использовать otool -lv, но вывод будет немного беспорядочным и сложным для анализа.

person Nicholas Riley    schedule 07.11.2009
comment
Спасибо Николай, это действительно задокументированный ответ! Я расследую все это, как только вернусь к работе. - person Carl Seleborg; 08.11.2009
comment
Да, оказывается, что подпись кода, в основном, происходит каждый раз, когда вы загружаете приложение и нажимаете «Авторизовать» во всплывающем окне с вопросом, безопасно ли запускать это, что является частой причиной изменения __TEXT. - person Carl Seleborg; 24.06.2010