Дизассемблер
![]() | Эта статья включает список литературы , связанную литературу или внешние ссылки , но ее источники остаются неясными, поскольку в ней отсутствуют встроенные цитаты . ( декабрь 2009 г. ) |
Дизассемблер , — это компьютерная программа которая переводит машинный язык в язык ассемблера — операция, обратная операции ассемблера . Дизассемблирование, выходные данные дизассемблера, часто форматируется для удобства чтения человеком, а не для удобства ввода в ассемблер, что делает его главным образом инструментом обратного проектирования . Обычное использование дизассемблеров включает анализ языков программирования высокого уровня выходных данных компиляторов и их оптимизацию, восстановление исходного кода программы, исходный код которой был утерян, анализ вредоносных программ , модификацию программного обеспечения (например, взлом ПЗУ ) и взлом программного обеспечения .
Дизассемблер отличается от декомпилятора , который ориентирован на язык высокого уровня, а не на ассемблер.
языка ассемблера Исходный код обычно допускает использование констант и комментариев программиста . Обычно они удаляются из собранного машинного кода ассемблером. Если это так, то дизассемблер, работающий с машинным кодом, выполнит дизассемблирование без этих констант и комментариев; дизассемблированный вывод становится труднее интерпретировать человеку, чем исходный аннотированный исходный код. Некоторые дизассемблеры предоставляют встроенную функцию комментирования кода, при которой сгенерированный вывод дополняется комментариями, касающимися вызываемых функций API или параметров вызываемых функций. Некоторые дизассемблеры используют символическую отладочную информацию, присутствующую в объектных файлах, таких как ELF . Например, IDA позволяет пользователю-человеку создавать мнемонические символы для значений или областей кода в интерактивном сеансе: человеческое понимание, применяемое к процессу дизассемблирования, часто соответствует человеческому творчеству в процессе написания кода.
Проблемы
[ редактировать ]Возможно написать дизассемблер, который создает код, который при сборке создает в точности исходный двоичный файл; однако часто существуют различия. Это предъявляет требования к выразительности ассемблера. Например, ассемблер x86 делает произвольный выбор между двумя двоичными кодами для чего-то простого, например MOV AX,BX
. Если исходный код использует другой вариант, исходный код просто невозможно воспроизвести в любой момент времени. Однако даже когда произведена полностью корректная дизассемблирование, остаются проблемы, если программа требует модификации. Например, одна и та же инструкция перехода на машинном языке может быть сгенерирована ассемблерным кодом для перехода к указанному местоположению (например, для выполнения определенного кода) или для перехода на указанное количество байтов (например, для пропуска нежелательной ветки). . Дизассемблер не может знать, что задумано, и может использовать любой синтаксис для создания дизассемблирования, воспроизводящего исходный двоичный файл. Однако, если программист хочет добавить инструкции между инструкцией перехода и ее пунктом назначения, необходимо понять работу программы, чтобы определить, должен ли переход быть абсолютным или относительным, т. е. должен ли ее пункт назначения оставаться в фиксированном месте или быть изменен. перемещено так, чтобы пропустить как исходную, так и добавленную инструкцию.
Другая проблема заключается в том, что не всегда возможно определить, какие части двоичного файла соответствуют исполняемому коду, а какие — данным. В то время как распространенные форматы исполняемых файлов, такие как ELF и PE, делят двоичный файл на разделы исполняемого файла и данных, другие форматы, такие как плоские двоичные файлы, этого не делают, поэтому любое заданное место в двоичном файле может содержать либо исполняемые инструкции, либо неисполняемые данные, что затрудняет принятие решения о том, являются ли его следует разобрать как инструкции или оставить как данные. Поскольку процессоры обычно допускают динамические переходы, вычисляемые во время выполнения, не всегда возможно определить все возможные места в двоичном файле, к которым можно перейти и, следовательно, содержать инструкции.
В компьютерных архитектурах с инструкциями переменной ширины , например, во многих компьютерных архитектурах со сложным набором команд (CISC) , может быть допустимо более одной дизассемблирования.
Дизассемблеры не обрабатывают код, который изменяется во время выполнения.
Шифрование может использоваться в некоторых компьютерных программах, особенно как часть управления цифровыми правами, чтобы предотвратить обратное проектирование и взлом . Это создает дополнительную проблему при дизассемблировании, поскольку перед дизассемблированием код необходимо расшифровать.
Примеры дизассемблеров
[ редактировать ]Дизассемблер может быть автономным или интерактивным. Автономный дизассемблер при запуске генерирует файл языка ассемблера, который можно изучить; интерактивный показывает эффект любого изменения, внесенного пользователем немедленно. Например, дизассемблер изначально может не знать, что часть программы на самом деле является кодом, и обрабатывать его как данные; если пользователь указывает, что это код, результирующий дизассемблированный код отображается немедленно, позволяя пользователю изучить его и предпринять дальнейшие действия во время того же запуска.
Любой интерактивный отладчик имеет возможность просмотра дизассемблирования отлаживаемой программы. Часто один и тот же инструмент дизассемблирования поставляется в виде отдельного дизассемблера, распространяемого вместе с отладчиком. Например, objdump , часть GNU Binutils , связана с интерактивным отладчиком gdb . [1]
- Бинарный ниндзя [2]
- ОТЛАЖИВАТЬ [3]
- Интерактивный дизассемблер (IDA)
- Гид
- Хью
- Дизассемблер бункера [1]
- Дизассемблер PE Explorer [4]
- Netwide Disassembler (Ndisasm), дополнение к Netwide Assembler (NASM).
- OLIVER ( интерактивное тестирование/отладка CICS ) включает дизассемблеры для ассемблера, COBOL и PL/1.
- OllyDbg — 32-битный отладчик анализа ассемблерного уровня.
- Радар2
- Причина [5] и резак [6] (графический интерфейс для Ризина)
- SIMON (пакетное интерактивное тестирование/отладка) включает дизассемблеры для ассемблера, COBOL и PL/1.
- Sourcer — комментирующий 16-битный/32-битный дизассемблер для DOS , OS/2 и Windows , созданный V Communications в 1990-х годах. [7]
Дизассемблеры и эмуляторы
[ редактировать ]Динамический дизассемблер может быть встроен в выходные данные эмулятора или гипервизора , чтобы «отслеживать» построчно выполнение в реальном времени любых выполняемых машинных инструкций. В этом случае, а также строки, содержащие дизассемблированный машинный код, могут быть показаны регистры и/или изменения данных (или любые другие изменения « состояния », такие как коды условий), которые вызывает каждая отдельная инструкция. рядом или под дизассемблированной инструкцией. Это предоставляет чрезвычайно мощную отладочную информацию для окончательного решения проблем, хотя размер результирующего вывода иногда может быть довольно большим, особенно если он активен для выполнения всей программы. OLIVER предоставил эти функции с начала 1970-х годов как часть своего продукта для отладки CICS , а теперь их можно найти включенными в продукт XPEDITER от Compuware .
Дизассемблер длины
[ редактировать ]Дизассемблер длины , также известный как механизм дизассемблера длины ( LDE ), представляет собой инструмент, который, учитывая последовательность байтов (инструкций), выводит количество байтов, занятых проанализированной инструкцией. Известные проекты с открытым исходным кодом для архитектуры x86 включают ldisasm, [8] Крошечный дизассемблер длины x86 [9] и механизм дизассемблера увеличенной длины для x86-64. [10]
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Перейти обратно: а б «Хоппер» . Архивировано из оригинала 8 января 2022 г. Проверено 25 января 2022 г.
- ^ «Бинарный ниндзя» . Архивировано из оригинала 24 января 2022 г. Проверено 25 января 2022 г.
- ^ Пол, Матиас Р. (30 июля 1997 г.). «Kapitel II.5. Allgemeines: Undokumentierte Möglichkeiten von DEBUG» [Недокументированные возможности DEBUG]. NWDOS-TIPs — советы и подсказки для Novell DOS 7, с просмотром недокументированных подробностей, ошибок и обходных путей . MPDOSTIP (на немецком языке) (3-е изд.). Архивировано из оригинала 10 сентября 2017 г. Проверено 6 сентября 2014 г. (Примечание. NWDOSTIP.TXT — это всеобъемлющая работа по Novell DOS 7 и OpenDOS 7.01 , включая описание многих недокументированных функций и внутренних устройств. Это часть еще более обширной авторской коллекции MPDOSTIP.ZIP, которая поддерживалась до 2001 года и распространялась на многих сайтах по адресу: время. Предоставленная ссылка указывает на более старую версию файла NWDOSTIP.TXT, преобразованную в HTML.)
- ^ «Дизассемблер Windows PEExplorer для 32-разрядной программы Win EXE DLL OCX, инструмент двоичного анализа кода» . Проверено 25 апреля 2022 г.
- ^ «Ризин» . Архивировано из оригинала 28 ноября 2023 г. Проверено 9 декабря 2023 г.
- ^ «Куттер» . Архивировано из оригинала 28 ноября 2023 г. Проверено 9 декабря 2023 г.
- ^ Sourcer - комментирующий дизассемблер (изд. сентября 1989 г.). V Communications, Inc. , 1988 г. Номер детали S0989-164 . Проверено 21 декабря 2019 г.
- ^ «лдисазм» . Гитхаб . Архивировано из оригинала 28 октября 2020 г. Проверено 26 февраля 2020 г.
- ^ «Крошечный дизассемблер длины x86» . Гитхаб . Архивировано из оригинала 31 октября 2020 г. Проверено 10 декабря 2019 г.
- ^ «Дисассемблер увеличенной длины для x86-64» . Гитхаб . Архивировано из оригинала 08.10.2020 . Проверено 10 декабря 2019 г.
Дальнейшее чтение
[ редактировать ]- Винчигерра, Лори; М. Уиллс, Линда; Кеджривал, Нидхи; Мартино, Пол; Винчигерра, Ральф Л. (2003). «Экспериментальная среда для оценки инструментов дизассемблирования и декомпиляции C++ и Java». 10-я рабочая конференция по обратному проектированию, 2003 г. WCRE 2003. Материалы . стр. 14–23. дои : 10.1109/WCRE.2003.1287233 . ISBN 0-7695-2027-8 . S2CID 10398240 .
- Шварц, Бенджамин; Дебре, Саумья; Эндрюс, Грегори (2002). «Еще раз о дизассемблере исполняемого кода». Материалы 9-й рабочей конференции по обратному проектированию (WCRE) . Департамент компьютерных наук Университета Аризоны : 45–54. CiteSeerX 10.1.1.85.6387 .
Внешние ссылки
[ редактировать ]
- Список дизассемблеров x86 в Wikibooks
- Трансформация Wiki на разборке
- Boomerang Общий перенастраиваемый декомпилятор программ с машинным кодом с открытым исходным кодом.
- Дизассемблеры в Curlie
- Онлайн-дизассемблер. Архивировано 26 апреля 2012 г. на Wayback Machine , бесплатном онлайн-дизассемблере оружия, mips, ppc и кода x86.