Есть ли способ сказать, какой язык использовался для программы?
У меня есть программа для ПК, которую я загрузил и установил. Он запускается из файла .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, также может сказать вам, какой был используемый упаковщик (если есть).