Как сделать дизассемблирование программы

Дизассемблирование — это формирование из исполняемого кода программы кода на языке ассемблера.

Введение

Дизассемблером является транслятор, который преобразует машинный код, объектный файл или библиотечные модули в текстовый формат программы на языке ассемблера. То есть, дизассемблированием считается операция, которая является обратной ассемблированию, а именно, это восстановление текста программы на языке ассемблера из исполняемой программы в машинных кодах.

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

Основы #HEX для хакеров

Дизассемблирование

По используемому режиму работы дизассемблеры подразделяются на следующие типы:

  1. Дизассемблеры автоматического типа.
  2. Дизассемблеры интерактивного типа.

В качестве хорошего примера автоматического дизассемблера можно привести программу Sourcer. Подобные дизассемблеры способны генерировать готовый текст программы, который далее может быть откорректирован при помощи какого-либо текстового редактора.

Примером интерактивного дизассемблера может служить программа IDA, которая позволяет менять правила дизассемблирования и считается достаточно удобным инструментальным набором, предназначенным для исследования программ.

Главной проблемой при работе дизассемблера является реализация способности отличать данные от машинных кодов. По этой причине при первых проходах автоматически или интерактивно выполняется сбор информация о границах процедур и функций, а уже на последнем проходе создается результирующий листинг. Интерактивность предоставляет возможность улучшения этого процесса, поскольку, анализируя дамп дизассемблируемого участка памяти, программист может тут же реализовать выделение строковых констант, присвоить необходимые имена известным точкам входа, оставить комментарии на уже изученные им участки программы.

«Дизассемблирование»
Готовые курсовые работы и рефераты
Решение учебных вопросов в 2 клика
Помощь в написании учебной работы

По количеству просмотров объектного кода дизассемблеры подразделяются на следующие типы:

  1. Однопроходные дизассемблеры.
  2. Двухпроходные дизассемблеры.
  3. Многопроходные дизассемблеры.

Однопроходные, которые также называют «дизассемблерами без меток», применяются главным образом в отладчиках и программных мониторах и проектируются, когда нужно оперативно получить псевдо-ассемблерный текст. Второе название призвано отобразить их главную особенность, а именно, тот факт, что в псевдо-ассемблерном листинге нет меток в командах переходов и вызовов подпрограмм, а указаны их абсолютные шестнадцатеричные адреса. По этой причине после ассемблирования такого восстановленного текста пользователь может получить в общем случае абсолютную программу. За один проход при незначительных размерах оперативной памяти (ОЗУ) нельзя собрать всю информацию о метках, поскольку нет «ссылок назад».

Читайте также:
Лучшие программы для распаковки файлов zip

Основы дизассемблирования

Метки, формируемые дизассемблерами, как правило, представлены в виде Lxxxx, где L является первой буквой английского слова Label (метка), a xxxx является адресом перехода или подпрограммы. Метки данных обладают той же структурой, но начинаются с буквы D, то есть, данные. Подобный вид меток считается наиболее удобным при анализе псевдо-листинга. У пользователя имеется возможность замены при помощи редактора текстов этих меток на более информативные.

Самыми распространенными являются двухпроходные дизассемблеры, позволяющие получать метки в листинге дизассемблирования, но, которые не могут решить полностью проблемы разделения команд и данных. После них пользователь должен в ручном режиме подправить сомнительные места.

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

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

После установки пользователем необходимых опций и выбора команды Gо, SOURCER выполняет загрузку программы в память и определение размеров сегментов. При первом проходе должно определяться большинство ссылок на подпрограммы и участки данных. Затем SOURCER предполагает, что участки кода и данных являются кодом, пока не будет найдено подтверждение обратного. При начале каждого последующего прохода SOURCER осуществляет анализ ссылок на код и данные для более точного определения участков кода и данных. На последнем проходе должны быть определены требуемые директивы ассемблера, форматы всех строк и комментарии.

Наличие внутреннего имитатора позволяет следить за изменениями содержимого всех регистров и поддерживать отдельный стек для программы. Имитатор также должен следить за тем, чтобы в случае применения нескольких сегментов данных был использован верный сегмент.

В задачи имитатора входит отслеживание комментариев, обращений к портам ввода-вывода и разрешение индексных вызовов и переходов. Имитатор способен повторять действия программы. Не имитируются большинство инструкций, корректирующих содержимое памяти, однако поддерживаются инструкции, которые считывают данные из памяти. Специализированная поддержка для регистра CS способна обеспечить полную имитацию работы с RОМ и RAM.

Источник: spravochnick.ru

6.2. Дизассемблирование программ с помощью интерактивного дизассемблера Ida Pro

Интерактивный дизассемблер IDA PRO, как и всякий дизассемблер предназначен для дизассемблирования кода программы в мнемонические инструкции на языке ассемблера. Рабочее окно IDA представлено на рис. 6.2.

Большим удобством Ida Pro является то, что он «сворачивает» стандартные библиотечные функции, что во многом упрощает навигацию по файлу, позволяя втиснуть больше информации в тесное пространство экрана. «Развернуть» функцию можно, подведя к ней курсор и нажав “+”, или для сворачивания “-”.

Читайте также:
K lite codec pack похожие программы

Кроме этого, IDA способна находить перекрестные ссылки, вызываемые из кода. На основе сигнатурного анализа, IDA умеет распознавать различные библиотечные операторы., например, “ostream::operator

Дизассемблер IDA изначально проектировался как интерактивная среда, предназначенная для совместной работы с человеком. Преимуществом интерактивных дизассемблеров является то, что дизассемблеры, пытающиеся выполнить весь процесс автоматически, легко сбить каким-либо хитрым приемом. Человека же сбить не так легко.

Рис. 6.2. Рабочий интерфейс дизассемблера Ida Pro

В IDA реализован удобный С-подобный внутренний язык написания скриптов, позволяющий реализовать многие полезные действия (например, осуществить дешифровку зашифрованного участка кода).

Ida Pro поддерживает инструкции для различного вида процессоров. Среди них – все версии процессоров INTEL, Motorola, Z80.

Пример использования дизассемблера IDA Pro приведен ниже.

Пусть у нас имеется следующий COM файл размером 292 байт. Код данного файла представлен на рис. 6.3.

Рис. 6.3. Код исследуемого файла

З агрузим данный файл в дизассемблер IDA, после чего получим следующую распечатку (рис 6.4).

В идим, что дизассемблирование произведено не совсем до конца. IDA дизассемблировала только первые две команды. Дело в том, что для того, чтобы правильно распознать остальную часть кода, потребовался бы нетривиальный интеллектуальный алгоритм. За неимением последнего, IDA прекратился процесс, ожидая дальнейших команд от пользователя.

Многие дизассемблеры пытаются дизассемблировать дальше, и, как правило, неверно. Попытаемся указать для IDA, что делать дальше.

Если приглядеться к первым двум командам, то можно увидеть, что инструкция JMP в строке 103h вызывает переход по адресу 106h. Для того, чтобы объяснить это IDA, необходимо добавить новую перекрестную ссылку. Это можно сделать так.

В меню “View” выбрать пункт “Cross references” и нажать INSERT.

Рис. 6.4. Текст файла после первоначального дизассемблирования

поле “From” указать адрес, с которого происходит прыжок (в нашем случае seg000:0103).

В поле “To” указать адрес, куда происходит прыжок (в нашем случае seg000:0106).

Этого же самого эффекта можно добиться более быстрым путем – подвести указатель к адресу 106h и нажать клавишу “C”. Тем самым мы укажем, что с данного адреса идет участок кода. Однако недостаток этого варианта состоит в том, что непонятно, с какого места этот участок кода будет получать управление.

Комментарии в дизассемблированном коде имеют очень большое значение, особенно в больших проектах. Например, в нашем случае, в строке 103h можно поставить комментарий, говорящий о том, что при выполнении инструкции JMP SI, значение регистра SI=106h. Для осуществления этого, подведем курсор к строке 103h, нажмем клавишу “:” и введем текст комментария “SI=106h”.

С адреса 106h идет следующий участок кода.

Читайте также:
Программы по их юридическому статусу можно разделить на три группы

Загрузка в si смещения 114h

Источник: studfile.net

Просмотр кода дизассемблирования в отладчике Visual Studio (C#, C++, Visual Basic, F#)

Область применения:yesVisual StudionoVisual Studio для Mac noVisual Studio Code

В окне Дизассемблированный код отображается код сборки, соответствующий инструкциям, созданным компилятором. При отладке управляемого кода эти инструкции ассемблера соответствуют присущему данному объекту коду, созданному компилятором JIT, а не промежуточному языку (MSIL), созданному компилятором Visual Studio.

Чтобы воспользоваться всеми возможностями окна Дизассемблированный код, изучите основы программирования на языке ассемблера.

Эта возможность доступна, только если включена отладка на уровне адреса. Она недоступна для отладки скриптов и SQL.

В дополнение к инструкциям ассемблера в окне Дизассемблированный код могут отображаться следующие сведения:

  • Адреса в памяти, где располагается каждая из инструкций. Для собственных приложений это фактические адреса в памяти. Для кода на Visual Basic или C# это смещение относительно начала функции.
  • Исходный код, из которого получается код сборки.
  • Байты кода, то есть байтовое представление реальных инструкций компьютера или языка MSIL.
  • Символьные имена для адресов памяти.
  • Номера строк, соответствующие исходному коду.

Инструкции на языке ассемблера состоят из мнемоник, представляющих собой сокращения имен инструкций, и символов, которые обозначают переменные, регистры и константы. Каждую инструкцию машинного кода представляет одна мнемоника ассемблера, за которой следует один или несколько необязательных символов.

Код на ассемблере активно использует регистры процессора, а при использовании управляемого кода — регистры среды выполнения. Вы можете использовать окно Дизассемблированный код в сочетании с окном Регистры, которое позволяет изучить содержимое регистров.

Чтобы просмотреть инструкции машинного кода в необработанной числовой форме, а не на языке ассемблера, используйте окно Память или выберите Байты кода в контекстном меню в окне Дизассемблированный код.

Использование окна дизассемблирования

Чтобы включить окно Дизассемблированный код, выберите в разделе Сервис>Параметры>Отладка параметр Включить отладку на уровне адреса.

Чтобы открыть окно Дизассемблированный код во время отладки, выберите Windows>Дизассемблированный код или нажмите сочетание клавиш ALT+8.

Отображаемые диалоговые окна и команды меню могут отличаться от описанных в справке в зависимости от текущих параметров или выпуска. Чтобы изменить параметры, выберите в меню Сервис пункт Импорт и экспорт параметров . Дополнительные сведения см. в разделе Сброс параметров.

Чтобы включить или отключить вывод дополнительных сведений, щелкните правой кнопкой в окне Дизассемблированный код и установите или снимите в контекстном меню соответствующие флажки.

Желтая стрелка, расположенная в левом поле, отмечает текущую точку выполнения. Для собственного кода точка выполнения соответствует счетчику команд ЦП. В этом расположении отображается следующая инструкция, которая будет выполнена в программе.

См. также

  • Перемещение вверх или вниз в области памяти
  • Просмотр данных в отладчике
  • Практическое руководство. Использование окна регистров

Источник: learn.microsoft.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru