2011-12-14 2 views
3

Возможный дубликат:
Disassembling, modifying and then reassembling a Linux executableПопытка собрать выход в дизассемблер (например, objdump)

Мне сказали, что сборка и dissassembly не являются обратными. По-видимому, вы не можете разобрать программу, поместить ее непосредственно в ассемблер и ожидать, что она будет работать правильно, поскольку информация будет потеряна.

Мой вопрос в том, почему информация потеряна? Кроме того, какая информация теряется?

+2

http://stackoverflow.com/questions/4309771/disassembling-modification-and-then-reassembling-a-linux-executable – n0p

+0

Спасибо, я пробовал искать SO для этого вопроса, прежде чем спрашивать, но я, должно быть, пропустил этот – matzahboy

+0

@matzahboy, да, это происходит! потому что функция поиска SO не так сильна, чтобы эффективно решать связанные вопросы! Поэтому я использую поиск в Google и фильтрую результаты поиска Stackoverflow. –

ответ

7

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

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).

Могут быть другие вещи, которые могут быть выполнены ассемблером или компоновщиком (например, по-разному в выводе файла выравнивать код/​​данные, имена и порядок вещей (разделы/сегменты)), которые обычно не являются проблемой , но, опять же, если в исходной программе есть некоторые необычные зависимости от этих вещей, то вновь собранная программа будет работать по-другому.

+0

+1 Я видел первый аргумент до этого, но без объяснения того, что размер инструкции изменяется. Теперь это имеет смысл. – Praxeolitic

3

Это не потеря, это на самом деле выигрыш. похоже, вы еще не пробовали это, почему бы не попробовать?

.global reset 
reset: 

    mov #0x0280,r1 
    call #notmain 
    jmp hang 

.global hang 
hang: 
    jmp hang 

, которые вы можете собрать как выглядит это с objdump:

0000f800 <reset>: 
    f800: 31 40 80 02  mov #640, r1 ;#0x0280 
    f804: b0 12 b2 f8  call #0xf8b2 
    f808: 00 3c   jmp $+2   ;abs 0xf80a 

0000f80a <hang>: 
    f80a: ff 3f   jmp $+0   ;abs 0xf80a 

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

Нет причин, по которым у вас не может быть дизассемблера, который генерирует выходные данные, которые могут быть собраны повторно, я делал это много раз и видел его много раз. Дело в том, что с дизассемблером следует использовать дополнительную информацию. Вариант использования для дизассемблера , который может быть повторно собран, предназначен для того, чтобы взломать код someones или что-то в этом роде.

Я настоятельно рекомендую людям писать дизассемблеры в любом случае, и это было бы хорошей причиной для вашего образования как в изучении набора команд, так и в том, как оно кодируется, если набор инструкций с переменной длиной инструкции (x86) есть намного больше, чтобы учиться (я рекомендую НЕ изучать одну из первых, идти рукой или большим пальцем или что-то в этом роде, или, по крайней мере, что-то не так больно, как x86, например, msp430). Хорошим способом протестировать ваш дизассемблер является вывод кода, который можно повторно собрать. собирать, разбирать, собирать, и если два выхода сборки совпадают, то ваш дизассемблер проделал хорошую работу.

Смежные вопросы