A дизассемблер - это компьютерная программа, которая переводит машинный язык в язык ассемблера - операция, обратная операции ассемблер. Дизассемблер отличается от декомпилятора, который нацелен на язык высокого уровня, а не на язык ассемблера. Дизассемблирование, вывод дизассемблера, часто форматируется для удобства чтения человеком, а не для ввода ассемблера, что делает его главным образом инструментом обратного проектирования.
Язык ассемблера исходный код обычно разрешает использование констант и комментариев программиста . Обычно они удаляются ассемблером из собранного машинного кода . Если так, дизассемблер, работающий с машинным кодом, произведет дизассемблирование без этих констант и комментариев; Дизассемблированный вывод становится труднее интерпретировать человеку, чем исходный аннотированный исходный код. Некоторые дизассемблеры предоставляют встроенную функцию комментирования кода, при которой сгенерированный вывод обогащается комментариями, касающимися вызываемых функций API или параметров вызываемых функций. Некоторые дизассемблеры используют информацию символической отладки , присутствующую в объектных файлах, таких как ELF. Например, IDA позволяет человеку-пользователю составлять мнемонические символы для значений или областей кода в интерактивном сеансе: человеческое понимание, применяемое к процессу дизассемблирования, часто соответствует человеческому творчеству в процессе написания кода.
На платформах CISC с инструкциями переменной ширины может быть допустимо более одного дизассемблирования. Дизассемблеры не обрабатывают код, который изменяется во время выполнения.
Возможно написание дизассемблера, производящего код, который при сборке дает в точности исходный двоичный файл; однако часто бывают различия. Это предъявляет требования к выразительности ассемблера. Например, ассемблер x86 принимает произвольный выбор между двумя двоичными кодами для чего-то столь же простого, как MOV AX, BX
. Если исходный код использует другой вариант, исходный код просто не может быть воспроизведен в любой момент времени. Однако даже при полностью правильной разборке проблемы остаются, если программа требует модификации. Например, та же самая инструкция перехода на машинном языке может быть сгенерирована ассемблерным кодом для перехода в указанное место (например, для выполнения определенного кода) или для перехода на указанное количество байтов (например, чтобы пропустить нежелательную ветвь). Дизассемблер не может знать, что предназначено, и может использовать любой синтаксис для создания дизассемблера, воспроизводящего исходный двоичный файл. Однако, если программист хочет добавить инструкции между инструкцией перехода и ее местом назначения, необходимо понимать работу программы, чтобы определить, должен ли переход быть абсолютным или относительным, то есть должно ли его место назначения оставаться в фиксированном месте или быть перемещен так, чтобы пропустить как исходную, так и добавленную инструкции.
Дизассемблер может быть автономным или интерактивным. Автономный дизассемблер при запуске генерирует файл на языке ассемблера, который можно исследовать; интерактивный показывает эффект любого изменения, которое пользователь делает немедленно. Например, дизассемблер может изначально не знать, что часть программы на самом деле является кодом, и рассматривать его как данные; если пользователь указывает, что это код, получившийся дизассемблированный код отображается немедленно, что позволяет пользователю изучить его и предпринять дальнейшие действия во время того же запуска.
Любой интерактивный отладчик будет включать некоторый способ просмотра дизассемблированной отлаживаемой программы. Часто один и тот же инструмент дизассемблирования будет упакован как автономный дизассемблер, распространяемый вместе с отладчиком. Например, objdump, часть GNU Binutils, относится к интерактивному отладчику gdb.
В вывод можно включить динамический дизассемблер эмулятора или гипервизора, чтобы «отслеживать» построчно выполнение любых выполняемых машинных инструкций в реальном времени. В этом случае, а также строки, содержащие дизассемблированный машинный код, регистр (ы) и / или изменение (я) данных (или любые другие изменения «состояние », такие как коды условий), каждая из которых причины отдельных инструкций могут быть показаны рядом с разобранной инструкцией или под ней. Это обеспечивает чрезвычайно мощную отладочную информацию для окончательного решения проблемы, хотя размер результирующего вывода иногда может быть довольно большим, особенно если он активен для выполнения всей программы. OLIVER предоставил эти функции с начала 1970-х годов как часть своего предложения отладочного продукта CICS, а теперь их можно найти в составе продукта XPEDITER от Compuware.
A дизассемблер длины, также известный как дизассемблер длины (LDE ), представляет собой инструмент, который по последовательности байтов (инструкций) выводит количество взятых байтов по разобранной инструкции. Известные проекты с открытым исходным кодом для архитектуры x86 включают ldisasm, Tiny x86 Length Disassembler и Extended Length Disassembler Engine для x86-64.
Найдите disassembler в Wiktionary, бесплатном словаре. |