Декомпилатор: Разлика между версии
Изтрито е съдържание Добавено е съдържание
+ без източници и обработка |
Редакция без резюме |
||
Ред 1:
{{без източници}}
{{обработка|форматиране}}
== Какво е това? ==
Декомпилатор е [[компютърна програма]], която изпълнява обратната операция на тази на [[компилатор]]. Това е превеждането на програмен код от относително ниско ниво на абстракция (често проектиран да бъде четен от компютри, а не от хора) във форма, която има по-голямо ниво на абстракция (проектирана за четенето от хора). Декомпилаторите обикновено не реконструират перфектно оригиналния [[сорс код]]. Декомпилаторите са важен инструмент в софтуерното обратно инженерство.
== Как работи? ==
Декомпилация е действието от използването на декомпилатор, но може да се има в предвид и самия резултат от декомпилатора. Успехът на декомпилацията зависи от количеството информация, предоставено от кода, който се декомпилира и начина, по който се анализира от декомпилатора. Биткод формат използван от много виртуални машини (като [[Java Virtual Machine]] и от [[.NET Framework]] [[Common Language Runtime]]) често съдържат
метаданни и функции на високо ниво, които правят декомпилацията лесно осъществима. Присъствието на дебъг данни предоставя възможност да се възпроизвеждат оригиналните имена на променливите и на структурите, дори и номерацията на редовете. Код без такива метаданни и дебъг данни е много по-труден за декомпилиране.
Декомпилаторите могат да се разглеждат като поредица от етапи, всеки от които допринася специфични аспекти на цялостния процес на декомпилация.
Първата етап зарежда машинния код или междинния език на програмата. Би трябвало да открие основни факти за зададената програма като архитектурата (Pentium, PowerPC, и други) и входната точка.
Следващия етап е преобразуването на инструкциите от машинния код в машинно независимо междинно представяне(IR).
Идиоматични поредици от машинен код са поредици код, чиято комбинирана семантика не е непосредствено очевидна от инструкциите на индивидуалните семантики.
Или като част от преобразуването, или като част от по-късни анализи, тези идиоматични поредици трябва да бъдат преведени в IR.
Различни анализи на програма могат да се прилага на IR. По-специално изразно събиране комбинира семантиките на няколко инструкции в по-сложен израз. Резултатът е повече като език на високо ниво.
Местата, където различните регистри се дефинират и използват, трябва да бъдат проследени с анализ на потокът данни. Същия анализ трябва да бъде приложен на места, които се използват за временни и локални данни. Различни имена могат да се формират за всеки свързан набор от стойностни дефиниции и употреби. Възможно е едно и също място в паметта да се използва за повече от една променлива в различни части от програмата. Анализът може да покаже дори ако определена променлива се използва за две различни цели, но тази логика да е имплементирана от компилатора, а не от разработчика.
Добър декомпилатор ще изпълнява такъв анализ. Чрез наблюдение на записването в паметта, декомпилаторът понякога може да разбере типът данни, който се записва.
Предпоследния етап включва структуриране на IR в конструкции от високо ниво като while цикли и if/then/else условни конструкции.
Последния етап е генерирането на код от високо ниво в back end-а на декомпилатора. Декомпилатора може да има опция да предостави този код в други езици от високо ниво.
== Основни инструменти ==
.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 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).
|