2009-04-18 4 views
10

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

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

+1

Что заставляет вас нуждаться в этой информации? – ojblass

+0

Сначала, задаваясь вопросом, какая версия VS использовалась для создания некоторых из двоичных файлов, которые мы имеем здесь. (Я думал о перестройке их с более новой версией VS для почти бесплатного повышения производительности.) Я нашел того, кто знает ответ для этих конкретных двоичных файлов, но мне любопытно, можно ли вообще это сделать. – kquinn

+0

Разве это не ответ в этом случае, просто чтобы перестроить с помощью новейшего компилятора в любом случае? Либо вы перекомпилируете, используя один и тот же компилятор, не внося никаких изменений, или вы в конечном итоге используете новый компилятор, предоставляя вам преимущества, о которых вы упоминали. – jalf

ответ

1

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

+0

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

11

Один источник намека на различие между версиями VC - это связанная с ним библиотека времени выполнения. Поскольку по умолчанию используется (по крайней мере, в современных версиях) ссылка на 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 в режиме runtime также будут полезными. ссылки на время выполнения Delphi, вероятно, указывают на то, что EXE был фактически построен из Delphi, а не для инструментальной цепочки C вообще.

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

+0

dang! избили меня! – shoosh

+0

Ну, ваш список версий * более полный ... ;-) – RBerteig

+0

Ах, MSVCRT.DLL без номера на нем VC6 ... это объясняет несколько вещей. Спасибо за ссылку на Dependency Walker, она выглядит очень полезной. Хотелось бы, чтобы я расколол принятые точки ответа между вами, но я решил дать их парню с 1 реп. – kquinn

2

Другой вариант - проверить, какая библиотека библиотеки 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 на самом деле зависит от ЭЛТ и не связывается с ним статически.

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

 Смежные вопросы

  • Нет связанных вопросов^_^