Как программно получить версию компилятора VC из PE-файла?

CFF Explorer может определить версию компилятора VC из PE-файла. он показывает "Microsoft Visual C++ 8" для моего exe-файла, который статически связан с libCMT(без зависимости dll).

Как это сделать? Он должен отвечать на какую-то структуру в PE-файле, которая мне неизвестна.

ОБНОВИТЬ:

  1. CFF Explorer может получить правильную версию компилятора VC для статически связанного PE-файла (нет зависимости DLL от msvcmXX.dll, msvcpXX.dll или msvcrXX.dll)
  2. Даже если я очистил поля LinkerVersion / ImageVersion / SubsytstemVersion / OperratingSystemVersion в необязательном заголовке PE до ZERO, проводник CFF по-прежнему может знать правильную версию компилятора VC.

Кажется, что CFF Explorer использует надежный способ определения версии компилятора VC.

1 ответ

Решение

Заголовок PE имеет некоторую информацию о компоновщике (или компиляторе). Проверять, выписываться:

http://wiki.osdev.org/PE

а также:

http://mirror.sweon.net/madchat/vxdevl/papers/winsys/pefile/pefile.htm

Волшебное слово в заголовке PE может быть ключом к вашему ответу.

редактировать:

Кажется, CFF Explorer опирается на кодовую подпись. Я нашел интересный пост здесь:

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

В ответе RBerteig внутренние символы могут использоваться для определения компилятора.

http://www.codeproject.com/Articles/24417/Portable-Executable-P-E-Code-Injection-Injecting-a

Начиная с этого поста, адрес _main является одной из сигнатур для его определения.

и этот пост: http://ntcore.com/files/richsign.htm

дать больше информации о подписи компилятора Microsoft.

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