Декомпилатор: Разлика между версии

Изтрито е съдържание Добавено е съдържание
Kratoz333 (беседа | приноси)
Редакция без резюме
Kratoz333 (беседа | приноси)
Редакция без резюме
Ред 8:
метаданни и функции на високо ниво, които правят декомпилацията лесно осъществима. Присъствието на дебъг данни предоставя възможност да се възпроизвеждат оригиналните имена на променливите и на структурите, дори и номерацията на редовете. Код без такива метаданни и дебъг данни е много по-труден за декомпилиране.
 
==== Етапи на Декомпилация ====
Декомпилаторите могат да се разглеждат като поредица от етапи, всеки от които допринася специфични аспекти на цялостния процес на декомпилация.
 
===== Зареждане =====
Първата етап зарежда машинния код или междинния език на програмата. Би трябвало да открие основни факти за зададената програма като архитектурата (Pentium, PowerPC, и други) и входната точка.
 
===== Преобразуване =====
Следващия етап е преобразуването на инструкциите от машинния код в машинно независимо междинно представяне(IR).
 
===== Идиоми =====
Идиоматични поредици от машинен код са поредици код, чиято комбинирана семантика не е непосредствено очевидна от инструкциите на индивидуалните семантики.
Или като част от преобразуването, или като част от по-късни анализи, тези идиоматични поредици трябва да бъдат преведени в IR.
 
===== Анализ на програма =====
Различни анализи на програма могат да се прилага на IR. По-специално изразно събиране комбинира семантиките на няколко инструкции в по-сложен израз. Резултатът е повече като език на високо ниво.
 
===== Анализ на потокът данни =====
Местата, където различните регистри се дефинират и използват, трябва да бъдат проследени с анализ на потокът данни. Същия анализ трябва да бъде приложен на места, които се използват за временни и локални данни. Различни имена могат да се формират за всеки свързан набор от стойностни дефиниции и употреби. Възможно е едно и също място в паметта да се използва за повече от една променлива в различни части от програмата. Анализът може да покаже дори ако определена променлива се използва за две различни цели, но тази логика да е имплементирана от компилатора, а не от разработчика.
===== Анализ на типове =====
Добър декомпилатор ще изпълнява такъв анализ. Чрез наблюдение на записването в паметта, декомпилаторът понякога може да разбере типът данни, който се записва.
 
===== Структуриране =====
Предпоследния етап включва структуриране на IR в конструкции от високо ниво като while цикли и if/then/else условни конструкции.
 
===== Генерация на код =====
Последния етап е генерирането на код от високо ниво в back end-а на декомпилатора. Декомпилатора може да има опция да предостави този код в други езици от високо ниво.
 
== Основни инструменти ==
 
==== Декомпилатор за C# ====
.NET Reflector е първата програма за разглеждане (браузване) на CLI([[Common Language Infrastructure]]) компилиран код. Може да се използва за инспектиране, навигиране, търсене, анализиране или разглеждане на съдържанието на CLI компоненти, като например на изпълним файл под [[.NET Framework]] (познат още като [[асембли]]). Основнота му функция е да превежда машинния код от ниско ниво до разбираем за хората код от високо ниво. Стандартно .NET Reflector позволява декомпилация на СLI асемблита до [[C#]],[[Visual Basic .NET]],[[Common Intermediate Language]] и [[F#]]. Друга полезна функционалност на Reflector е така нареченото "дърво на извикванията" (Call Three), с помощта на което се проследяват методите на ниско ниво какви други методи извикват. Показва в детайли [[метадата]], ресурси и [[XML]] документация. .NET Reflector може да се използва от .NET програмистите за по-лесно разбиране на същината на начина, по които са имплентирани различни методи, класове, библиотеки и т.н., за показване на разликите в две версии на едно и също асембли, а също така и за лесно разбиране на взаимовръзката между две части на едно и също CLI приложение. Съществуват голям брой програми, който наследяват и допълнително разширяват и подобряват функционалността и възможностите на .NET Reflector.
 
==== Декомпилатор за Java ====
Java Decompiler (JD) е декомпилатор предназначен за работа с програмният език [[ Java ]]. Може да бъде намерен като [[приложение]] с [[графичен потребителски интерфейс]] както и под формата на [[плъгин]] за [[среда за разработка]] като [[Eclipse]] (JD-Eclipse) и IntelliJ IDEA (JD-IntelliJ).
JD поддържа всички версии на Java от 1.1.8 до 1.7.0, а също така и JRockit 90_150, Jikes 1.2.2, Eclipse Java Compiler и Apache Harmony и поради тази причина бива често предпочитан заместник на популярният в миналото JAD (JAva Decompiler). JD-Eclipse има поддръжка за [[Eclipse]] до версия 3.7(Indigo).
 
==== Декомпилатор за C++ ====