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

Изтрито е съдържание Добавено е съдържание
+ без източници и обработка
Kratoz333 (беседа | приноси)
Редакция без резюме
Ред 1:
{{без източници}}
{{обработка|форматиране}}
== Какво е това? ==
Декомпилатор е [[компютърна програма]], която изпълнява обратната операция на тази на [[компилатор]]. Това е превеждането на програмен код от относително ниско ниво на абстракция (често проектиран да бъде четен от компютри, а не от хора) във форма, която има по-голямо ниво на абстракция (проектирана за четенето от хора). Декомпилаторите обикновено не реконструират перфектно оригиналния [[сорс код]]. Декомпилаторите са важен инструмент в софтуерното обратно инженерство.
 
== Как работи? ==
Декомпилация е действието от използването на декомпилатор, но може да се има в предвид и самия резултат от декомпилатора. Успехът на декомпилацията зависи от количеството информация, предоставено от кода, който се декомпилира и начина, по който се анализира от декомпилатора. Биткод формат използван от много виртуални машини (като [[Java Virtual Machine]] и от [[.NET Framework]] [[Common Language Runtime]]) често съдържат
метаданни и функции на високо ниво, които правят декомпилацията лесно осъществима. Присъствието на дебъг данни предоставя възможност да се възпроизвеждат оригиналните имена на променливите и на структурите, дори и номерацията на редовете. Код без такива метаданни и дебъг данни е много по-труден за декомпилиране.
 
=== Етапи на Декомпилация ===
Декомпилаторите могат да се разглеждат като поредица от етапи, всеки от които допринася специфични аспекти на цялостния процес на декомпилация.
 
==== Зареждане ====
Първата етап зарежда машинния код или междинния език на програмата. Би трябвало да открие основни факти за зададената програма като архитектурата (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++ ====