Могу ли я добавить команды и данные на языке ассемблера в существующий двоичный файл?

Этот вопрос в основном касается моего опыта работы с Hopper — дизассемблером OS X и Linux, хотя концептуально я думаю, что он также применяются к другим дизассемблерам, таким как IDA. Инструменты позволяют увидеть представление ассемблерного кода (шестнадцатеричного) кода, который находится в двоичном файле:

представление кода сборки

Это также позволяет изменить инструкции по сборке, например, заменить команду je командой jne. У них также есть hex view, так что легко увидеть, какие изменения происходят на самом деле, но, насколько я могу судить, это в основном просто хороший интерфейс для шестнадцатеричного редактирования, то есть я говорю ему изменить JE на JNE и 74 становится 75.

Однако у Хоппера есть опция «Создать новый исполняемый файл»:

введите здесь описание изображения

И в диалоговом окне редактора сборки написано «Собери и иди дальше»:

введите здесь описание изображения

Я думаю, что ответ на этот вопрос "Нет" - но я так понимаю - нет способа добавить код в собранный/скомпилированный двоичный файл, верно? Остальные команды, сохраненные в скомпилированной программе, ссылаются на смещения файлов в другие разделы, поэтому было бы невозможно добавить дополнительные команды в процедуру, потому что они испортили бы смещение для команд, которые приходят потом - вызывая код, который приходит раньше в jmp не туда и всякие нехорошие вещи типа правильно - верно? Редактирование существующих команд, NOOPs, изменение строк, все что угодно без изменения «отпечатка» программы — это нормально, но не добавление кода — правильно? Кажется, что единственный способ добавить код - в самый конец файла, но даже тогда я несколько сомневаюсь, что это сработает.

Правильно ли я понимаю возможности дизассемблеров в том, что: они могут показывать код и даже давать представления функций, используемых для их создания (иногда), но на самом деле они не являются компиляторами как таковыми? Или они достаточно хороши, чтобы не отставать от всех смещений/ссылок и фактически переписывать их и действительно создавать новый исполняемый файл с дополнительным кодом и строками, введенными прямо посередине?

ps: заранее извиняюсь, если то, что я прошу, звучит злонамеренно (я так не думаю), моя цель не пиратское программное обеспечение, а просто понимание того, как программы пишутся, компилируются и интерпретируются. Я хотел бы в конечном итоге иметь возможность писать программы непосредственно на ассемблере для чипов ATMega, и как новичок в ассемблере просмотр существующих программ был намного интереснее, чем чтение руководств в Интернете (хотя я делаю и то, и другое).


person cwd    schedule 25.01.2015    source источник


Ответы (1)


Дизассемблер, такой как IDA, может создать исходный файл исполняемого файла. Однако, по моему опыту, это на самом деле не работает из коробки, поэтому вы не можете просто разобрать файл, а затем воспроизвести исполняемый файл, не выполняя много ручной работы. Для сложных программ также не гарантируется полный дизассемблирование, потому что дизассемблер может не распознать правильно все участки кода и данных. Поэтому, прежде чем вы сможете собрать вывод, вам нужно сделать много обратного проектирования, чтобы заставить его работать. Конечно, как только вы заработаете, вы можете добавлять код по своему усмотрению.

Поскольку IDA очень продвинутая, я не думаю, что Хоппер тоже может это сделать.

В зависимости от того, какие изменения вам нужны, может быть проще внедрить код в память с помощью отдельного приложения или заменить библиотеку своей собственной версией.

person Devolus    schedule 25.01.2015
comment
Спасибо - это логично! - person cwd; 25.01.2015