Определение того, какой компилятор создал Win32 PE

Как определить, какой компилятор C или C++ использовался для сборки конкретного исполняемого файла Windows или библиотеки DLL? Некоторые компиляторы оставляют строки версии в конечном исполняемом файле, но в Windows это происходит реже, чем в Linux.

В частности, меня интересует различение Visual C++ и различных компиляторов MinGW (обычно довольно просто по сигнатурам функций), а затем между версиями Visual C++ (6, 2002/2003, 2005, 2008; сделать это сложнее). Есть ли инструмент, который может провести различие полунадежным способом?


person kquinn    schedule 18.04.2009    source источник
comment
Что заставляет вас нуждаться в этой информации?   -  person ojblass    schedule 19.04.2009
comment
Во-первых, интересно, какая версия VS использовалась для сборки некоторых двоичных файлов, которые у нас есть. (Я думал пересобрать их с более новой версией VS для почти бесплатного повышения производительности.) Я нашел кого-то, кто знает ответ для этих конкретных двоичных файлов, но мне любопытно, можно ли это сделать в целом.   -  person kquinn    schedule 19.04.2009
comment
Разве ответ в этом случае не состоит в том, чтобы просто перестроить с использованием новейшего компилятора в любом случае? Либо вы перекомпилируете с использованием того же компилятора, не внося изменений, либо в конечном итоге используете более новый компилятор, дающий вам упомянутые вами преимущества.   -  person jalf    schedule 19.04.2009
comment
Конечно, вы можете это сделать. Но 1. вы, вероятно, тратите часть своих усилий впустую, и (что более важно) 2. это не успокаивает мое любопытство :)   -  person kquinn    schedule 19.04.2009


Ответы (3)


Одним из источников подсказки, позволяющей различать версии VC, является связанная конкретная библиотека времени выполнения C. Поскольку по умолчанию (по крайней мере, в современных версиях) используется ссылка на DLL, это довольно легко сделать. Утилита Dependency Walker почти незаменима для проверки того, что вы знаете, какие библиотеки DLL действительно загружаются, и она сообщит вам об этом. какая DLL среды выполнения C используется. Хотя Dependency Walker включен в Microsoft Platform SDK, он был расширен независимо, и сайт, на который я дал ссылку, является домом для его текущей разработки.

VC6 и MinGW по умолчанию ссылаются на MSVCRT.DLL, поэтому их нельзя различать. Приложив некоторые усилия, MinGW можно также связать с более поздними версиями среды выполнения C, поэтому вам нужно будет самостоятельно исключить MinGW.

Runtime       VC Version
----------    -------------
MSVCRT.DLL    VC6
MSCVR80.DLL   VC8 (VS 2005)
MSCVR90.DLL   VC9 (VS 2008)

Другие библиотеки DLL времени выполнения также будут хорошими подсказками, например. ссылки на среду выполнения Delphi, вероятно, указывают на то, что EXE на самом деле был создан из Delphi, а вовсе не из цепочки инструментов C.

Если символы не были удалены из файла .EXE, вы можете найти некоторые подсказки, из которых присутствуют внутренние символы. Например, ссылка на что-то вроде _sjlj_init, вероятно, указывает на то, что в какой-то момент был задействован MinGW GCC 3.x, настроенный для обработки исключений setjmp/longjmp.

person RBerteig    schedule 18.04.2009
comment
Что ж, ваш список версий более полный... ;-) - person RBerteig; 19.04.2009
comment
А, MSVCRT.DLL без номера - это VC6... это объясняет несколько вещей. Спасибо за ссылку на Dependency Walker, она выглядит очень полезной. Я хотел бы разделить принятые баллы за ответы между вами тремя, но я решил отдать их парню с 1 повторением. - person kquinn; 19.04.2009
comment
Зависимости — это современная замена Dependency Walker: github.com/lucasg/Dependencies. - person thomasa88; 01.07.2021

Другой вариант — проверить, на какую библиотеку CRT ссылается dll, используя depends.exe
MinGW и Cygwin имеют их собственные библиотеки DLL, которые вполне очевидны для распознавания.
VC6 обычно использует MSVCRT.dll
любая более новая версия VS имеет свою версию рядом с именем файла DLL:
MSVCR90.dll - VS2008
MSVCR80. dll — VS2005
MSVCR71.dll — VS2003
MSVCR70.dll — VS2002

Не принимайте этот список как окончательное руководство, поскольку эти имена часто имеют странные вариации, особенно в области VS2002-2003. Существуют также другие библиотеки DLL, такие как библиотеки MFC и ATL, которые имеют аналогичную схему управления версиями.

Это будет работать до тех пор, пока PE действительно зависит от CRT и не связывается с ним статически.

Я думаю, что Delphi также имеет некоторые ссылки на DLL, но я не совсем уверен, что это такое.

person shoosh    schedule 18.04.2009

Часть анализа, которую выполняет IDA-Pro, содержит некоторое распознавание компилятором. После того, как вы откроете PE для анализа, посмотрите выходной журнал. обычно его где-то там закапывают.

person shoosh    schedule 18.04.2009
comment
Да, сейчас я использую IDA Pro 5.1. Однако его анализ очень нечеткий; для чего-то, что я знаю, было скомпилировано с VC6, там написано Использование подписи FLIRT: среда выполнения Microsoft VisualC 2-8/net. - person kquinn; 19.04.2009