Дизассемблирование
Дизассемблирование — это формирование из исполняемого кода программы кода на языке ассемблера.
Введение
Дизассемблером является транслятор, который преобразует машинный код, объектный файл или библиотечные модули в текстовый формат программы на языке ассемблера. То есть, дизассемблированием считается операция, которая является обратной ассемблированию, а именно, это восстановление текста программы на языке ассемблера из исполняемой программы в машинных кодах.
Необходимо отметить, что, если выполнить повторное ассемблирование восстановленного текста, то нельзя гарантировать получение того же самого кода. А это означает, что есть вероятность того, что восстановленная таким образом программа может оказаться неработоспособной. Также следует подчеркнуть, что любые попытки модификации дизассемблированного текста способны привести к развалу программы. Проблема состоит в том, что ассемблер выполняет замену всех меток на константы, поэтому при осуществлении изменений в программе, следует откорректировать все ссылки на метки.
Дизассемблирование
По используемому режиму работы дизассемблеры подразделяются на следующие типы:
- Дизассемблеры автоматического типа.
- Дизассемблеры интерактивного типа.
В качестве хорошего примера автоматического дизассемблера можно привести программу Sourcer. Подобные дизассемблеры способны генерировать готовый текст программы, который далее может быть откорректирован при помощи какого-либо текстового редактора.
Примером интерактивного дизассемблера может служить программа IDA, которая позволяет менять правила дизассемблирования и считается достаточно удобным инструментальным набором, предназначенным для исследования программ.
Главной проблемой при работе дизассемблера является реализация способности отличать данные от машинных кодов. По этой причине при первых проходах автоматически или интерактивно выполняется сбор информация о границах процедур и функций, а уже на последнем проходе создается результирующий листинг. Интерактивность предоставляет возможность улучшения этого процесса, поскольку, анализируя дамп дизассемблируемого участка памяти, программист может тут же реализовать выделение строковых констант, присвоить необходимые имена известным точкам входа, оставить комментарии на уже изученные им участки программы.
«Дизассемблирование»
Готовые курсовые работы и рефераты
Решение учебных вопросов в 2 клика
Помощь в написании учебной работы
По количеству просмотров объектного кода дизассемблеры подразделяются на следующие типы:
- Однопроходные дизассемблеры.
- Двухпроходные дизассемблеры.
- Многопроходные дизассемблеры.
Однопроходные, которые также называют «дизассемблерами без меток», применяются главным образом в отладчиках и программных мониторах и проектируются, когда нужно оперативно получить псевдо-ассемблерный текст. Второе название призвано отобразить их главную особенность, а именно, тот факт, что в псевдо-ассемблерном листинге нет меток в командах переходов и вызовов подпрограмм, а указаны их абсолютные шестнадцатеричные адреса. По этой причине после ассемблирования такого восстановленного текста пользователь может получить в общем случае абсолютную программу. За один проход при незначительных размерах оперативной памяти (ОЗУ) нельзя собрать всю информацию о метках, поскольку нет «ссылок назад».
Метки, формируемые дизассемблерами, как правило, представлены в виде Lxxxx, где L является первой буквой английского слова Label (метка), a xxxx является адресом перехода или подпрограммы. Метки данных обладают той же структурой, но начинаются с буквы D, то есть, данные. Подобный вид меток считается наиболее удобным при анализе псевдо-листинга. У пользователя имеется возможность замены при помощи редактора текстов этих меток на более информативные.
Самыми распространенными являются двухпроходные дизассемблеры, позволяющие получать метки в листинге дизассемблирования, но, которые не могут решить полностью проблемы разделения команд и данных. После них пользователь должен в ручном режиме подправить сомнительные места.
Наиболее часто дизассемблер применяют для изучения программы (или ее фрагмента), исходный текст которой является неизвестным, с целью ее изменения, копирования или взлома. Реже дизассемблер используется для обнаружения ошибок в программах и компиляторах, а также для исследования и оптимизации формируемого компилятором машинного кода.
При работе с исполняемым кодом или байт-кодом, сформированным на отдельных языках высокого уровня, таких как, к примеру, java, присутствует возможность восстановления не только текста на языке ассемблера, но даже и структуры классов программы, а если при компиляции исполняемого файла не отключалась информация, связанная с отладкой, то и исходный текст программы.
После установки пользователем необходимых опций и выбора команды Gо, SOURCER выполняет загрузку программы в память и определение размеров сегментов. При первом проходе должно определяться большинство ссылок на подпрограммы и участки данных. Затем SOURCER предполагает, что участки кода и данных являются кодом, пока не будет найдено подтверждение обратного. При начале каждого последующего прохода SOURCER осуществляет анализ ссылок на код и данные для более точного определения участков кода и данных. На последнем проходе должны быть определены требуемые директивы ассемблера, форматы всех строк и комментарии.
Наличие внутреннего имитатора позволяет следить за изменениями содержимого всех регистров и поддерживать отдельный стек для программы. Имитатор также должен следить за тем, чтобы в случае применения нескольких сегментов данных был использован верный сегмент. В задачи имитатора входит отслеживание комментариев, обращений к портам ввода-вывода и разрешение индексных вызовов и переходов. Имитатор способен повторять действия программы. Не имитируются большинство инструкций, корректирующих содержимое памяти, однако поддерживаются инструкции, которые считывают данные из памяти. Специализированная поддержка для регистра CS способна обеспечить полную имитацию работы с RОМ и RAM.
Дизассемблирование программы что это
Дизассемблеры и декомпиляторы исполняемых файлов
В комментариях к статьям меня часто спрашивают где взять тот или иной инструмент, используемый в исследовании. По возможности я всегда указываю ссылки, но теперь настало время самых мощных инструментов, а именно дизассемблеров и декомпиляторов исполняемых файлов. Сразу уточню терминологию. Дизассемблирование — преобразование программы из двоичного кода к ее ассемблерному представлению. Декомпиляция — процесс воссоздания исходного кода программы.
Скриншот программы dnSpy
Начнем с популярного нынче дотнета. Не будет преувеличением сказать, что самый мощный на сегодняшний день инструмент для потрошения приложений на .NET — это бесплатный проект dnSpy. Он включает в себя декомпилятор C# и Visual Basic .NET, отладчик, редактор сборки с подсветкой синтаксиса, HEX-редактор и еще множество инструментов. Русский язык в наличии. Самую свежую версию можно всегда скачать с офсайта.
Скриншот программы IDA Pro Advanced
IDA Pro (сокращение от Interactive DisAssembler) — один из моих основных инструментов для реверс-инжиниринга и разбора файлов. Это интерактивный дизассемблер и отладчик с поддержкой множества форматов исполняемых файлов для большого числа процессоров и операционных систем. Чтобы перечислить все его возможности потребуется целая книга. Но даже тут возможности IDA не заканчиваются. Плагин Hex-Rays для IDA Pro позволяет декомплировать ассемблерный листинг в более-менее человекопонятный псевдокод, по синтаксису похожий на C. В некоторых случаях это значительно облегчает работу. Просто так приобрести IDA Pro частным лицам практически невозможно, и дело не только в непомерной цене, а в том, что автор придерживается абсолютно неадекватной политики в плане продаж. К счастью, несколько последних версий этого замечательного дизассемблера, несмотря на все трудности, были успешно слиты в свободный доступ. Это IDA Pro Advanced 6.8, последняя доступная версия, которая работает с 32-битными системами, а также IDA Pro Advanced 7.0 и IDA Pro Advanced 7.2 для 64-битных систем. Если по каким-то причинам вы не можете использовать варез, то на офсайте есть бесплатные демо-версии с урезанным функционалом.
Скриншот программы Relyze
Relyze — бесплатный интерактивный дизассемблер для исполняемых файлов в формате x86, x64, ARM32 и ARM64. Поддерживает многие фичи, присущие IDA, такие как декомпиляция двоичного кода в C-подобный псевдокод или построение графов. Кроме этого имеет и уникальные для дизассемблера функции, такие как сравнение двух файлов, поддержка плагинов на Ruby. Лично для меня особой ценностью является Data Type Manager, который показывает структуры и интерфейсы, использованные в исследуемой программе, и не просто как факт их наличия, а с описанием их полей, параметров вызова, смещениями в структуре и размером каждого поля. Скачать дистрибутив нужной разрядности можно с офсайта.
Скриншот программы Interactive Delphi Reconstructor
IDR (Interactive Delphi Reconstructor) — бесплатный декомпилятор исполняемых файлов и динамических библиотек. В отличие от IDA Pro, этот декомпилятор создан специально для разбора файлов, написанных на языке Delphi. Сейчас проект прекратил развитие, если какие изменения и вносятся, то исключительно косметические. Исходники для доработки открыты. Лично я пользуюсь стабильным комплектом Interactive Delphi Reconstructor 2.6.0.1.
Скриншот программы VB Decompiler Pro
Еще один специализированный декомпилятор — VB Decompiler Pro. Он работает с программами (EXE, DLL, OCX), написанными на Visual Basic. В случае, если приложение собрано в p-code, декомпилятор может разобрать его практически до исходного кода. Но даже если приложение скомпилировано в native code, в этом случае VB Decompiler анализирует и восстанавливает довольно много инструкций, чтобы насколько это возможно приблизить ассемблерный код к исходному. Это сильно упростит задачу анализа алгоритмов исследуемой программы. Честные граждане могут воспользоваться бесплатной Lite-версией с офсайта, для любителей полных версий софта есть релиз VB Decompiler Pro 10.0. Антивирусы могут ругаться на активатор, но тут вы уже сами решайте что делать.
Конечно, это далеко не полный список инструментов для дизассемблирования и декомпиляции, который есть в свободном доступе. Например, та же набирающая популярность Ghidra от АНБ может составить конкуренцию IDA Pro с Hex-Rays. Но я в этой статье перечислил лишь те программы, которыми пользуюсь сам и которые упоминаются в статьях на этом сайте.
При подготовке материала использовались источники:
https://spravochnick.ru/informatika/dizassemblirovanie/
https://www.manhunter.ru/underground/1392_dizassembleri_i_dekompilyatori_ispolnyaemih_faylov.html