Слайд 2Декомпиля́тор — это программа, транслирующая исполняемый модуль (полученный на выходе компилятора) в
эквивалентный исходный код на языке программирования высокого уровня.
Слайд 3Удачность декомпиляции зависит от объема информации, представленной в декомпилируемом коде. Байт-код,
используемый большинством виртуальных машин (таких как Java Virtual Machine или .NET Framework Common Language Runtime) часто содержит обширные метаданные, делающие декомпиляцию вполне выполнимой, в то время как машинный код более скуден и сложен в декомпиляции. В частности трудночитаемыми представляются вызовы подпрограмм или функций с косвенной адресацией вызовов (в терминах языков программирования высокого уровня — вызовы через указатели на функции/процедуры).
Слайд 4Если известно на каком языке была написана декомпилируемая программа, то в
первую очередь дизассемблируются и анализируются библиотеки времени исполнения (RTL — runtime library) компилятора с этого языка, так как в основном компиляция программы сводится к вызовам с различными параметрами процедур из этих библиотек. Кроме того, многие компиляторы позволяют увидеть, в какой ассемблерный код превращаются операторы программы после компиляции. Эти конструкции становятся шаблонами для декомпилятора, поэтому процесс декомпиляции в некотором смысле похож на распознавание в машинном коде конечного набора подобных шаблонов. Легче всего распознаются вызовы процедур и возвраты из них. Они служат границами для восстановления операторов процедуры.
Некоторые компиляторы и инструменты используемые после компиляции подвергают программный код обфускации с целью затруднить декомпиляцию.
Слайд 5Примеры декомпиляторов
FernFlower
.NET Reflector, dotPeek — для декомпиляции сборок .NET
ILSpy
Delphi Decompiler
JAD — JAva Decompiler
В
СССР декомпиляторы с языков PL/M-80 и Фортран-80 разрабатывались Н. А. Надольским в лаборатории Э. М. Пройдакова в ИПУ АН (1983—1984 гг).
Слайд 6Декомпиляция EXE-файлов
Декомпиляция подразумевает воссоздание исходного кода программы на том языке, на
котором она была написана. Иными словами, это процесс обратный процессу компиляции, когда исходный текст преобразуется в машинные инструкции. Декомпиляцию можно провести, используя специализированный софт.
Слайд 7Для чего нужна декомпиляция exe файлов в программирование?
- взлом коммерческих программ
- исследование работы программы (реверс-инжиниринг). Например, есть мессенджер Skype. Протокол его взаимодействия с сервером не опубликован. А мы хотим создать свой мессенджер, который может работать в сети Skype. Или хотим сделать чит к игре. - поиск уязвимостей в программе, исходный код которой недоступен
Слайд 8Способы декомпиляции EXE-файлов
Декомпиляция может быть полезной автору ПО, который потерял исходные
коды, или просто пользователям, желающим узнать свойства той или иной программы. Для этого существуют специальные программы-декомпиляторы.
Слайд 9Один из величайших декомпиляторов, который сейчас находится здесь, - это, безусловно,
Hex-Rays
Его автор, Илфак Гильфанов, произнес речь о внутренней работе своего декомпилятора при некотором конфликте.
Слайд 10В чем разница между дизассемблером и декомпилятором?
Когда у вас есть двоичная
программа (исполняемый файл, библиотека DLL,...), она состоит из инструкций процессора. Язык этих инструкций называется сборкой (или сборщиком). В двоичном коде эти команды кодируются двоично, поэтому процессор может их напрямую выполнять. Дисассемблер принимает этот двоичный код и переводит его в текстовое представление. Этот перевод обычно 1 к 1, то есть одна команда показана как одна строка текста. Эта задача сложна, но проста, программа просто должна знать все разные инструкции и как они представлены в двоичном формате.
Слайд 11С другой стороны, декомпилятор выполняет гораздо более сложную задачу. Он принимает
либо двоичный код, либо вывод дизассемблера (который в основном тот же, что и 1-к-1), и создает высокоуровневый код.