Одной из важных вещей, которые дизассемблеры (или их пользователи), как правило, не сохраняются, является кодировка команд. Некоторые инструкции могут быть закодированы несколькими различными способами, например:
mov rdx, -1
- это 48, BA, FF, FF, FF, FF, FF, FF, FF, FF (10 байт) или 48, C7, C2, FF , FF, FF, FF (7 байтов).
Если остальная часть программы каким-то образом функционально зависит от длины указанной выше инструкции, которая составляет ровно 10 (или 7) байтов или значений этих конкретных байтов, а ассемблер выбирает mov rdx, -1
иначе, чем в исходной программе , то после разборки + сборки вы получите другую программу, которая будет работать по-другому. Для инструкций с неоднозначной кодировкой ассемблер должен использовать не командную мнемонику (mov rdx, -1
), а ее точное кодирование при разборке исходной программы (например, 48, BA, FF, FF, FF, FF, FF, FF, FF, FF).
Могут быть другие вещи, которые могут быть выполнены ассемблером или компоновщиком (например, по-разному в выводе файла выравнивать код/данные, имена и порядок вещей (разделы/сегменты)), которые обычно не являются проблемой , но, опять же, если в исходной программе есть некоторые необычные зависимости от этих вещей, то вновь собранная программа будет работать по-другому.
http://stackoverflow.com/questions/4309771/disassembling-modification-and-then-reassembling-a-linux-executable – n0p
Спасибо, я пробовал искать SO для этого вопроса, прежде чем спрашивать, но я, должно быть, пропустил этот – matzahboy
@matzahboy, да, это происходит! потому что функция поиска SO не так сильна, чтобы эффективно решать связанные вопросы! Поэтому я использую поиск в Google и фильтрую результаты поиска Stackoverflow. –