Программы
ВХОД
Логин:    

Пароль:  

   Запомнить меня
Вам нужно авторизоваться.
Забыли пароль? / Регистрация
Статьи


   Статьи
   Soft
   Программирование
   Что такое декомпилятор?

Что такое декомпилятор?

Добавлено: 21.05.2012

Прочитано: 2418

Декомпиляторы: что это и для чего?

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

Вообще, считается, что скомпилированная «старыми» компиляторами программа не может быть восстановлена в исходный код в приемлемой форме. Эти языки – Си, Паскаль, Модула, Фортран и т.д. – при компиляции не сохраняют имена переменных, проводят автоматическую оптимизацию и прочее, так что восстановить программу можно только в виде листинга на ассемблере, что ничуть не помогает следствию. Есть мнение, что это не совсем так, и теоретически возможно полуавтоматическое восстановление исходника. Но если такие инструменты и существуют на практике, то они ценятся гораздо выше цены золота, ведь результатом их работы можно очень много заработать.

декомпилятор

Давайте распишем, как бы мы могли написать такой декомпилятор, скажем, для TURBO Pascal 7.1. Для анализа нам понадобятся вьюер Hiew и какой-нибудь отладчик (можно встроенный в TP). Ясно, что программа компилируется следующим образом (упрощенно):

  1. Заголовок
  2. Секция инициализации
  3. Программа пользователя
  4. Данные программы
  5. Секция подключаемых библиотек (RTL)
  6. Данные библиотек
  7. Куча, стек и прочее

Из всего этого интересны лишь «программа пользователя» и «данные программы». Первая секция, как правило, состоит из стандартных конструкций, где для многих операций производится запись параметров в стек, а затем идет вызов обрабатывающих библиотек RTL. Это такие команды, как writeln, readln, вызов подпрограмм и т.д. Конструкции циклов могут преобразовываться в машинный код прямо на месте. Заметим, что RTL всегда одинакова в пределах одной версии компилятора, то есть все вызовы этого API можно однозначно идентифицировать по смещениям или кодовым константам. И останется лишь разобраться, как преобразовать обратно, к примеру, вызов в виде

  1. Загрузка в стек параметра 1
  2. Загрузка в стек параметра N
  3. Вызов функции печати

в вид writeln(параметр 1, …, параметр N).

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

Для компиляторов с промежуточным языком все намного проще – все эти языки для .NET, JVM и остальные Бейсико-подобные хранят данные в избыточном и чуть ли не открытом виде, поэтому программы вроде Reflect, dot Peek, ILSpy легко восстанавливают исходный код. Против этого помогает лишь обфускация программ, делающая их сложнее, больше и медлительнее. Для языков СУБД (FoxPro, Clarion, dBase, Paradox и т.д.) декомпиляторы написаны уже давно. Есть декомпиляторы для Delphi – DeDe, но частичные (преобразуют часть кода в ассемблер), для VB, DOS-версий Бейсиков. Заметим, что в области декомпиляторов всегда наблюдается нехватка практических инструментов.



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

<<  Базы данных MySQL Что такое компилятор?  >>


Добавить Комментарий

Скачать программу для проверки на ошибки
Скачать программу автоматического обновления программ
Статьи
Новые Программы
Новые статьи
Популярные Программы
Самые читаемые статьи
Copyright © Дай Прогу 2011 Контакты ¤ Статистика