Декомпилатор

от Уикипедия, свободната енциклопедия
Направо към: навигация, търсене

Декомпилаторът е компютърна програма, която изпълнява обратната операция на тази на компилатора.

Това е превеждането на програмен код от относително ниско ниво на абстракция (често проектиран да бъде четен от компютри, а не от хора) във форма, която има по-голямо ниво на абстракция (проектирана за четенето от хора). Декомпилаторите обикновено не реконструират перфектно оригиналния сорс код. Декомпилаторите са важен инструмент в софтуерното обратно инженерство.

Как работи?[редактиране | edit source]

Декомпилация е действието от използването на декомпилатор, но може да се има в предвид и самия резултат от декомпилатора. Успехът на декомпилацията зависи от количеството информация, предоставено от кода, който се декомпилира и начина, по който се анализира от декомпилатора. Биткод формат използван от много виртуални машини (като Java Virtual Machine и от .NET Framework Common Language Runtime) често съдържат метаданни и функции на високо ниво, които правят декомпилацията лесно осъществима. Присъствието на дебъг данни предоставя възможност да се възпроизвеждат оригиналните имена на променливите и на структурите, дори и номерацията на редовете. Код без такива метаданни и дебъг данни е много по-труден за декомпилиране.

Етапи на декомпилация[редактиране | edit source]

Декомпилаторите могат да се разглеждат като поредица от етапи, всеки от които допринася специфични аспекти на цялостния процес на декомпилация.

Зареждане[редактиране | edit source]

Първата етап зарежда машинния код или междинния език на програмата. Би трябвало да открие основни факти за зададената програма като архитектурата (Pentium, PowerPC, и други) и входната точка.

Преобразуване[редактиране | edit source]

Следващия етап е преобразуването на инструкциите от машинния код в машинно независимо междинно представяне(IR).

Идиоми[редактиране | edit source]

Идиоматични поредици от машинен код са поредици код, чиято комбинирана семантика не е непосредствено очевидна от инструкциите на индивидуалните семантики. Или като част от преобразуването, или като част от по-късни анализи, тези идиоматични поредици трябва да бъдат преведени в IR.

Анализ на програма[редактиране | edit source]

Различни анализи на програма могат да се прилага на IR. По-специално изразно събиране комбинира семантиките на няколко инструкции в по-сложен израз. Резултатът е повече като език на високо ниво.

Анализ на потока данни[редактиране | edit source]

Местата, където различните регистри се дефинират и използват, трябва да бъдат проследени с анализ на потокът данни. Същия анализ трябва да бъде приложен на места, които се използват за временни и локални данни. Различни имена могат да се формират за всеки свързан набор от стойностни дефиниции и употреби. Възможно е едно и също място в паметта да се използва за повече от една променлива в различни части от програмата. Анализът може да покаже дори ако определена променлива се използва за две различни цели, но тази логика да е имплементирана от компилатора, а не от разработчика.

Анализ на типове[редактиране | edit source]

Добър декомпилатор ще изпълнява такъв анализ. Чрез наблюдение на записването в паметта, декомпилаторът понякога може да разбере типът данни, който се записва.

Структуриране[редактиране | edit source]

Предпоследния етап включва структуриране на IR в конструкции от високо ниво като while цикли и if/then/else условни конструкции.

Генерация на код[редактиране | edit source]

Последния етап е генерирането на код от високо ниво в back end-а на декомпилатора. Декомпилатора може да има опция да предостави този код в други езици от високо ниво.

Основни инструменти[редактиране | edit source]

Декомпилатор за C#[редактиране | edit source]

.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[редактиране | edit source]

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++[редактиране | edit source]

Boomerang e декомпилатор с GPL лиценз, който позволява превод от двоичен код до език близък до С. Boomerang използва Static Single Assignment Form за репрезентация на кода.

Криейтив Комънс - Признание - Споделяне на споделеното Лиценз за свободна документация на ГНУ Тази страница частично или изцяло представлява превод на страницата „Decompiler“ в Уикипедия на английски. Оригиналният текст, както и този превод, са защитени от Лиценза „Криейтив Комънс - Признание - Споделяне на споделеното“, а за съдържание, създадено преди юни 2009 година — от Лиценза за свободна документация на ГНУ. Прегледайте историята на редакциите на оригиналната страница, както и на преводната страница, за да видите списъка на съавторите.  
Криейтив Комънс - Признание - Споделяне на споделеното Лиценз за свободна документация на ГНУ Тази страница частично или изцяло представлява превод на страницата „Java Decompiler“ в Уикипедия на английски. Оригиналният текст, както и този превод, са защитени от Лиценза „Криейтив Комънс - Признание - Споделяне на споделеното“, а за съдържание, създадено преди юни 2009 година — от Лиценза за свободна документация на ГНУ. Прегледайте историята на редакциите на оригиналната страница, както и на преводната страница, за да видите списъка на съавторите.  
Криейтив Комънс - Признание - Споделяне на споделеното Лиценз за свободна документация на ГНУ Тази страница частично или изцяло представлява превод на страницата „.NET Reflector“ в Уикипедия на английски. Оригиналният текст, както и този превод, са защитени от Лиценза „Криейтив Комънс - Признание - Споделяне на споделеното“, а за съдържание, създадено преди юни 2009 година — от Лиценза за свободна документация на ГНУ. Прегледайте историята на редакциите на оригиналната страница, както и на преводната страница, за да видите списъка на съавторите.  
Криейтив Комънс - Признание - Споделяне на споделеното Лиценз за свободна документация на ГНУ Тази страница частично или изцяло представлява превод на страницата „Boomerang(decompiler)“ в Уикипедия на английски. Оригиналният текст, както и този превод, са защитени от Лиценза „Криейтив Комънс - Признание - Споделяне на споделеното“, а за съдържание, създадено преди юни 2009 година — от Лиценза за свободна документация на ГНУ. Прегледайте историята на редакциите на оригиналната страница, както и на преводната страница, за да видите списъка на съавторите.