Можно ли узнать на каком языке изначально был написан исходный файл

Обновлено: 05.07.2024

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

2 ответа

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

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

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

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

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

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

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

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

Похожие вопросы:

Интересно, на каком языке написан Chromium OS. Я предполагаю, что они использовали C/C++, но они поставили что-то другое (Go)? Использовали ли они Assembly для низкоуровневого кода, поскольку я.

Интересно, может ли кто-нибудь подсказать мне, на каком языке я могу скомпилировать файл exe, который является независимым, как NSIS, но более мощным. что-то, что я могу запустить на Win XP+ без.

Если мне прислали произвольный файл, используя Node.js , как я могу выяснить, на каком языке он написан? Это может быть файл PHP, HTML, HTML с JavaScript inline, JavaScript, C++ и так далее.

На каком языке Android Display Server SurfaceFlinger написан? Java или C. Каковы некоторые основные различия между SurfaceFlinger и X11 или Wayland с точки зрения драйверов, на каком языке они.

Я долго пытался найти, на каком языке написан этот файл, чтобы я мог его декомпилировать. Я пытался декомпилировать как .luac, .class, а также пытался открыть его как .jar, .rar и. zip. Хотя.

Вот что я думаю, что знаю (пожалуйста, поправьте меня, если я ошибаюсь): configure.ac --- macros Makefile.am - - - определения переменных настройка - - - shell скрипт Makefile - - - собственный.

По соглашению, на каком языке или синтаксисе написан файл .env ? Это сценарий sh , сценарий bash , сценарий JavaScript, или это урезанный синтаксис без излишеств, вдохновленный синтаксисом sh ? Все.

У меня есть настольная программа, которую я скачал и установил. Он запускается из файла .exe.

Есть ли какой-нибудь способ узнать из файла .exe, какой язык программирования использовался для написания программы?

Есть ли какие-нибудь инструменты, чтобы помочь с этим?

Какие языки можно определить, а какие нет?

Хорошо, вот две вещи, которые я ищу:

Я понимаю ваше любопытство.

Вы можете определить приложения Delphi и C ++ Builder и их SKU, просмотрев несколько конкретных ресурсов, которые добавляет компоновщик. В частности, RC Data \ DVCLAL и RC DATA \ PACKAGEINFO. XN Resource Editor значительно упрощает эту задачу, но может подавиться сжатым EXE.

Компрессоры EXE немного усложняют дело. Они могут скрывать или шифровать содержимое ресурсов. Программы, сжатые с помощью UPX, легко идентифицировать с помощью HEX editor, потому что первые 2 раздела в заголовке PE имеют имена UPX0 и UPX1. Вы можете использовать приложение, чтобы распаковать их.

Я не смотрел некоторые приложения, которые используют сигнатуры для идентификации компилятора, поэтому не знаю, насколько хорошо они работают.

Надеюсь, это поможет.

Я использую WinDowse (небольшую бесплатную утилиту, написанную на Delphi) для шпионить за окнами программы . например, если вы посмотрите на Таблицу "Класс", вы можете обнаружить имя "Класс" элемента управления ..

Я считаю, что это самый быстрый (хотя и не самый точный ) способ найти информацию о приложениях.

Во-первых, посмотрите, какие библиотеки времени выполнения он загружает. Программа на C обычно не загружает библиотеку Visual Basic.

Также проверьте исполняемый файл на наличие контрольных строк. В большинстве исполняемых файлов это почти конец. Если программа использует строковые константы, это может указывать на то, как они хранятся.

Хороший дизассемблер, плюс, конечно, отличное понимание базовой архитектуры ЦП, часто могут помочь вам определить используемые библиотеки времени выполнения. Если исполняемый файл не был тщательно «лишен» символов и / или замаскирован иным образом, имена символов, видимые в библиотеках времени выполнения, часто будут давать вам подсказки на языке программирования, потому что стандарты разных языков определяют разные имена, а поставщики компиляторов и сопутствующих библиотеки времени выполнения обычно очень строго соблюдают эти стандарты.

Конечно, вы не добьетесь этого без знания различных возможных языков и их библиотечных стандартов - и если автор кода намеревался замаскировать информацию, им это тоже не сложно сделать.

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

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

Предполагая, что это приложение для Windows .

Нужен ли интпредставитель (например, Java?)? Тогда это Java (или другой интерпретатор.)

Проверьте, какие библиотеки DLL времени выполнения требуются.

Требуются ли DLL-библиотеки времени выполнения VB? Поздравляем, VB из VisualStudio 6.0 или более ранней версии.

Требуются ли для этого библиотеки Delphi? Поздравляю, Дельфи.

Вы зашли так далеко? C / C ++. Предположим, C ++, если он не требует msys или cygwin dll, и в этом случае C имеет вероятность 25%.

Поздравляем, это должно быть верным для подавляющего большинства программного обеспечения Windows. Это, вероятно, на самом деле вам не поможет, так как на всех этих языках можно сделать много одинаковых вещей.

please delete meplease delete me 3 Янв 2010 в 00:29

Начните с различных опций в dumpbin. Имена символов, если их не стереть, дадут вам всевозможные подсказки относительно того, C, C ++, CLR или что-то еще.

Другие инструменты используют сигнатуры для идентификации компилятора, используемого для создания исполняемого файла, например PEiD, CFF Explorer и другие.

Обычно они сканируют точку входа исполняемого файла по сравнению с подписью.

Обозреватель сигнатур из CFF Explorer может дать вам представление о том, как подпись построена.

Похоже, компоновщик VC ++ от V6 до добавляет подпись к заголовку PE, который вы можете проанализировать.

Я предлагаю PEiD (бесплатное программное обеспечение, с закрытым исходным кодом). Имеет все подписи Delphi для Win32, также может сказать вам, какой упаковщик использовался (если есть).

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

ОТВЕТЫ

Ответ 1

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

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

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

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

Ответ 2

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

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

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

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

спросил(а) 2010-03-11T00:18:00+03:00 11 лет, 8 месяцев назад

Я сталкивался с этой проблемой раньше. Я только что открыл файл .exe в блокноте. Я нашел имя и версию компилятора. Надеюсь, это поможет кому-то.

ответил(а) 2014-06-19T03:16:00+04:00 7 лет, 5 месяцев назад

Мне придется противоречить всем, кто заявляет что-либо в соответствии с "Компиляция языка высокого уровня в низкоуровневый .EXE, как правило, односторонний процесс". Поскольку не все исполняемые файлы скомпилированы для необработанной сборки.

Если файл был скомпилирован непосредственно в raw-сборку, обычно в описании синтаксиса/структуры обычно указывается исходный язык. Хотя это скорее побочный продукт компилятора, а затем сам язык.

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

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

ответил(а) 2010-03-11T00:31:00+03:00 11 лет, 8 месяцев назад

У меня есть .exe файл, и мне нужно знать, на каком языке была разработана программа.


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

А также есть трюк для просмотра кода (на основе этого .exe файла)?


Читайте также: