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

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

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

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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