Деассемблировать что это значит
Дизассемблер своими руками
Знание структуры машинных команд уже много лет не является обязательным, для того, чтобы человек мог назвать себя программистом. Естественно так было не всегда. До появления первых ассемблеров программирование осуществлялось непосредственно в машинном коде. Каторжная работа, сопряженная с большим количеством ошибок. Современные ассемблеры позволяют (в разумной степени) абстрагироваться от железа, метода кодирования команд. Что уж говорить о компиляторах высокоуровневых языков. Они поражают сложностью своей реализации и той простотой, с которой программисту позволяется преобразовывать исходный код в последовательность машинных команд (причем преобразовывать, в достаточной степени, оптимально). От программиста требуется лишь знание любимого языка/ IDE. Знание того, во что преобразует компилятор исходный листинг вовсе не обязательно.
Тем же, кому интересно взглянуть на краткое описание структуры кодирования машинных команд, пример реализации и исходный код дизассемблера для x86 архитектуры, добро пожаловать.
Создание дизассемблера для x86 архитектуры является, хотя задачей и не особо сложной, но все, же довольно специфичной. От программиста требуются определенного рода знания – знания того, как микропроцессор распознает последовательность “байтиков” в машинном коде. Далеко не в каждом вузе можно получить такие знания в объеме достаточном для написания полнофункционального современного дизассемблера – приходится искать самому (как правило, на английском языке). Данный пост не претендует на полноту освещение проблемы создания дизассемблера, в нем лишь кратко рассказывается то, как был написан дизассемблер для x86 архитектуры, 32-разрядного режима исполнения команд. Так же хотелось бы отметить вероятность возможных неточностей при переводе некоторых понятий из официальной спецификации.
Структура команд для intel x86
Структура команды следующая:
• Опциональные префиксы (каждый префикс имеет размер 1 байт)
• Обязательный опкод команды (1 или 2 байта)
• Mod_R/M – байтик, определяющий структуру операндов команды — опциональный.
• Опциональные байты, занимаемые операндами команды (иногда разделено как один байт поля SIB[Scale, Index, Base], смещения и непосредственного значения).
Существуют следующие префиксы:
Первые шесть изменяют сегментный регистр, используемый командой при обращении к ячейке памяти.
• 0x26 – префикс замены сегмента ES
• 0x2E – префикс замены сегмента CS
• 0x36 – префикс замены сегмента SS
• 0x3E – префикс замены сегмента DS
• 0x64 – префикс замены сегмента FS
• 0x65 – префикс замены сегмента GS
• 0x0F – префикс дополнительных команд (иногда его не считают за настоящий префикс – в этом случае считается, что опкод команды состоит из двух байт, первый из которых 0x0F)
• 0x66 – префикс переопределения размера операнда (к примеру, вместо регистра eax будет использоваться ax)
• 0x67 – префикс переопределения размера адреса (см ниже)
• 0x9B – префикс ожидания (WAIT)
• 0xF0 – префикс блокировки (LOCK с его помощью реализуется синхронизация многопоточных приложений)
• 0xF2 – префикс повторенья команды REPNZ – работа с последовательностями байт (строками)
• 0xF3 – префикс повторенья команды REP – работа с последовательностями байт (строками)
Каждый из этих префиксов меняет семантику и (или) структуру машинной инструкции (например, ее длину или выбор мнемоники).
Опкоды команд.
Опкод команды иногда один, иногда вмести с префиксом (ами) однозначно определяет мнемонику (название) команды. Команд много. И при усложнении современных микропроцессоров их количество не уменьшается – новые команды появляются, а устаревшие не исчезают (обратная совместимость). Список опкодов и команд ассоциированных с ними, как правило, можно скачать на официальных сайтах производителей микропроцессоров.
Байт Mod_R/M состоит из следующих полей:
• Mod – первые два бита (значение от 0 до 3)
• R/M – следующие три бита (значение от 0 до 7)
• Value of ModR/M – следующие три бита (значение от 0 до 7)
Для написания дизассемблера мы будем использовать следующую страничку: http://ref.x86asm.net/geek32.html.
Мы видим несколько таблиц. В сущности, только эти таблицы и описание их полей нам и понадобятся, для написания дизассемблера. Конечно, дополнительно требуется способность к логическому рассуждению и свободное время.
В первой таблице представлен список машинных команд, не содержащих префикс 0x0F. Во второй список команд содержащих этот префикс (большинство этих команд появились в микропроцессорах семейства “Pentium with MMX” или более поздних).
Следующие три таблицы позволяют преобразовать байт Mod_R/M в последовательность операндов команды для 32-битного режима кодировки команд. Причем каждая последующая из этих трех таблиц уточняет разбор Mod_R/M байта частных случаев предыдущей таблицы.
Последняя таблица позволяет преобразовать байт Mod_R/M в последовательность операндов команды для 16-битного режима кодировки команд. По умолчанию считается, что команда кодируется в 32-битном режиме. Для смены режима кодировки используется префикс переопределения размера адреса (0x67).
Первое, что необходимо сделать, это перенести первые две таблицы в удобные для работы структуры данных. На том же сайте можно скачать xml-версии данных таблиц, и уже их преобразовать в красивые сишные структуры. Я же поступил иначе – загрузил html таблицы в Excel, и уже там, написав несложный скриптик на VBA, получил исходный сишный код, который, уже после ручных исправлений представлял собой требуемые структуры данных.
Сам алгоритм дизассемблирования достаточно прост:
• Собирается список префиксов, используемых в текущей машинной инструкции
• Ищется в одной из двух таблиц соответствующее поле в зависимости от опкода, префиксов и поколения (модели) целевого (искомого) микропроцессора.
• Найденная нами запись характеризуется списком полей такими как поколение (модель) микропроцессора, с которого появилась поддержка данной команды или, например, список флагов, которые данная команда может изменить. Нас же, в основном, интересуют лишь мнемоника (название) команды и список операндов. Проанализировав все операнды найденной и поля байта Mod_R/M, мы сможем узнать текстовое представление и длину команды.
Количество операндов может колебаться от нуля до трех. Исходные таблицы содержат более сотни типов операндов. Некоторые операнды дублируются – у них различные названия, но последовательность действий обработки Mod_R/M байта (и возможно последующих байтов) у них одинакова.
Для просмотра примера обработки различных операндов и примера дизассемблирования простейшей функции “Hello world” можно скачать исходный код дизассемблера для компилятора C++ Builder 6.
PS:
Не факт, что кому-то из прочитавших этот пост, когда-либо понадобится информация, почерпнутая из него (дизассемблеры пишут единицы), но, в любом случае этот дизассемблер тестировался и даже входит в состав достаточно большего коммерческого протектора, исходники открыты и распространяются свободно )
Что значит дизассемблировать? Только объясните понятно.
вот этот перевод и есть дизассемблирование.
обычно применяется для того что бы сломать программу что бы она не просила ключ регистрации и что нибудь в этом роде
Дизассе́мблер — транслятор, преобразующий машинный код, объектный файл или библиотечные модули в текст программы на языке ассемблера.
По режиму работы с пользователем делятся на
Автоматические
Интерактивные
Примером автоматических дизассемблеров может служить Sourcer. Такие дизассемблеры генерируют готовый листинг, который можно затем править в текстовом редакторе. Пример интерактивного — IDA. Он позволяет изменять правила дизассемблирования и является весьма удобным инструментом для исследования программ.
Дизассемблеры бывают однопроходные и многопроходные. Основная трудность при работе дизассемблера — отличить данные от машинного кода, поэтому на первых проходах автоматически или интерактивно собирается информация о границах процедур и функций, а на последнем проходе формируется итоговый листинг. Интерактивность позволяет улучшить этот процесс, так как просматривая дамп дизассемблируемой области памяти, программист может сразу выделить строковые константы, дать содержательные имена известным точкам входа, прокомментировать разобранные им фрагменты программы.
было: AE 00
а стало: mov ax, 0
преобразовать машинный код в мемо-код
Дизассе́мблер — транслятор, преобразующий машинный код, объектный файл или библиотечные модули в текст программы на языке ассемблера.
По режиму работы с пользователем делятся на
Примером автоматических дизассемблеров может служить Sourcer[1]. Такие дизассемблеры генерируют готовый листинг, который можно затем править в текстовом редакторе. Пример интерактивного — IDA. Он позволяет изменять правила дизассемблирования и является весьма удобным инструментом для исследования программ.
Дизассемблеры бывают однопроходные и многопроходные. Основная трудность при работе дизассемблера — отличить данные от машинного кода, поэтому на первых проходах автоматически или интерактивно собирается информация о границах процедур и функций, а на последнем проходе формируется итоговый листинг. Интерактивность позволяет улучшить этот процесс, так как просматривая дамп дизассемблируемой области памяти, программист может сразу выделить строковые константы, дать содержательные имена известным точкам входа, прокомментировать разобранные им фрагменты программы.
Чаще всего дизассемблер используют для анализа программы (или её части), исходный текст которой неизвестен — с целью модификации, копирования или взлома. Реже — для поиска ошибок (багов) в программах и компиляторах, а также для анализа и оптимизации создаваемого компилятором машинного кода.
Обычно однопроходный дизассемблер (как и построчный ассемблер) является составной частью отладчика.
Дизассемблирование
В этой статье мы с вами поговорим о дизассемблерах, о том, что они из себя представляют и рассмотрим принципы их работы.
Что такое дизассемблер?
Дизассемблирование – это операция, обратная ассемблированию, т.е. восстановление текста программы на ассемблере из исполняемой программы в машинных кодах.
Сразу забегу немножко вперёд и скажу, что при повторном ассемблировании восстановленного текста, нет никакой гарантии получить тот же самый код, а значит, есть шанс, что программа откажется работать.
Любая попытка модификации дизассемблированного текста может окончательно развалить программу.
Дело в том, что ассемблер заменяет все метки на константы. При внесении изменений в программу необходимо скорректировать все ссылки на метки.
Виды дизассемблеров
По режиму работы дизассемблеры делятся на автоматические и интерактивные.
Хорошим примером автоматического дизассемблера является Sourcer.
Такие дизассемблеры генерируют готовый листинг, который можно затем править в текстовом редакторе.
По числу просмотров объектного кода дизассемблеры делятся на одно-, двух- и многопроходные.
Однопроходные, называемые также «дизассемблерами без меток», используются в основном в отладчиках и программных мониторах и разрабатываются, если необходимо быстро получить псевдоассемблерный текст.
Наиболее распространены двухпроходные дизассемблеры, которые позволяют получать метки в листинге дизассемблирования, но, не решающие полностью проблемы разделения команд и данных. После них программист «вручную» подправляет сомнительные места.
Назначение дизассемблера
При работе с исполняемым кодом или байт-кодом, созданным на некоторых языках высокого уровня (например, java) имеется возможность восстановить не только текст на языке ассемблера, но даже и структуру классов программы, а если при компиляции исполняемого файла не была отключена отладочная информация, то и исходный текст программы. Для исключения таких возможностей используется обфускация.
Примеры работы
После того как вы установили необходимые опции и выбрали команду Gо, SOURCER загружает программу в память и определяет размеры сегментов. Во время первого прохода определяется большинство ссылок на подпрограммы и области данных. Далее SOURCER подразумевает, что области кода и данных являются кодом, пока не будет подтверждено обратное. В начале каждого следующего прохода SOURCER анализирует ссылки на код и данные для более точного определения областей кода и данных. На последнем проходе определяются необходимые директивы ассемблера, формат каждой строки и комментарии.
Внутренний имитатор следит за изменениями содержимого всех регистров и поддерживает отдельный стек для программы. Имитатор также следит за тем, чтобы в случае использования нескольких сегментов данных использовался верный сегмент. В задачу имитатора входит слежение за комментариями, обращениями к портам ввода/вывода и разрешение индексных вызовов и переходов. Имитатор повторяет действия программы. Не имитируются большинство инструкций, изменяющих содержимое памяти, хотя поддерживаются инструкции, считывающие данные из памяти. Специальная поддержка для регистра CS обеспечивает полную имитацию работы с RОМ и RAM.
В комплект поставки входят несколько утилит, среди которых утилита LST2ASM, позволяющая преобразовывать листинги в ассемблерный текст, и утилита PATCHER, позволяющая вносить изменения в двоичные файлы.
BIOS Pre-Processor позволяет (совместно с SOURCER) получить прокомментированный исходный текст базовой системы ввода/вывода (BIOS), установленной на компьютере. Зачем это нужно? Для изучения работы и организации BIOS, для внесения изменений и дополнений в BIOS, для исправления ошибок, а также в ряде других случаев. Создание листинга для BIOS может занять от 10 минут до 2 часов, но результат стоит того.
BIOSPre-Processor работает следующим образом. Сначала анализируется таблица векторов прерываний и находятся точки входа обработчиков прерываний. Потом определяются ключевые области данных и их размер. Затем определяется размер BIOS и вся необходимая информация заносится в файл BIOS.DEF, который и обрабатывается SOURCER.
Следует знать, что зачастую текст, выданный дизассемблером, либо вообще не поддается реассемблированию, либо получаемая программа ведет себя совсем не так, как хочется, но об этом мы уже говорили в начале.
Защита программ от дизассемблирования
Для защиты от дизассемблеров используются различные методы, большинство из которых базируется на использовании «принципа фон Неймана», который заключается в том, что программы и данные выглядят и хранятся одинаково, в результате чего программа может модифицировать саму себя. Использования таких методов чаще всего достаточно для защиты от дизассемблеров.
Ниже приведены некоторые приёмы, которые следует использовать для противодействия дизассемблерам.
1. Шифрование критичного кода программы и дешифрация его самой системой защиты перед передачей управления на него. Таким образом, дешифрация программы происходит не сразу, а частями и защита от дизассемблера оказывается распределённой во времени. При этом никогда не осуществляйте дешифрацию одной подпрограммой, т.к. её будет легко вычислить и отключить. Также следует затирать те участки программы, которые уже не понадобятся. Шифрование исполняемого кода программы с целью защиты от дизассемблера является наиболее простым средством как в смысле его реализации, так и в смысле снятия. Шифрование может быть использовано лишь как часть защиты от дизассемблера и поэтому необязательно должно быть сложным.
2. Скрытие команд передачи управления приводит к тому, что дизассемблер не может построить граф передачи управления.
2.1. Косвенная передача управления.
2.2. Модификация адреса перехода в коде программы (таблица 1).
Дизассемблирование
Смотреть что такое «Дизассемблирование» в других словарях:
Tool-assisted speedrun — (сокращенно TAS[1]) скоростное прохождение игры с использованием встроенных инструментов эмулятора, таких как сохранение и перезапись, замедление и покадровый ввод, просмотр содержимого памяти и анализ исполняемого кода. Идея TAS… … Википедия
Debug — Тип отладчик Разработчик Tim Paterson (англ.) Операционная система DOS, MS DOS, OS/2, Microsoft Windows Сайт … Википедия
Язык ассемблера — Листинг программы на языке ассемблера Motorola MC6800 (слева идут адреса и машинные коды в шестнадцатеричной системе, вычисленные и сгенерированн … Википедия
Ассемблер — Эта статья о компьютерных программах. О языке программирования см. Язык ассемблера. Ассемблер (от англ. assembler сборщик) компьютерная программа, компилятор исходного текста программы, написанной на языке… … Википедия
Дизассемблер — транслятор, преобразующий машинный код, объектный файл или библиотечные модули в текст программы на языке ассемблера. По режиму работы с пользователем делятся на Автоматические Интерактивные Примером автоматических дизассемблеров может служить… … Википедия
Компилятор — Эта статья включает описание термина «Компиляция»; см. также другие значения. Компилятор программа или техническое средство, выполняющее компиляцию.[1][2][3] Компиляция трансляция программы, составленной на исходном языке высокого… … Википедия
Обратная разработка — Эта статья или раздел нуждается в переработке. Пожалуйста, улучшите статью в соответствии с правилами написания статей … Википедия
Взлом программного обеспечения — (англ. software cracking) действия, направленные на устранение защиты программного обеспечения (ПО), встроенной разработчиками для ограничения функциональных возможностей. Последнее необходимо для стимуляции покупки такого… … Википедия
Донгл — Электронный ключ (также аппаратный ключ, иногда донгл от англ. dongle) аппаратное средство, предназначенное для защиты программного обеспечения (ПО) и данных от копирования, нелегального использования и несанкционированного распространения.… … Википедия
Значение слова «дизассемблировать»
дизассембли́ровать
Делаем Карту слов лучше вместе
Привет! Меня зовут Лампобот, я компьютерная программа, которая помогает делать Карту слов. Я отлично умею считать, но пока плохо понимаю, как устроен ваш мир. Помоги мне разобраться!
Спасибо! Я стал чуточку лучше понимать мир эмоций.
Вопрос: гоготанье — это что-то нейтральное, положительное или отрицательное?
Предложения со словом «дизассемблировать»
Отправить комментарий
Дополнительно
Предложения со словом «дизассемблировать»
Если это простое декодирование, то можно определить алгоритм с использованием эксперимента и догадки или дизассемблировать часть программы, реализующей этот алгоритм и определить его.
Но ты пойми, дизассемблировать код можно, только зная систему команд процессора, для которого этот код написан, и который этот код выполняет.
После запуска IDA предлагает 3 варианта продолжения: дизассемблировать новый файл (new), продолжить без загрузки файла (go), открыть ранее дизассемблированный файл (previous).
Правописание
Карта слов и выражений русского языка
Онлайн-тезаурус с возможностью поиска ассоциаций, синонимов, контекстных связей и примеров предложений к словам и выражениям русского языка.
Справочная информация по склонению имён существительных и прилагательных, спряжению глаголов, а также морфемному строению слов.
Сайт оснащён мощной системой поиска с поддержкой русской морфологии.