Дизассемблирование программы что это

Дизассемблирование программы что это

В этой главе мы рассмотрим отладочные и дизассемблирующие программы, кроме трех наиболее известных, о которых пойдет речь в последующих двух главах.

I

Утилиты фирмы Microsoft

Название программы многообещающе, но в действительности программу нельзя назвать редактором. Основное ее предназначение — конвертировать OMF-формат объектных файлов в COFF-формат. Кроме того, данная утилита позволяет менять некоторые другие атрибуты исполняемых и объектных модулей. Если в командной строке данной программы указать имя объектного модуля, то, в случае если модуль будет в OMF-формате, он будет преобразован в COFF-формат. Рассмотрим ключи данной программы, которые можно применять как к исполняемым, так и к объектным модулям.

/BIND — позволяет указать пути к динамическим библиотекам, которые используют данный исполняемый модуль. Например,
EDITBIN /BIND:PATH=c:edit;d:dll EDIT.EXE.

/HEAP — изменяет размер кучи в байтах. Например,

Знакомство с дизассемблером (ОЧЕНЬ СЛОЖНО)


EDITBIN /HEAP:100000,100000 (см. Опции программы LINK.EXE).

/LARGEADDRESSAWARE — указывает, что приложение оперирует адресами, большими 2 гигабайт.

/NOLOGO — подавляет вывод информации о программе.

/REBASE — устанавливает базовый адрес модуля. По умолчанию для исполняемого модуля базовый адрес равен 400000Н, для динамической библиотеки — 10000000H.

/RELEASE — устанавливает контрольную сумму в заголовке исполняемого модуля.

/SECTION — изменяет атрибуты секций исполняемого модуля. Полный формат опции /SECTION:name[=newname][,attributes][,alignment]
Значение атрибутов

АтрибутЗначение
c code
d discardable
е executable
i initialized data
k cached virtual memory
m link remove
o link info
p paged virtual memory
r read
s shared
u uninitialized data
w write

Значение опции выравнивания

1 1
2 2
4 4
8 8
p 16
t 32
s 64
x no alignment

/STACK — изменяет значение требуемого для загружаемого модуля стека.
Например: EDITBIN /STACK:10000,10000 EDIT.EXE

/SUBSYSTEM — переопределяет подсистему, в которой работает данная программа.
Например, если программа оттранслирована с опцией /SUBSYSTEM:WINDOWS, можно изменить установку, не перекомпилируя ее. EDITBIN /SUBSYSTEM:CONSOLE EDIT.EXE.

/SWAPRUN — устанавливает для исполняемого модуля атрибут «помещать модуль в SWAP-файл».

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

/VERSION — устанавливает версию для исполняемого модуля.

/WS (/WS:AGGRESSIVE) — ycтaнaвливает атрибут AGGRESSIVE, который используется операционной системой Windows NT и Windows 2000.

Утилита весьма полезна для быстрого изменения атрибутов исполняемых и объектных модулей.

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

/ALL — выводит всю доступную информацию о модуле, кроме ассемблерного кода.

/ARCH — выводит содержимое секции .arch заголовка модуля.

/ARCHIVEMEMBERS — выводит минимальную информацию о элементах объектной библиотеки.

/DEPENDENTS — выводит имена динамических библиотек, откуда данным модулем импортируются функции.

/DIRECTIVES — выводит содержимое секции .drective, создаваемой компилятором (только для объектных модулей).

/DISASM — дизассемблирует содержимое секций модуля с использованием и символьной информации, если она присутствует там.

/EXPORTS — выдает все экспортируемые модулем имена.

/HEADER — выдает заголовки модуля и всех его секций. В случае объектной библиотеки выдает заголовки всех составляющих ее объектных модулей.

/IMPORTS — выдает все имена, импортируемые данным модулем.

/LINENUMBERS — выдает номера строк объектного модуля, если таковые имеются.

/LINKERMEMBER[:<1|2>] — выдает все имена в объектной библиотеке, определяемые как public.

/LINKERMEMBER:1 — в порядке следования объектных модулей в библиотеке.

/LINKERMEMBER:2 — вначале выдает смещение и индекс объектных модулей, а затем список имен в алфавитном порядке для каждого модуля.

/LINKERMEMBER — сочетание ключей 1 и 2.

/OUT — определяет, что вывод осуществляется не в консоль, а в файл (/OUT:ED.TXT).

/PDATA — выдает содержимое таблиц исключения.

/RAWDATA — выдает дамп каждой секции файла. Разновидности данного ключа: /RAWDATA:BYTE, /RAWDATA:SHORTS, /RAWDATA:LONGS, /RAWDATA:NONE, /RAWDATA:,number. Здесь number определяет ширину строк.

/SUMMARY — выдает минимальную информацию о секциях.

/SYMBOLS — выдает таблицу символов COFF-файла.

Рассматриваемая программа является весьма мощным средством дизассемблирования. Пусть программа называется prog.asm. Выполним трансляцию программы следующим образом.

При этом, кроме исполняемого модуля prog.exe, появляется еще и файл prog.pdb, содержащий отладочную информацию.

Выполним теперь команду DUMPBIN /DISASM /OUT:PROG.TXT PROG.EXE. В результате получим практически исходный ассемблерный код. Часть этого кода представлена на Рис. 4.2.1.

Рис. 4.2.1. Часть дизассемблированиого кода.

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

  1. Повышение производительности здесь минимально.
  2. Транслятор TASM32 делает все несколько иначе.

Более подробно данный вопрос рассматривается в Главе 4.1.

53 Здесь, разумеется, мы рассматриваем только средства MASM.

II

Утилиты других производителей

Данная программа рассматривалась нами в гл. 1.1. Она во многом похожа на предыдущую программу DUMPBIN.EXE, но более удобна, хотя и обладает несколько меньшими возможностями.

Данная программа широко известна в среде программистов, скажем так, хакерского направления. Название программы происходит от фразы «Hacker’s View». Основная задача, которую выполняет данная программа — просматривать и редактировать загружаемые модули. Причем просмотр и редактирование допускается в трех вариантах: двоичный, текстовый и ассемблерный. Хороших дизассемблирующих программ создано довольно много, а вот программ, подобных данной, можно по пальцам перечесть.

Интерфейс программы весьма напоминает интерфейс редакторов таких программ, как FAR или Norton Commander (см. Рис. 4.2.2.). Все команды осуществляются при помощи функциональных клавиш с использованием клавиш «Alt» и «Ctrl». Например, нажимая клавишу F4, вы получаете возможность выбрать способ представления двоичного файла: текстовый, ассемблерный или двоичный.

Нажимая клавишу F3 (при условии, если Вы находитесь в двоичном или ассемблерном просмотре), Вы получаете возможность редактировать файл. Если же, находясь в ассемблерном просмотре, Вы после F3 нажмете еще и F2, то сможете редактировать машинную команду в символьном виде. Мы не будем далее останавливаться на командах данной программы, поскольку они просты, очевидны и могут быть получены просто по F1, а перейдем сразу к простому примеру использования данной программы, хотя пример тематически и относится к материалу Гл. 4.6. Чтобы слишком не загромождать рассмотрение возьмем простую консольную программу.

Рис. 4.2.2. Внешний вид программы HIEW.EXE

Ниже (Рис. 4.2.3) представлена простая консольная программа, выводящая на экран текстовую строку.

Программа на Рис. 4.2.3 проста и корректна. Представьте теперь, что при отладке Вы случайно изменили одну команду: вместо JE поставили JNE. В результате поспе трансляции программа перестала работать. Можно исправить ее, не прибегая к ассемблерному тексту? Конечно. Для этого в начале ее следует дизассемблировать, найти ошибку, а потом воспользоваться программой HIEW.EXE.

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

Дизассемблируем модуль при помощи программы DUMPBIN.EXE. Вот дизассемблированный текст программы (Рис. 4.2.4).

Dump of file cons1.exe File Type: EXECUTABLE IMAGE 00401000: 6A F5 push 0F5h 00401002: E8 2B 00 00 00 call 00401032 00401007: 83 F8 FF cmp eax,0FFFFFFFFh 0040100A: 75 1E jne 0040102A 0040100C: A3 16 30 40 00 mov [00403016],eax 00401011: 6A 00 push 0 00401013: 68 12 30 40 00 push 403012h 00401018: 6A 11 push 11h 0040101A: 68 00 30 40 00 push 403000h 0040101F: FF 35 16 30 40 00 push dword ptr ds:[00403016h] 00401025: E8 0E 00 00 00 call 00401038 0040102A: 6A 00 push 0 0040102C: E8 0D 00 00 00 call 0040103E 00401031: CC int 3 00401032: FF 25 08 20 40 00 jmp dword ptr ds:[00402008h] 00401038: FF 25 00 20 40 00 jmp dword ptr ds:[00402000h] 0040103E: FF 25 04 20 40 00 jmp dword ptr ds:[00402004h]

Рис. 4.2.4. Дизассемблированный код программы на Рис. 4.2.3.

По дизассемблированному коду легко обнаружить ошибку. Кстати, команду cmp eax,0FFh надо, естественно, понимать как cmp eax,0FFFFFFFFh. Запомним нужный код 83F8FF. Запускаем программу HIEW.EXE, нажимаем клавишу F7 и ищем нужное сочетание. Далее клавиша F3, затем F2 и далее — заменяем команду JNE на JE.

Клавиша F9 закрепляет изменение. В результате мы исправили программу, не прибегая к ее перетрансляции.

Программа работает в командном режиме, но по сравнению, например, с DUMPBIN.EXE обладает рядом достоинств. Главное из этих достоинств — это распознавание языков высокого уровня. Кроме того, Вы сами можете писать скрипт-процедуры на предлагаемом макроязыке.

Читайте также:
Экземпляры программ для эвм что это

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

Все сохраняется в специальную базу и при последующем запуске, естественно, восстанавливаются. Внешний вид дизассемблера IDA PRO показан на Рис. 4.2.4. Мы дизассемблировали одну из наших старых программ. Обратите, кстати, внимание на ссылку offset WNDPROC.

Название WNDPROC дано уже нами в процессе анализа кода программы. Но рассмотрим все по порядку.

Рис. 4.2.4. Пример дизассемблирования программы с помощью самого мощного дизассемблера IDA PRO (под Windows).

Рассмотрим некоторые возможности этого дизассемблера.

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

2. Распознавание библиотечных и API-функций (см. Рис. 4.2.4). Дизассемблер не просто распознает эти функции, но и комментирует параметры этих функций.

3. При помощи контекстного меню или двойного щелчка Вы можете перейти по команде JMP или команде CALL в указанное место программы и так продолжать осуществлять переходы любое количество раз. Возвратиться на любое количество шагов можно, используя кнопку «стрелка» на панели инструментов.

4. При помощи Shift+Ins, Ins, а так же пунктов меню «EDIT» в любом месте программы можно записать комментарий. Комментарий, как и введенные названия меток, запоминается в базе данных программы. Но это еще не самое приятное. В комментарии может присутствовать адрес строки программы или имя метки. Если сделать двойной щелчок по адресу или метке, то мы как раз и очутимся на этом месте.

5. Сворачивание и разворачивание процедур. При помощи клавиши «-» на дополнительной клавиатуре можно свернуть процедуру, а при помощи «+» развернуть процедуру. Представление процедур в свернутом виде позволяет представить программу в более компактном и более понятном виде.

6. IDA PRO весьма аккуратно распознает не только код, но и данные. На Рис. 4.2.5 показана дизассемблированная часть нашей программы, содержащей данные.

7. Создание и выполнение командных файлов. Язык командных файлов очень близок к языку Си. У меня нет намерения рассказывать о языке, который использует IDA PRO, приведу только один такой командный файл, содержащийся в пакете IDA PRO.

Рис. 4.2.5. Часть программы, содержащей данные, дизассемблированная при помощи IDA PRO.

// // This example shows how to get list of functions. // #include static main() < auto ea,x; for (ea=NextFunction(0); ea != BADADDR; ea=NextFunction(ea)) < Message(«Function at %081X:%s»,ea,GetFunctionName(ea)); x = GetFunctionFlags(ea); if ( x Noret»); if ( x Far»); Message(«n») ; >ea = ChooseFunction(«Please choose a function»); Message(«The user chose function at %081Xn»,ea); >

Рис. 4.2.6. Пример командного файла IDA PRO.

Прокомментируем программу на Рис. 4.2.6. Как легко догадаться, организация цикла и условные конструкции имеют в точности тот же синтаксис, что и в языке Си. Главное здесь — разобрать смысл используемых библиотечных функций. Легко видеть, что функция Message просто выводит строку в окно сообщений, которое находится под основным окном.

Функция ChooseFunction вызывает окно, которое вызывается также из меню: «Jump to Function». Функция GetFunctionFlags возвращает информацию об указанной функции. Наконец функция NextFunction осуществляет переход на следующую функцию. Она возвращает адрес функции. Аргументом же ее является адрес функции, от которой осуществляется переход на следующую функцию.

Оставляю Вам изучение командного языка, поддерживаемого IDA PRO, который представлен в помощи программы.

Теоретически можно написать любую сколь угодно сложную программу по анализу дизассемблированного кода.

8. Программа IDA PRO осуществляет дизассемблирование модулей самых различных форматов: .OBJ, .EXE, .DLL, VXD, .ZIP, .NLM и др.

9. Функциональность IDA PRO может быть значительно усилена посредством подключаемых модулей — plugin’ов. Подключаемые модули пишутся на языке C++ и имеют структуру РЕ-модулей. Подключение модулей осуществляется через горячие клавиши или через пункты меню EditPlugins. Подключаемые модули находятся в специальном каталоге Plugins, где находится и файл конфигурации, где указаны эти модули.

10. Еще одна приятная особенность дизассемблера — он создает ассемблерный файл, с которым затем можно работать уже в текстовом режиме.

Fore kc .ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий

Источник: www.i-assembler.ru

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

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

Введение

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

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

Решим твою учебную задачу всего за 30 минут
Попробовать прямо сейчас

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

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

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

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

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

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

Подобрали для написания работы по теме «Дизассемблирование»
Готовые курсовые работы и рефераты
Консультации эксперта по предмету
Помощь в написании учебной работы

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

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

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

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

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

Читайте также:
Вклад карта Сбербанк что это за программа

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

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

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

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

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

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

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

Что такое дизассемблирование. Дизассемблирование – преобразование программы на машинном языке к ее ассемблерному представлению. Декомпиляция – получение кода языка высокого уровня из программы на машинном языке или ассемблере.

Декомпиляция – достаточно сложный процесс. Это обусловлено следующими причинами:

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

− Компиляция это операция типа множество-множество.Компиляция и декомпиляция могут быть выполнены множеством способов. Поэтому результат декомпиляции может значительно отличаться от исходного кода.

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

− Необходимо точное дизассемблирование исполняемого файла. Любая ошибка или упущение на фазе дизассемблирования практически наверняка размножатся в результирующем коде.

Прогресс средств декомпиляции происходит медленно, но верно. Наиболее сложный на сегодняшний день декомпилятор IDA, будет рассмотрен ниже.

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

− анализ вредоносного программного обеспечения;

− анализ уязвимостей программного обеспечения с закрытым исходным кодом;

− анализ совместимости программного обеспечения с закрытым исходным кодом;

− отображение команд программы в процессе отладки.

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

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

Анализ уязвимостей. Для простоты, можно разделить процесс аудита безопасности на три стадии: поиск уязвимостей, анализ уязвимостей, и разработка эксплойта. Одни и те же шаги предпринимаются вне зависимости от того, имеется ли у вас исходный код; однако, уровень трудоемкости резко возрастает, когда в вашем распоряжении есть лишь исполняемый файл.

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

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

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

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

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

Как дизассемблировать. Типичные задачи, с которыми сталкивается дизассемблер: взять 100 КБ из исходного файла, отделить код от данных, преобразовать код к языку ассемблера, и главное ничего не потерять. В этот список можно добавить дополнительные пожелания, например, определение границ функций, распознавание таблиц переходов, выделение локальных переменных. Это значительно усложнит его работу. Качество результирующих листингов дизассемблирования определяется свойствами алгоритмов, а также уместностью их применения в конкретной ситуации.

Базовый алгоритм дизассемблирования

Шаг 1. Первым шагом в процессе дизассемблирования является идентификация кодового сегмента. Так как команды обычно смешаны с данными, то дизассемблеру необходимо их разграничить.

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

Шаг 3. Как только команда была обнаружена и декодирована, ее ассемблерный эквивалент может быть добавлен к результирующему листингу. После этого необходимо выбрать одну из разновидностей синтаксиса языка ассемблера.

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

Алгоритм линейной развертки

Алгоритм линейной развертки использует крайне прямолинейный подход при выборе очередной команды для дизассемблирования: где завершается код одной команды — начинается код новой. В результате, наиболее сложной задачей становится определение первой команды. Дизассемблирование начинается с первого байта в сегменте кода и последовательно продвигается, обрабатывая команды одну за другой, пока не будет достигнут конец сегмента. При этом не производится попыток понять логику передач управления в программе посредством распознавания команд перехода таких, например, как условия.

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

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

40123f: 55 pushebp

401240: 8bec movebp,esp

401242: 33 c0 xor eax,eax

Читайте также:
Касперский эндпоинт секьюрити что это за программа

401244: 8b 55 08 mov edx,DWORD PTR [ebp+8]

401247: 83 fa 0c cmp edx,0xc

40124a: 0f 87 90 00 00 00 ja 0x4012e0

401250: ff 24 95 57 12 40 00 jmp DWORD PTR [edx*4+0x401257]

401257: e0 12 loopne 0x40126b

401259: 40 inc eax

40125a: 00 8b 12 40 00 90 add BYTE PTR [ebx-0x6fffbfee],cl

401260: 12 40 00 adc al,BYTE PTR [eax]

401263: 95 xchg ebp,eax

401264: 12 40 00 adc al,BYTE PTR [eax]

401267: 9a 12 40 00 a2 12 40 call 0x4012:0xa2004012

40126e: 00 aa 12 40 00 b2 add BYTE PTR [edx-0x4dffbfee],ch

401274: 12 40 00 adc al,BYTE PTR [eax]

401277: ba 12 40 00 c2 mov edx,0xc2004012

40127c: 12 40 00 adc al,BYTE PTR [eax]

40127f: ca 12 40 lret 0x4012

401282: 00 d2 add dl,dl

401284: 12 40 00 adc al,BYTE PTR [eax]

401287: da 12 ficom DWORD PTR [edx]

401289: 40 inc eax

40128a: 00 8b 45 0c eb 50 add BYTE PTR [ebx+0x50eb0c45],cl

401290: 8b 45 10 mov eax,DWORD PTR [ebp+16]

401293: eb 4b jmp 0x4012e0

Алгоритм рекурсивного спуска

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

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

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

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

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

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

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

Команды возврата. В некоторых случаях, алгоритм рекурсивного спуска терпит неудачу. Команда возврата из функции (например, ret x86) не предоставляет информации о том, какая команда будет выполнена далее. Если бы программа была на самом деле запущена, управление было бы передано по адресу, расположенному на вершине стека. У дизассемблера нет возможности доступа к стеку.

Вместо этого дизассемблирование внезапно останавливается. В этом случае алгоритм рекурсивного спуска обращается к списку отложенных адресов, и процесс дизассемблирования возобновляется. Этот рекурсивный процесс отражает смысл названия алгоритма.

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

Дата добавления: 2018-06-27 ; просмотров: 4707 ; Мы поможем в написании вашей работы!

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

Дизассемблирование программы что это

Дизассемблеры и декомпиляторы исполняемых файлов

Дизассемблеры и декомпиляторы исполняемых файлов

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

Скриншот программы dnSpy

Скриншот программы dnSpy

Начнем с популярного нынче дотнета. Не будет преувеличением сказать, что самый мощный на сегодняшний день инструмент для потрошения приложений на .NET — это бесплатный проект dnSpy. Он включает в себя декомпилятор C# и Visual Basic .NET, отладчик, редактор сборки с подсветкой синтаксиса, HEX-редактор и еще множество инструментов. Русский язык в наличии. Самую свежую версию можно всегда скачать с офсайта.

Скриншот программы IDA Pro Advanced

Скриншот программы 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-битных систем. Если по каким-то причинам вы не можете использовать варез, то на офсайте есть бесплатные демо-версии с урезанным функционалом.

Скриншот программы Interactive Delphi Reconstructor

Скриншот программы Interactive Delphi Reconstructor

IDR (Interactive Delphi Reconstructor) — бесплатный декомпилятор исполняемых файлов и динамических библиотек. В отличие от IDA Pro, этот декомпилятор создан специально для разбора файлов, написанных на языке Delphi. Сейчас проект прекратил развитие, если какие изменения и вносятся, то исключительно косметические. Исходники для доработки открыты. Лично я пользуюсь стабильным комплектом Interactive Delphi Reconstructor 2.6.0.1.

Скриншот программы VB Decompiler Pro

Скриншот программы 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. Но я в этой статье перечислил лишь те программы, которыми пользуюсь сам и которые упоминаются в статьях на этом сайте.

Источник: www.manhunter.ru

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