Как программно получить версию компилятора VC из PE-файла?
CFF Explorer может определить версию компилятора VC из PE-файла. он показывает "Microsoft Visual C++ 8" для моего exe-файла, который статически связан с libCMT(без зависимости dll).
Как это сделать? Он должен отвечать на какую-то структуру в PE-файле, которая мне неизвестна.
ОБНОВИТЬ:
- CFF Explorer может получить правильную версию компилятора VC для статически связанного PE-файла (нет зависимости DLL от msvcmXX.dll, msvcpXX.dll или msvcrXX.dll)
- Даже если я очистил поля LinkerVersion / ImageVersion / SubsytstemVersion / OperratingSystemVersion в необязательном заголовке PE до ZERO, проводник CFF по-прежнему может знать правильную версию компилятора VC.
Кажется, что CFF Explorer использует надежный способ определения версии компилятора VC.
1 ответ
Заголовок 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.