Привет всем.
Есть задача. Необходимо из одного EXE извлечь иконки и впихнуть их в другой.
Изучил формат PE файлов, получается извлекать иконки без сохранения структуры дерева ресурсов ( сканирую id=3 ).
Вопросы:
1. Как извлечь, одновременно сохранив эту самую структуру?
2. Пробую искать не иконку ( id=3 ), а группу иконок ( id=14 ). Не пашет. Подскажите, плз.
ЗЫ. Ответы типа "ну почитай <ссылка на ГДЕ-НИБУДЬ>" прошу не давать
Здравствуйте, psu, Вы писали:
psu>Привет всем. psu>Есть задача. Необходимо из одного EXE извлечь иконки и впихнуть их в другой.
А UpdateResource не поможет?
psu>Изучил формат PE файлов, получается извлекать иконки без сохранения структуры дерева ресурсов ( сканирую id=3 ). psu>Вопросы: psu>1. Как извлечь, одновременно сохранив эту самую структуру?
Если полностью сохранить структуру — ИМХО только полным копированием таблицы ресурсов, с правкой ссылок на неё в хидере нового файла.
Обычно в этом нет необходимости. Чтобы WinAPI могло корректно обработать содержимое каталога ресурсов, нужно поместить сами иконки и добавить соответствующие записи в директории ресурсов (Type, NameID. Language можно и пропустить).
Здесь есть одна маленькая заморочка — данные часто находятся сразу за директорией, и если ресурсы уже какие-то есть, нужно будет двигать и править ссылки
psu>2. Пробую искать не иконку ( id=3 ), а группу иконок ( id=14 ). Не пашет. Подскажите, плз.
В директории Type не находит такой ID?
Формат данных GROUP_ICON примерно такой:
WORD 0, 1 // это не помню :-(
WORD Count // количество иконок в группе
// далее идут такие структуры (в количестве Count) на каждую иконку:char data[12] // это вроде как инфа о размерах иконки
WORD IconID // ID принадлежащих группе иконок
когда это найдено, остаётся только обработать иконки с ID из группы.
здесь есть PEview — полезная маленькая тулза, когда-то сильно помогла.
psu>ЗЫ. Ответы типа "ну почитай <ссылка на ГДЕ-НИБУДЬ>" прошу не давать
Даваёте такие мне, а то уже не помню откуда инфа выше, и насколько она верна
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[2]: PE формат и ресурсы
От:
Аноним
Дата:
05.01.06 08:31
Оценка:
Здравствуйте, gear nuke.
Вы писали:
GN>А UpdateResource не поможет?
Пробовал. Брал пример из МСДН. Не работает. Файл изменился, а запускатся не хочет.
GN>Если полностью сохранить структуру — ИМХО только полным копированием таблицы ресурсов, с правкой ссылок на неё в хидере нового файла.
GN>Обычно в этом нет необходимости. Чтобы WinAPI могло корректно обработать содержимое каталога ресурсов, нужно поместить сами иконки и добавить соответствующие записи в директории ресурсов (Type, NameID. Language можно и пропустить).
А иконки брать через ExtractIcon или как-нибудь по-другому?
Обязательно создавать root директорию?
GN>Здесь есть одна маленькая заморочка — данные часто находятся сразу за директорией, и если ресурсы уже какие-то есть, нужно будет двигать и править ссылки
psu>>2. Пробую искать не иконку ( id=3 ), а группу иконок ( id=14 ). Не пашет. Подскажите, плз.
GN>В директории Type не находит такой ID?
GN>Формат данных GROUP_ICON примерно такой: GN>
GN> WORD 0, 1 // это не помню :-(
GN> WORD Count // количество иконок в группе
GN> // далее идут такие структуры (в количестве Count) на каждую иконку:
GN> char data[12] // это вроде как инфа о размерах иконки
GN> WORD IconID // ID принадлежащих группе иконок
GN>
когда это найдено, остаётся только обработать иконки с ID из группы.
Тип группы иконок находит. Пробую сканировать, дохожу до entry. получаю смещение на данные. И вот здесь, по-моему, что-то работает не правильно. Смещение указывает сразу ЗА данные иконки ( проверял через Resource Editor ). Может я чего-то не понимаю. Можно обьяснить суть GROUP_ICON?
psu>>ЗЫ. Ответы типа "ну почитай <ссылка на ГДЕ-НИБУДЬ>" прошу не давать
GN>Даваёте такие мне, а то уже не помню откуда инфа выше, и насколько она верна
Откуда брал инфу уже не помню. Просто искал в гугле.
Dir = ( IMAGE_RESOURCE_DIRECTORY* )psResource;//root dir
Entry = ( IMAGE_RESOURCE_DIRECTORY_ENTRY* )( Dir + 1 );//first entry in root dir
int nCount = Dir->NumberOfIdEntries + Dir->NumberOfNamedEntries;
int i;
IMAGE_RESOURCE_DIRECTORY_ENTRY* pEntries[100];
int nEntries = 0;
//cycle on root dir entries
for( i = 0; i < nCount; i++ )
{
if( Entry->Id == 0x0e ) //icon group subdir
{
Dir = ( IMAGE_RESOURCE_DIRECTORY* )( psResource + Entry->OffsetToDirectory );
nCount = Dir->NumberOfIdEntries + Dir->NumberOfNamedEntries;
//scan icons dir
// each entry points to subdirectory
Entry = ( IMAGE_RESOURCE_DIRECTORY_ENTRY* )( Dir + 1 );
for( i = 0; i < nCount; i ++ )
{
pEntries[ i ] = new IMAGE_RESOURCE_DIRECTORY_ENTRY;
memcpy( pEntries[ i ], Entry, sizeof( IMAGE_RESOURCE_DIRECTORY_ENTRY ) );
Entry++;
}
//gather icons data
int j;
int nIcons;
IMAGE_RESOURCE_DATA_ENTRY* pData;
for( i = 0; i < nCount; i ++ )
{
//enter subdir
Dir = ( IMAGE_RESOURCE_DIRECTORY* )( psResource + pEntries[ i ]->OffsetToDirectory );
//scan each icon subdir
Entry = ( IMAGE_RESOURCE_DIRECTORY_ENTRY* )( Dir + 1 );
Здравствуйте, <Аноним>,
GN>>А UpdateResource не поможет?
А>Пробовал. Брал пример из МСДН. Не работает. Файл изменился, а запускатся не хочет.
Примеры из MSDN могут и не раболтать, но вот как это повлияло на возможность загрузки PE?
GN>>Чтобы WinAPI могло корректно обработать содержимое каталога ресурсов, нужно поместить сами иконки и добавить соответствующие записи в директории ресурсов (Type, NameID. Language можно и пропустить).
А>А иконки брать через ExtractIcon или как-нибудь по-другому?
Я имел ввиду: если создать корректную таблицу ресурсов (запись в IMAGE_OPTIONAL_HEADER, корневую директорию, поддиректории с Type 03 и 0e), то можно будет эти иконки вытаскивать хоть через ExtractIcon, хоть руками. Как их извлекать из оригинального файла — дело вкуса.
А>Обязательно создавать root директорию?
Да.
А>Тип группы иконок находит. Пробую сканировать, дохожу до entry. получаю смещение на данные. И вот здесь, по-моему, что-то работает не правильно. Смещение указывает сразу ЗА данные иконки ( проверял через Resource Editor ). Может я чего-то не понимаю.
GROUP_ICON хранит не данные иконок, а свои данные.
А>Можно обьяснить суть GROUP_ICON?
Дык писал же, как я его понимаю:
Формат данных GROUP_ICON примерно такой:
WORD 0, 1 // это не помню :-(
WORD Count // количество иконок в группе
// далее идут такие структуры (в количестве Count) на каждую иконку:char data[12] // это вроде как инфа о размерах иконки
WORD IconID // ID принадлежащих группе иконок
когда это найдено, остаётся только обработать иконки с ID из группы.
(кстати, там игнорируется поле DataIsDirectory, а директория Language может отсутствовать — для иконок смысла в ней нет).
psu>>>ЗЫ. Ответы типа "ну почитай <ссылка на ГДЕ-НИБУДЬ>" прошу не давать
GN>>Даваёте такие мне, а то уже не помню откуда инфа выше, и насколько она верна
А>Откуда брал инфу уже не помню. Просто искал в гугле.
Это я для других писал, может у кого есть много хороших ссылок
Любой топик может быть интересен не только автору, но и человеку нашедшему его через 2 года.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
GN> WORD 0, 1 // это не помню :-(
GN> WORD Count // количество иконок в группе
GN> // далее идут такие структуры (в количестве Count) на каждую иконку:
GN> char data[12] // это вроде как инфа о размерах иконки
GN> WORD IconID // ID принадлежащих группе иконок
GN>
когда это найдено, остаётся только обработать иконки с ID из группы.
(кстати, там игнорируется поле DataIsDirectory, а директория Language может отсутствовать — для иконок смысла в ней нет).
Нашел я такие вот структуры ( resmft.txt, SDK )
The group header is described here:
[Resource header (type = 14)]
struct IconHeader {
WORD wReserved; // Currently zero
WORD wType; // 1 for icons
WORD wCount; // Number of components
WORD padding; // filler for DWORD alignment
};
The next portion is repeated for each component resource:
struct ResourceDirectory {
BYTE bWidth;
BYTE bHeight;
BYTE bColorCount;
BYTE bReserved;
WORD wPlanes;
WORD wBitCount;
DWORD lBytesInRes;
WORD wNameOrdinal; // Points to component
WORD padding; // filler for DWORD alignment
};
Вы это имели ввиду( IconHeader ) ? Если нет, где можно найти Ваш "правильный" GROUP_ICON. Кстати, попробовал и один, и другой: не работают.
Здравствуйте, psu, Вы писали:
psu>Нашел я такие вот структуры ( resmft.txt, SDK )
А какой SDK? В Platform такого нет. Да и стиль самих struct не похож на MS.
Есть здесь
Там же рядом лежит занятная вещица (как понял, с сорцами) winresdump:
winresdump (windows resource dumper) is a little utility I threw together to get a dump of the resources in windows ne and pe executables. ne are the 16 bit win 3.1 executables, pe are the 32bit ones.
usage: winresdump something.exe
For any dib/icon and curson graphics it comes across embedded in the ne resources it will create image*.bmp files from them by prepending a bmp header and dumping them out to file.
psu>The group header is described here:
psu> [Resource header (type = 14)]
psu>
psu>struct IconHeader {
psu> WORD wReserved; // Currently zero
psu> WORD wType; // 1 for icons
psu> WORD wCount; // Number of components
psu> WORD padding; // filler for DWORD alignment
psu> };
psu>The next portion is repeated for each component resource:
psu>struct ResourceDirectory {
psu> BYTE bWidth;
psu> BYTE bHeight;
psu> BYTE bColorCount;
psu> BYTE bReserved;
psu> WORD wPlanes;
psu> WORD wBitCount;
psu> DWORD lBytesInRes;
psu> WORD wNameOrdinal; // Points to component
psu> WORD padding; // filler for DWORD alignment
psu>};
psu>Вы это имели ввиду( IconHeader ) ?
Да. IconHeader выше — это и есть заголовок для GROUP_ICON, за ним на каждую иконку по ResourceDirectory. Из неё интересно только wNameOrdinal — это ID иконки и есть, как я понял.
psu>Если нет, где можно найти Ваш "правильный" GROUP_ICON.
Дык тот что был и сеть "правильный", только криво скопипастенный из древнего исходника на асме.
psu>Кстати, попробовал и один, и другой: не работают.
А как это проявляется? В wNameOrdinal не то что нужно?
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth