Как проще всего узнать, на каком языке программирования написано приложение? Я хотел бы знать, есть ли это vb или C++, delphi или .net и т. д. Из файла exe программы.





Попробуйте PEiD
конечно, если они использовали упаковщик, сначала нужно будет сделать распаковку :)
Он еще существует? Если да, то где взять (без зловреда sofstsonic)?
Сработало, и это забавно, что название этого приложения на португальском означает «ПУДЕТ» ...
PEiD v0.95 (2008.11.03) успешно загружен из указанного выше местоположения и работает под Windows 7 Pro 64. Однако PEiD сообщает Not a valid PE file для большинства, но не для всех файлов .exe и .dll в моей системе. Я предполагаю, что PEiD работает для старых двоичных файлов, но не актуален для новых.
У меня хорошо сработало :-)
Вы можете попробовать использовать Зависит от, чтобы узнать, какие у него зависимости во время выполнения, что может дать некоторые подсказки.
Запустите его и проверьте, какие библиотеки времени выполнения он использует с Process Explorer.
Если это не сразу становится очевидным, поищите в Интернете ссылки на эти библиотеки DLL.
Большинство дизассемблеров (включая, как мне кажется, Олли) могут легко показать вам текст, содержащийся в EXE или DLL, и это также иногда может дать подсказку. Типы Delphi часто имеют префикс T, как в TMyClass.
Если это небольшой исполняемый файл без ссылок на DLL и текста, возможно, вы SOL. На этом этапе вам нужно будет искать идиомы конкретных компиляторов, и это будет в основном догадки.
Самый простой способ - спросить разработчика программы. Не требует никаких знаний и служебных программ.
Я предполагаю, что если он ищет инструмент, чтобы обнаружить это, у него нет легкого доступа к разработчику.
Вроде бы глупый ответ, но на самом деле «хакеры» делают свою работу именно так. "Социальная инженерия" это называется ... +1
Скомпилированные языки (под этим я имею в виду отсутствие языков сценариев или Java, .NET и т. д.) Компилируются в инструкции сборки ЦП, что по сути является односторонним преобразованием. Обычно невозможно определить, на каком языке была написана программа. Однако, используя обходчик зависимостей, вы потенциально можете определить, какую библиотеку времени выполнения загружала программа (если таковая имеется) и, следовательно, определить, какой язык она использовала (например, MS Visual C++ 9 использует msvcr90.dll).
Хотя вы всегда можете ссылаться на более старую версию CRT.
Полагаю, что так. Однако вы бы знали, что это был VC++.
вы можете проверить, является ли сборка .net или нет, попытавшись открыть с помощью инструмента ildasm.exe
Но что насчет разных языков в .Net.
феникс - никак не определить. После компиляции C# и VB.NET взаимозаменяемы.
да, это невозможно определить, потому что все языки .net компилируют код на один и тот же язык IL.
Я думаю, что VB оставляет некоторые странные вещи в своих исполняемых файлах IL. Вещи, о которых C# и другие языки IL не беспокоятся, потому что VB странный.
взаимозаменяемые, но НЕ идентичные. Например, VB реализует C# "?" как вызов функции Iif (). VB включает Microsoft.VisualBasic для многих вещей.
В общем, нельзя.
Если вы можете загрузить его в Отражатель, вы знаете, что это управляемая сборка.
Это хороший вопрос. Нет никакого общего способа сказать, но я уверен, что большинство компиляторов и библиотек оставляют отметку в полученном EXE-файле. Если вы хотите потратить на это много времени, вы можете собрать кучу EXE, написанных на известных языках, и сканировать общие строки. Я думаю, ты найдешь их.
Dependancy Walker, о котором упоминал кто-то другой, может быть хорошим способом поиска явных зависимостей, таких как версии MSVCRT и т. д.
Если я правильно помню, Дизассемблер PE Explorer дает некоторую информацию о компиляторе, который создает данные не .net и java двоичные файлы, для .net используйте инструмент Отражатель или ILDAsm
Я бы попробовал запустить .exe через программу "строк", чтобы получить различные подсказки.
Есть искусство определять, на каком языке написана программа. Это возможно, но нет жестких правил. Это требует большого опыта (и это также приводит к вопросу «Зачем вам…», но вот несколько идей, как это сделать.
Вы ищете "подпись". Подпись может быть определенной строкой, включенной компилятором, ссылкой на API, который довольно часто используется в используемом инструменте программирования, или даже стилем программирования, который является общим для используемых инструментов, видимым в содержащихся строках. в приложении.
Кроме того, существуют стили развертывания приложения: различные файлы конфигурации, находящиеся в каталоге развертывания, библиотеки DLL и сборки и даже изображения, каталоги или значки.
Приложения Java, заключенные в самозапускающийся исполняемый файл, будут содержать ссылки на библиотеки java и, вероятно, будут иметь определенные библиотеки или файлы, включенные в тот же каталог, что указывает на то, что это java.
Как указано в других ответах, управляемая сборка также будет показывать определенные признаки: вы можете открыть ее в Reflector и т. д. Хотя верно, что C# и VB "взаимозаменяемы" после компиляции, неверно, что они идентичны. Если вы используете Отражатель для дизассемблирования кода VB, вы довольно часто увидите, что сборка ссылается на сборку Microsoft.VisualBasic.dll. Вы сможете увидеть разницу между приложениями Мононуклеоз, потому что они, скорее всего, будут содержать ссылки на моно-сборки.
Многие компиляторы собирают и связывают код определенным образом и оставляют следы. Например, исследуя исполняемый файл окна с помощью вкладки «strings:» в Обозреватель процессов, вы увидите множество строк. Используя их, вы сможете определить стили программирования, вызываемые методы, методы ошибок или трассировки внутри исполняемого файла.
Примером может служить то, что компиляторы используют разные механизмы для локализации: Microsoft хранит локализованные строки в файлах XML или файлах ресурсов. Другие компиляторы будут использовать другую тактику.
Другой пример - C++ искажение имени. Компилятор CodeWarrior использует другой алгоритм для изменения имен переменных-членов и функций вызова, чем Visual Studio.
Я полагаю, вы могли бы написать книгу на тему точного определения происхождения любого исполняемого файла. Этот предмет, вероятно, можно было бы назвать «археология программирования».
Голосов против без комментариев? Есть ли конструктивные отзывы у кого-либо из противников?
Касательно "археологии программирования", теперь существует формальная наука под названием Программная археология (я не говорю об этом бойко).
Это невероятно круто.
Самый простой способ, который я нашел (по крайней мере, в компьютерных играх), - это заглянуть в папку «redist», вложенную в основную папку игры. Для некоторых из вас, кто более опытен в программировании, это может быть очевидно, но конкретная цель MSI в этой папке - позволить файлу setup.exe автоматически устанавливать необходимые компоненты для самой игры. Например: В Empire Total War есть MSI под названием «vcredist_x86-sp1.exe». Это указывает на то, что игра / программа была написана в Microsoft "Visual C 2005" в .NET Framework (обычно). Фактически, если вы откроете MSI / EXE, установщик должен сразу указать язык, на котором он написан, и версию. Причина, по которой я знаком, заключается в том, что я кодирую на C# и VB в .NET Framework, и мы автоматически устанавливаем необходимые компоненты для нашего бизнес-приложения. Надеюсь это поможет!
Я помню, 5 лет назад я обнаружил вызов API, который требует дескриптора окна и возвращает имя класса окна. Я заметил, что если программа написана на VB, имени класса любого объекта должно предшествовать «гром». Если он написан на Delphi, имя класса обычно имеет букву «T». Я не уверен, так ли это до сих пор.