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

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

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

3 ответа

Одним из источников подсказки для различия между версиями VC является связанная библиотека времени выполнения C. Поскольку по умолчанию (по крайней мере в современных версиях) используется ссылка на DLL, это довольно легко сделать. Утилита Dependency Walker практически необходима для проверки того, что вы знаете, какие 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.

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

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

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

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

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

Другие вопросы по тегам