Краткий ответ: ДА
Длинный ответ:
Если вы посмотрите на двоичный файл, вы можете найти имена библиотек, с которыми были связаны ссылки. Открытие cmd.exe в TextPad легко находит следующее с шестнадцатеричным смещением 0x270: msvcrt.dll, KERNEL32.dll, NTDLL.DLL , USER32.dll и т. Д. Msvcrt - это функции поддержки времени выполнения Microsoft C. KERNEL32, NTDLL и USER32.dll - это библиотеки для конкретных ОС, которые сообщают вам либо целевую платформу, либо платформу, на которой она была построена, в зависимости от того, насколько хорошо среда кросс-платформенной разработки разделяет их.
Если оставить в стороне эти ключи, большинству любого компилятора c / c ++ придется вставлять имена функций в двоичный файл, в таблице есть список всех функций (или точек входа), хранящихся в таблице. C ++ «искажает» имена функций для кодирования аргументов и их типов для поддержки перегруженных методов. Можно запутать имена функций, но они все еще будут существовать. Сигнатуры функций будут включать количество и типы аргументов, которые можно использовать для отслеживания системных или внутренних вызовов, используемых в программе. По смещению 0x4190 "SetThreadUILanguage", который можно искать, чтобы узнать много нового о среде разработки . Я нашел таблицу точек входа со смещением 0x1ED8A. Я мог легко увидеть имена, такие как printf, exit и scanf; вместе с __p__fmode, __p__commode и __initenv
Любой исполняемый файл для процессора x86 будет иметь сегмент данных, который будет содержать любой статический текст, который был включен в программу. Назад к cmd.exe (смещение 0x42C8) находится текст "S.o.f.t.w.a.r.e..P.o.l.i.c.i.e.s..M.i.c.r.o.s.o.f.t..W.i.n.d.o.w.s..S.y.s.t.e.m.". Строка занимает вдвое больше символов, чем обычно необходимо, потому что она была сохранена с использованием символов двойной ширины, вероятно, для интернационализации. Коды ошибок или сообщения являются основным источником здесь.
По смещению B1B0 - "p.u.s.h.d", за которым следуют mkdir, rmdir, chdir, md, rd и cd; Я оставил непечатные символы для удобства чтения. Это все аргументы команды для cmd.exe.
Для других программ мне иногда удавалось найти путь, по которому программа была скомпилирована.
Итак, да , можно определить исходный язык из двоичного файла.