Этот вопрос в основном касается моего опыта работы с Hopper — дизассемблером OS X и Linux, хотя концептуально я думаю, что он также применяются к другим дизассемблерам, таким как IDA. Инструменты позволяют увидеть представление ассемблерного кода (шестнадцатеричного) кода, который находится в двоичном файле:
Это также позволяет изменить инструкции по сборке, например, заменить команду je
командой jne
. У них также есть hex view
, так что легко увидеть, какие изменения происходят на самом деле, но, насколько я могу судить, это в основном просто хороший интерфейс для шестнадцатеричного редактирования, то есть я говорю ему изменить JE
на JNE
и 74
становится 75
.
Однако у Хоппера есть опция «Создать новый исполняемый файл»:
И в диалоговом окне редактора сборки написано «Собери и иди дальше»:
Я думаю, что ответ на этот вопрос "Нет" - но я так понимаю - нет способа добавить код в собранный/скомпилированный двоичный файл, верно? Остальные команды, сохраненные в скомпилированной программе, ссылаются на смещения файлов в другие разделы, поэтому было бы невозможно добавить дополнительные команды в процедуру, потому что они испортили бы смещение для команд, которые приходят потом - вызывая код, который приходит раньше в jmp
не туда и всякие нехорошие вещи типа правильно - верно? Редактирование существующих команд, NOOP
s, изменение строк, все что угодно без изменения «отпечатка» программы — это нормально, но не добавление кода — правильно? Кажется, что единственный способ добавить код - в самый конец файла, но даже тогда я несколько сомневаюсь, что это сработает.
Правильно ли я понимаю возможности дизассемблеров в том, что: они могут показывать код и даже давать представления функций, используемых для их создания (иногда), но на самом деле они не являются компиляторами как таковыми? Или они достаточно хороши, чтобы не отставать от всех смещений/ссылок и фактически переписывать их и действительно создавать новый исполняемый файл с дополнительным кодом и строками, введенными прямо посередине?
ps: заранее извиняюсь, если то, что я прошу, звучит злонамеренно (я так не думаю), моя цель не пиратское программное обеспечение, а просто понимание того, как программы пишутся, компилируются и интерпретируются. Я хотел бы в конечном итоге иметь возможность писать программы непосредственно на ассемблере для чипов ATMega, и как новичок в ассемблере просмотр существующих программ был намного интереснее, чем чтение руководств в Интернете (хотя я делаю и то, и другое).