Blog. Just Blog

Извлечение главной иконки из исполняемого файла

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Извлечение главной иконки из исполняемого файла
Извлечение главной иконки из исполняемого файла

В комментариях к недавней статье про замену главной иконки исполняемого файла задали очень правильный вопрос: как извлечь иконки из ресурсов исполняемого файла? Сегодня я постараюсь подробно рассказать вам, как это делается.

Начнем с описания структур, необходимых для работы с иконками. Они уже были в прошлых статьях. Так как мы будем использовать ресурсы и файлы иконок, нам понадобятся они все.
  1. ; Структуры для работы с иконками в группе
  2. struct ICONDIR
  3.     idReserved dw ? ; Зарезервировано (должно быть 0)
  4.     idType     dw ? ; Тип ресурса (1 для иконок)
  5.     idCount    dw ? ; Количество изображений в иконке
  6. ends
  7.  
  8. struct GRPICONDIRENTRY
  9.     bWidth        db ? ; Ширина изображения в пикселах
  10.     bHeight       db ? ; Высота изображения в пикселах
  11.     bColorCount   db ? ; Количество цветов
  12.     bReserved     db ? ; Зарезервировано
  13.     wPlanes       dw ? ; Зарезервировано
  14.     wBitCount     dw ? ; Зарезервировано
  15.     dwBytesInRes  dd ? ; Размер данных изображения
  16.     nID           dw ? ; ID иконки в ресурсах
  17. ends
  18.  
  19. struct ICONDIRENTRY
  20.     bWidth        db ? ; Ширина изображения в пикселах
  21.     bHeight       db ? ; Высота изображения в пикселах
  22.     bColorCount   db ? ; Количество цветов
  23.     bReserved     db ? ; Зарезервировано
  24.     wPlanes       dw ? ; Зарезервировано
  25.     wBitCount     dw ? ; Зарезервировано
  26.     dwBytesInRes  dd ? ; Размер данных изображения
  27.     dwImageOffset dd ? ; Смещение данных относительно начала файла
  28. ends
Начальные действия похожи на действия при замене иконок. Сперва загружаем исходный исполняемый файл в память перебираем в нем все ресурсы с типом RT_GROUP_ICON, то есть группы иконок. После обработки файл из памяти выгружается. Тут проблем быть не должно.
  1.         ; Загрузить исходный файл в память
  2.         invoke  LoadLibrary,szSource
  3.         or      eax,eax
  4.         jz      loc_exit
  5.  
  6.         ; Хэн