09.01.2013, 12:52 | #1 |
Модератор
Регистрация: 25.09.2011
Сообщений: 236
|
Что такое декомпилятор.
Создавая программу на С++ или Pascal, мы редко задумываемся о том, как именно процессор должен воспринимать ее, зная лишь то, что без исходного кода в скомпилированной программе никто не разберется. А это важно, так как в программу обычно вкладывают хитрые алгоритмы, предназначенные отнюдь не для использования конкурентами. Между тем, получение исходного кода из скомилированного – вовсе не фантастика, и такие программы называются декомпиляторами.
Не нужно путать их с дизассемблерами, которые преобразуют машинный код в инструкции ассемблера – там действительно разобраться очень трудно. Больше скажем: скомпилировать обратно ассемблерную программу без «шаманских плясок» тоже не получится. Поэтому не секрет, что многие жаждут найти этот самый декомпилятор. И даже не для взлома чужих алгоритмов или получения исходников Windows, а, например, чтобы восстановить свой потерянный исходный код. В теории создание автоматического декомпилятора невозможно, но на практике они существуют у профессиональных хакеров в виде набора личного инструментария, которым они не делятся. Давайте посмотрим, как должен действовать такой инструмент при исследовании, скажем, программы на Turbo Pascal. Мы имеем exe-файл, в котором присутствуют: - Заголовок - Секция данных - Секция кода - Внешние библиотеки пользователя - Внешние библиотеки языка (RTL) RTL – самая важная часть, которую нужно выделить из программы. Делается это через таблицы настраиваемых адресов заголовка. Зная точку входа в RTL, мы может найти все адреса из основной программы, ведущие в эту область. Каждый адрес – вызов функции вроде writeln, paramstr, sin, abs, blockwrite и т.д. Интересно, что сама RTL часто поставляется в исходниках, т.е. идентифицировать ее с кодом из программы можно однозначно. Используемые стандартные функции имеют набор параметров, по которым можно выделить отдельные структуры данных в секции данных. Скажем, отделить переменные типа byte от word, longint от real. Сама же исходная программа выглядит довольно просто. Все циклы и операции в ней преобразуются «на месте» в виде несложных логических конструкций ассемблера, а для вызова стандартной функции используется следующая модель поведения: - Подготовить нужные регистры, настроив их значениями данных или ссылками на область данных - Записать эти регистры в стек - Вызвать стандартную подпрограмму обработки Вызов подпрограммы – обращение к зоне RTL, причем адрес входа однозначно определяет функцию даже «на глаз». Недостатки декомпилятора: потеря комментариев, невозможность восстановить оптимизированные выражения и имена идентификаторов, трудность при разборе с ассемблерными вставками или элементами изощренного кодирования. Заметим, что для языков, генерирующих промежуточный код, декомпиляторы уже есть – FoxPro и другие СУБД, языки платформ. NET и JVM и некоторых других. Но «настоящий» автоматический декомпилятор еще пока ждет своего разработчика. |
Метки |
декомпилятор, программирование |
Опции темы | |
Опции просмотра | |
|
|
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Что такое DDoS атака и анти DDoS хостинг. | AntonXxX | Новости | 0 | 08.01.2013 19:09 |
Что такое троян | sertaras | Статьи | 1 | 28.09.2012 02:40 |
Что такое криптор | sertaras | Статьи | 1 | 28.09.2012 02:39 |