2013-09-03 6 views
12

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

ответ

10

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

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

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

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

5

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

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

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

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

+0

Конечно, я не ожидаю открытого исходного кода :) Но программы так развиты, и они могут показать код сборки более удобным для пользователя способом, поэтому проще просто сменить простые программы. Спасибо в любом случае – Kuzgun

+0

Вы можете использовать 'objdump' в Windows тоже через MingW или Cygwin. Они установлены в пакете 'binutils'. – adam

Смежные вопросы