Можно ли узнать на каком языке написано exe файлов?

У меня есть exe-файл, и я декомпилировал его с Ida. Мне сказали, что программа закодирована на Delphi, поэтому я попытался декомпилировать с DeDe, но это не удалось, без вывода и без ошибок. И мне интересно, можно ли найти язык, используемый при создании exe, попробовав разные декомпиляторы, написанные специально для языка программирования? Или они могут потерпеть неудачу по другой причине?

2 ответов


во многих случаях это is можно определить компилятор, используемый для компиляции кода, и из этого, исходный язык.

большинство языковых реализаций включают в себя некоторую библиотеку времени выполнения для реализации различных операций высокого уровня языка. Например, C имеет CRT, который реализует операции ввода-вывода файлов (fopen, fread etc.), Delphi имеет помощников компилятора для своего string тип (конкатенация, назначение и другие), ада имеет различный низкоуровневый функции для обеспечения безопасности языка и так далее. Сравнивая код программы и библиотеки времени выполнения компиляторов-кандидатов, вы можете найти совпадение.

IDA реализует этот подход в флирт технологии. Используя подписи, IDA может определить большинство основных компиляторов для DOS и Windows. Это несколько сложнее в Linux, потому что для него нет единого поставщика двоичных файлов компилятора, поэтому подписи должны быть сделаны для каждого дистрибутива.

однако, даже не прибегая к коду библиотеки времени выполнения, можно определить используемый компилятор. Многие компиляторы используют очень разные идиомы для представления различных операций. Например, I смог угадать что компилятор, используемый для вируса Duqu, был Visual C++, который был позже подтвердил.


компиляция-это процесс с потерями, поэтому декомпилировать исполняемый файл (или другой скомпилированный программный модуль, например .so или .dll) и восстановить исходный код на исходном языке или даже однозначно определить, что такое исходный язык. Даже не обязательно, что существует только один исходный язык исходного кода, поскольку возможно, что до связывания различные модули были написаны на разных языках. Обычно, вы можете, разборки двоичный и восстановить язык сборки, хотя это может иметь очень ограниченное значение.

во многих случаях, вы can рассказать что-нибудь о языке оригинала при условии, что двоичный файл не был лишен (символов). Например, вы обычно можете сказать, был ли двоичный файл первоначально написан в C++, глядя на символы в двоичном файле (в Linux, используя objdump, не знаю, какой эквивалент может быть в Windows): C++ символы искажены определенным образом. Это не 100% гарантия, но высокая вероятность.

тем не менее, некоторые декомпиляторы выполняют довольно разумную работу очень сложной задачи. Вывод вероятных конструкций высокого уровня из двоичного файла непросто. В моем (очень ограниченном) опыте они, как правило, работают для довольно тривиальных программ или для программного обеспечения, скомпилированного с узким диапазоном версий исходного компилятора, но задыхаются от чего-либо существенного: это очень сложно для автор декомпилятора, чтобы идти в ногу с изменениями в компиляторах, и может быть очень мало стимулов для нее сделать это.

даже в тех случаях, когда декомпиляция очень успешна, результатом является по существу полностью незафиксированный код с бессмысленными именами переменных, который чрезвычайно трудно понять. Декомпиляция-это одно, извлечение предполагаемого смыслового значения из результата-другое. Помните, что многие переменные, ветви, циклы и функции будут полностью оптимизирован, многие функции уже встроены, и т. д. Таким образом," исходный код", даже если вы можете получить его таким образом, может быть не очень полезен для вас.