Форум программистов, компьютерный форум CyberForum.ru

Определить версию компилятора, на котором собиралась программа - C++ WinAPI

Войти
Регистрация
Восстановить пароль
 
zombivadim
3 / 3 / 0
Регистрация: 03.04.2016
Сообщений: 176
02.01.2017, 19:00     Определить версию компилятора, на котором собиралась программа #1
Подскажите, попалась одна интересная программка, которая определяет версии компиляторов, почти любого файла, как она это делает? Может есть в WINAPI специальные функции для работы с подобной информацией? И как вообще информация о компиляторе хранится в файле?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.01.2017, 19:00     Определить версию компилятора, на котором собиралась программа
Посмотрите здесь:

Светофор, в котором цвет "зажигается" при нажатии на лампу левой клавишей мыши C++ WinAPI
C++ WinAPI Как определить, что запущенная программа полностью отрисовала своё окно?
C++ WinAPI Нарисовать "Розетку" (многоугольник, в котором все вершины соединены между собой)
C++ WinAPI Как определить, что программа выполняется в виртуальной машине?
C++ WinAPI Как определить папку, откуда запущена программа
Получить версию продукта C++ WinAPI
Как установить шрифт, в котором два символа - подряд не сливаются? C++ WinAPI
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gazlan
3089 / 1864 / 278
Регистрация: 27.08.2010
Сообщений: 5,022
Записей в блоге: 1
02.01.2017, 20:08     Определить версию компилятора, на котором собиралась программа #2
Это она думает, что определяет :-)

В большинстве случаев, относительно уверенно можно назвать только диапазон версий (например, MSVC 6.0 - 9.0) + гадание по версии линкера (которая может и не совпадать с реальной версией компилятора или быть переписана пакером / протектором).
zombivadim
3 / 3 / 0
Регистрация: 03.04.2016
Сообщений: 176
02.01.2017, 21:11  [ТС]     Определить версию компилятора, на котором собиралась программа #3
gazlan, Вы добавили больше вопросов, чем ответов.
Цитата Сообщение от zombivadim Посмотреть сообщение
как она это делает? Может есть в WINAPI специальные функции для работы с подобной информацией? И как вообще информация о компиляторе хранится в файле?
gazlan
3089 / 1864 / 278
Регистрация: 27.08.2010
Сообщений: 5,022
Записей в блоге: 1
02.01.2017, 22:16     Определить версию компилятора, на котором собиралась программа #4
Цитата Сообщение от zombivadim Посмотреть сообщение
Может есть в WINAPI специальные функции для работы с подобной информацией?
Нет.

И как вообще информация о компиляторе хранится в файле?
Обычно, не хранится - за ненадобностью. Но некоторые компиляторы (GCC, FreePascal etc) оставляют метки версий в виде строковых констант. Другие (Borland CPP, PowerBasic etc) имеют характерный стаб на точке входа (EP), иногда версию можно уточнить по вызовам характерных функций, не существовавших в ранних версиях итп.

С другой стороны, многие специфические компиляторы (например, e-books, инсталляторы итп) добавляют к контенту собственные, легко определяемые сигнатуры. Delphi хранит информацию о типе лицензии (Personal / Professional / Enterprise).
zombivadim
3 / 3 / 0
Регистрация: 03.04.2016
Сообщений: 176
03.01.2017, 00:54  [ТС]     Определить версию компилятора, на котором собиралась программа #5
gazlan,
Цитата Сообщение от zombivadim Посмотреть сообщение
как она это делает?
Ваши соображения?
Например мой файл определяет Компилятор: Microsoft Visual C++ 8.x (2005)
gazlan
3089 / 1864 / 278
Регистрация: 27.08.2010
Сообщений: 5,022
Записей в блоге: 1
03.01.2017, 10:08     Определить версию компилятора, на котором собиралась программа #6
Цитата Сообщение от zombivadim Посмотреть сообщение
Ваши соображения?
Ждете диагноз по фотографии?

Таких программ несколько, по крайней мере одна из них - DiE должна быть с открытым кодом - качайте и разбирайтесь.
rao
 Аватар для rao
447 / 310 / 91
Регистрация: 02.04.2014
Сообщений: 922
03.01.2017, 10:29     Определить версию компилятора, на котором собиралась программа #7
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Вообще то в дополнительном заголовке PE-файлов IMAGE_OPTIONAL_HEADER есть специальные поля:
C++
1
2
BYTE                 MajorLinkerVersion;
BYTE                 MinorLinkerVersion;
, но как верно заметил gazlan, то что в них записано может совсем не соответствовать действительности.
zombivadim
3 / 3 / 0
Регистрация: 03.04.2016
Сообщений: 176
05.01.2017, 22:50  [ТС]     Определить версию компилятора, на котором собиралась программа #8
rao, Покопался в файловых структурах, вы правы. Остается вопрос как использовать значения получаемые в
Цитата Сообщение от rao Посмотреть сообщение
BYTE MajorLinkerVersion;
BYTE MinorLinkerVersion;
Как узнать какое значение используется именно для нужного компилятора?
rao
 Аватар для rao
447 / 310 / 91
Регистрация: 02.04.2014
Сообщений: 922
06.01.2017, 11:07     Определить версию компилятора, на котором собиралась программа #9
Готового списка найти не смог. Остается только "методом тыка": брать компилятор, собирать .EXE и смотреть какие значения будут туда записаны. Но особо полагаться на эти цифры не стоит, потому что единой системы нет и разные компиляторы ведут себя как им заблагорассудится. Вот пара примеров из исходников DiE (которую давал gazlan):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
function getVCVersionFromLinkerVersion()
{
    var sResult="";
    switch(PE.getMajorLinkerVersion())
    {
    case 3:  sResult=PE.getCompilerVersion();   break; // MS C++
    case 4:  sResult="4.0";  break;
    case 5:  sResult="5.0";  break;
    case 6:  sResult="6.0";  break;
    case 7:
        if(PE.getMinorLinkerVersion()<10)
        {
            sResult="2002";
        }
        else
        {
            sResult="2003";
        }
        break;
    case 8:  sResult="2005"; break;
    case 9:  sResult="2008"; break;
    case 10: sResult="2010"; break;
    case 11: sResult="2012"; break;
    case 12: sResult="2013"; break;
    case 13: sResult="2015"; break;
    }
 
    return sResult;
}
А так определяется для MinGW:
C++
1
2
3
4
5
6
    if(PE.getMajorLinkerVersion()==2)
    {
        if(PE.getMinorLinkerVersion()<=30||PE.getMinorLinkerVersion()==56)
        {
            if(PE.compare("'MZ'9000030000
...
В общем всё очень по-разному.
zombivadim
3 / 3 / 0
Регистрация: 03.04.2016
Сообщений: 176
06.01.2017, 22:50  [ТС]     Определить версию компилятора, на котором собиралась программа #10
rao, Не все так радужно. Я уже не стал работать в своей программе, а выбрал PETools, обнуляем значения MajorLinkerVersio и MinorLinkerVersion; Однако DiE и все остальные программы, продолжают правильно определять компилятор. Почему ????
Убежденный
Системный программист
 Аватар для Убежденный
14472 / 6456 / 1020
Регистрация: 02.05.2013
Сообщений: 10,693
Завершенные тесты: 1
07.01.2017, 09:26     Определить версию компилятора, на котором собиралась программа #11
zombivadim, я подозреваю, что эти программы могут использовать
что-то вроде сигнатурного поиска. Например, компилятор MS C/C++ вставляет
свой специфический код в точку входа exe/dll (называется __mainCRTStartup),
он в большинстве версий меняется незначительно и по нему можно делать детект.
Еще к названиям и размещению секций в PE-заголовке, наверное, можно привязаться.
И т.д.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.01.2017, 12:02     Определить версию компилятора, на котором собиралась программа
Еще ссылки по теме:

C++ WinAPI Загрузить из dll диалог, на котором расположено 4 кнопки
C++ WinAPI SetupDiGetDeviceRegistryProperty имеет unicode версию?
Написать оконное приложение, в котором созданы два дочерних окна C++ WinAPI
C++ WinAPI WinAPI окно с текстом, в котором будут указаны Ваши ФИО
Получить версию ОС C++ WinAPI

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
jupman
176 / 79 / 11
Регистрация: 10.11.2015
Сообщений: 222
07.01.2017, 12:02     Определить версию компилятора, на котором собиралась программа #12
Цитата Сообщение от zombivadim Посмотреть сообщение
Однако DiE и все остальные программы, продолжают правильно определять компилятор. Почему ????
Исходники DiE то поизучайте, на которые rao ссылку дал. Вот, например, сигнатуры для Visual Studio. Кстати, DiE позволяет сигнатуры через свой интерфейс просматривать (кнопка "Signatures"). У вас видимо старая версия, раз нет данной кнопки.
Yandex
Объявления
07.01.2017, 12:02     Определить версию компилятора, на котором собиралась программа
Ответ Создать тему
Опции темы

Текущее время: 12:53. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru