Original: http://www.backerstreet.com/decompiler/introduction.htm
Вступ
Декомпілювання є формою зворотного інженерії комп’ютерних програм. Його мета полягає в тому, щоб перетворити скомпільований двійковий файл у вихідний файл. Можна хотіти зробити це з кількох причин, наприклад, щоб зрозуміти, як працює програма, або спробувати змінити програму, щоб підвищити його або виправити помилку.
Декомпілювання була навколо протягом багатьох років, напевно, з тих пір люди почали збирати програми з мов високого рівня в формати нижчого рівня, таких як складання і машинний код.
Було зроблено кілька спроб проводити при записі двійкових виконуваних декомпілятори. На цій сторінці є декілька прикладів.
Є ще більше декомпілятори доступних для керованих середовищах, що використовують байт-код, як Java і C #. Великий список доступний на вікі перетворень програм.
На цих сторінках ми сфокусуємось на декомпілювання бінарних виконуваних файлів, або з машинного коду до вихідного коду, так як це набагато складніше, ніж декомпіляцію Java байт-код або C #.
Кілька мов і компіляторів може виробляти машинний код, в тому числі деякі Java, C # і Visual Basic компілятори. Тому декомпілятор повинен знати, яка мова був використаний для компіляції програми, і буде мати підтримку для створення цієї мови. Проте, більшість складних проблем в декомпілювання з’являються при використанні менш жорстких мов, а саме: C, Pascal або C ++.
Більшість алгоритмів може використовуватися для всіх мов, тому ми будемо в основному використовувати приклади, написані на C. Коли ми показуємо алгоритм, ми будемо використовувати C або C ++, так як вони є найбільш доступні мови на обох Linux і Windows.
Незалежно від мови перекладу, декомпілятор в основному має справу з 3-ма типами сутностей:
– Oб’єкти коду (функції, звітність)
– Об’єкти даних (глобальні та локальні змінні)
– Типи (типи змінних, прототипи функцій)
Постійна проблема декомпілятор, щоб спробувати вивести один або декілька з цих трьох осіб вище від послідовності байтів, знайдених в бінарному файлі. Для того, щоб зробити це, це корисно знати, як засоби розробки (які ми називаємо «вперед engineering’tools) використовуються при написанні програми, так як це процес, який ми намагаємося повернутися.