Есть ли способ сказать, какой язык использовался для программы?

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

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

Существуют ли какие-либо инструменты для этого?

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


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

Ответы

Ответ 1

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

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

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

Приложения, скомпилированные с .Net, обнаружить не сложно. В последних версиях Delphi есть функция IsAssembly, или вы можете сделать небольшую spelunking в PE-заголовке. Проверьте функцию IsManaged в IsDelphi.

Говорить, какой язык .Net использовался, сложнее. По умолчанию VB.Net включает ссылку на Microsoft.VisualBasic, а приложения VCL.Net включают специфические ссылки Borland. Тем не менее, VCL.Net не работает в пользу Delphi Prism, и вы можете добавить ссылку на сборку VB на любой управляемый язык.

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

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

Ответ 2

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

Например:

  • TFormXX, TEditYY, TPanelZZZ для приложений delphi
  • WindowsForms10.XXXX.yyy для приложений .NET
  • wxWindowsXXX для приложений wxWindows
  • AfxWndXX для приложений MFC/VС++ (я думаю)

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

Ответ 3

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

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

Ответ 4

Хороший disassembler, плюс, конечно, отличное понимание базовой архитектуры процессора, часто может помочь вам идентифицировать библиотеки времени выполнения, которые находятся в игре. Если exe не был тщательно "лишен" символов и/или замаскирован иным образом, имена символов, отображаемых в библиотеках времени выполнения, часто будут давать вам подсказки на языке программирования, поскольку стандарты разных языков определяют разные имена, а поставщики компиляторов и сопровождающие их библиотеки времени выполнения обычно очень внимательно относятся к этим стандартам.

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

Ответ 5

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

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

Ответ 6

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

Отражает ли отражатель как сборку .NET? Тогда это MSIL, на 99% - VB или С#, но вы, вероятно, никогда не узнаете, что и не имеет значения.

Нужен ли он intrepreter (например, Java?)? Тогда это Java (или что-то другое, что интерпретатор).

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

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

Требуется ли в Delphi dll? Поздравляем, Дельфи.

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

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

Ответ 7

IDA Pro Free (http://www.hex-rays.com/idapro/idadownfreeware.htm) может оказаться полезным. Даже если вы не понимаете язык ассемблера, если вы загружаете EXE в IDA Pro, тогда его исходный результат выполнения (если есть какие-либо контрольные признаки) включает в себя его наилучшее предположение о том, какой компилятор был использован.

Ответ 8

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

Ответ 9

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

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

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

Ответ 10

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

Ответ 11

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