Попытка исправить двоичный файл Mach-O в чистом виде C - PullRequest
0 голосов
/ 26 апреля 2020

У меня возникли проблемы с изменением двоичного файла в OSX

Итак, я смог добиться успешного исправления текстового раздела двоичного кода с помощью дополнительного кода; хотя под «успешно» я подразумеваю, что такие инструменты, как otool и nm, способны читать в двоичном коде и точно отображать его символы. Поэтому, используя otool -tV в недавно измененном двоичном файле, я вижу, что мой добавленный код без проблем добавлен в текстовый раздел.

Единственная проблема, с которой я столкнулся сейчас, заключается в том, что при попытке выполнить программа всегда вылетает с «ошибкой шины 10».

Так что моя модификация работает так:

I l oop над командами загрузки, пока не найду текстовый сегмент __TEXT, __ / раздел двоичного файла. Оказавшись здесь, я расширяю текстовый раздел на дополнительный размер кода, который я хочу исправить. Когда это будет сделано, все еще в текстовом разделе я перемещаю значения смещения __stubs, __stub_helpers и __const на дополнительный размер Код, который я хочу добавить в текстовый раздел. Когда я попадаю в раздел __cstring (здесь все становится немного сложнее), я ищу (давайте назовем это) энергонезависимую строку, из которой я могу «брать байты»; в общем, если код, который я хочу добавить, скажем, 10 байтов, я нахожу строку в разделе __cstring и уменьшаю ее на 10 байтов, чтобы сбалансировать ее. Строки, на которые я нацеливаюсь - это строки «использования». Строки типа ls, которые имеют значение

usage: ls [-ABCFGHLOPRSTUWabcdefghiklmnopqrstuwx1] [file ...]

Это приятно и долго без спецификаторов формата, которые могут помешать. Я бы взял только байты в середине строки, чтобы предотвратить случайное удаление символа \ x00 в конце строки.

После этого мне больше не нужно изменять смещения, так как из-за этого действия я просто уменьшил размер раздела __cstring, и каждый раздел после него теперь правильно выровнен, как это было.

Проблема сейчас заключается в том, что я подозреваю, что мое отсутствие модификации vmaddr и vmsize значения в структурах сегмент_команда_64 (или любые другие значения сопоставления адресов) могут вызывать проблемы с доступом к памяти при попытке выполнить программу.

У меня такой вопрос; при обновлении двоичных файлов OSX чего еще мне не хватало бы в отношении изменений смещения? Прямо сейчас я изменяю только значения прямого смещения двоичного файла, а не его виртуальную адресацию. До сих пор я пытался изменить vmsize сегмента __TEXT, чтобы компенсировать расширение размера раздела __text, но при попытке его запустить мой измененный двоичный файл «убил: 9».

I не знаю, достаточно ли информации для решения этой проблемы; может быть, это простое решение, которое может понять кто-то с большим опытом и навыками /

Вот ссылка на исходный код https://github.com/AlysonBee/OSX_Packer

Цените любую помощь, которую кто-либо может оказать. :)

...