Мир программирования

 


Найти: на:


Меню
Партнеры
Счетчики
Реклама

Формат исполняемых PE-файлов
Ресурсы


Ресурсы представляют собой многоуровневое двоично-отсортированное дерево. Их спроектированная структура позволяет содержать до 2^31 уровней, однако, реально используется только 3: самый верхний есть Type, затем Name, и затем Language (тип, имя, язык). Типичное представление ресурсного участка в файлах:
Typical Resources Layout

Каталог ресурсов Resources Directory Table
Данные ресурсов Resources Data

Структуру каталога ресурсов рассмотрим ниже.

Каталог ресурсов (Resource Directory Table)
Resource Directory Table
Base
Size or Type
Name Of field
Brief description
00h DWord Flags Пока не используются, должны быть сброшены в 0
04h DWord Time/Date Stamp Дата и время подключения ресурсов от ресурсного компилятора
08h Word Major Version Угу, опять для нас номер версии, старший по счету
0Ah Word Minor Version --//-- и младший
0Ch Word Name Entry Количество входов в таблицу имен ресурсов, таблица располагается в самом начале массива входов и содержит строковые имена ассоциируемые с ресурсами
0Eh Word ID_Num Entry Количество 32-битовых идентификаторов ресурсов
Total Structure size 10h Размер каталога ресурсов

За каталогом ресурсов сразу следует массив переменной длинны, содержащий ресурсные входы. Name Entry содержит число ресурсных входов имеющих имена (связанные с каждым входом). Имена нечувствительны к регистру и расположены в порядке возрастания. ID_Num Entry определяет число входов имеющих в качестве имени 32-битовый идентификатор. Эти входы так же отсортированы по возрастанию. Данная структура позволяет получать быстрый доступ к ресурсам по имени или по идентификатору, но для отдельно взятого ресурса только одна из форм поиска поддерживается, не обе! Это согласуется с синтаксисом .RC и .RES файлов. Каждый вход в таблице ресурсов имеет следующий формат:
Resource Entry Item
Base
Size or Type
Name Of field
Brief description
00h DWord Name RVA or Res ID Поле содержит либо идентификатор ресурса, либо указатель на его имя в таблице имен ресурсов
04h DWord Data Entry RVA or SubDirectory RVA Указывает либо на данные, либо на еще одну таблицу входов ресурсов, 31-бит сброшенный в 0 указывает на то, что это ссылка на данные и наоборот
Total Structure size 08h Размер ресурсного входа

Строки каталога ресурсов имеют следующий формат:
Resource Directory String Entry
File Name: File Type: Length Word Unicode String unpredictable длина строки должна быть кратна 2 (это очевидно) Все такие строковые объекты часто хранят вместе

Строки каталога ресурсов размещают после последнего Resource Directory Entry но до первого Resource Data Item, это позволяет более компактно разместить информацию. Каждый пункт данных имеет следующий формат:
Resource Entry Item
Base
Size or Type
Name Of field
Brief description
00h DWord Data RVA Указатель на реально расположенные данные относительно Image Base
04h DWord Size Размер ресурсных данных
08h DWord CodePage Кодовая страница
0Ch DWord Reserved Не используется и устанавливается в 0
Total Structure size 10h Размер указателя данные ресурса

Каждый вход в таблице ресурсов описывает узел в дереве ресурсов. Он содержит адрес относительно Image Base, поле Size указывает на число байов данных находящихся по этому адресу, а кодовая страница используется для расшифровки ключевых значений внутри ресурсных данных. Обычно новые приложения содержат значение соответствующее Unicode кодовой таблице. (хотя, хм. Обычно?)

Пример структуры размещения ресурсов
Приведем пример приложения которое хочет использовать следующие данные в качестве ресурсов:

Тип
Имя
Язык
Данные ресурса
00000001 00000001 0 00010001
00000001 00000001 1 10010001
00000001 00000002 0 00010002
00000001 00000003 0 00010003
00000002 00000001 0 00010001
00000002 00000002 0 00020002
00000002 00000003 0 00020003
00000002 00000004 0 00020004
00000009 00000001 0 00090001
00000009 00000009 0 00090009
00000009 00000009 1 10090009
00000009 00000009 2 20090009

Тогда ресурсный каталог в PE файле будет выглядеть следующим образом:

Смещение
Данные
0000: 00000000 00000000 00000000 00030000 (3 входа в этом каталоге)
0010: 00000001 80000028 (Тип #1, Подкаталог по смещению 0x28)
0018: 00000002 80000050 (Тип #2, Подкаталог по смещению 0x50)
0020: 00000009 80000080 (Тип #9, Подкаталог по смещению 0x80)
0028: 00000000 00000000 00000000 00030000 (3 входа в этом каталоге)
0038: 00000001 800000A0 (Имя #1, Подкаталог по смещению 0xA0)
0040: 00000002 00000108 (Имя #2, дескриптор данных по смещению 0x108)
0048: 00000003 00000118 (Имя #3, дескриптор данных по смещению 0x118)
0050: 00000000 00000000 00000000 00040000 (4 входа в этом каталоге)
0060: 00000001 00000128 (Имя #1, дескриптор данных по смещению 0x128)
0068: 00000002 00000138 (Имя #2, дескриптор данных по смещению 0x138)
0070: 00000003 00000148 (Имя #3, дескриптор данных по смещению 0x148)
0078: 00000004 00000158 (Имя #4, дескриптор данных по смещению 0x158)
0080: 00000000 00000000 00000000 00020000 (2 входа в этом каталоге)
0090: 00000001 00000168 (Имя #1, дескриптор данных по смещению 0x168)
0098: 00000009 800000C0 (Имя #9, Подкаталог по смещению 0xC0)
00A0: 00000000 00000000 00000000 00020000 (2 входа в этом каталоге)
00B0: 00000000 000000E8 (Язык 0, дескриптор данных по смещению 0xE8)
00B8: 00000001 000000F8 (Язык 1, дескриптор данных по смещению 0xF8)
00C0: 00000000 00000000 00000000 00030000 (3 входа в этом каталоге)
00D0: 00000001 00000178 (Язык 0, дескриптор данных по смещению 0x178)
00D8: 00000001 00000188 (Язык 1, дескриптор данных по смещению 0x188)
00E0: 00000001 00000198 (Язык 2, дескриптор данных по смещению 0x198)
00E8: 000001A8 (По смещению 0x1A8, для Тип #1, Имя #1, Язык #0)
00000004 (4 байта данных)
00000000 (кодовая страница)
00000000 (зарезервировано)
00F8: 000001AC (По смещению 0x1AC, для Тип #1, Имя #1, Язык #1)
00000004 (4 байта данных)
00000000 (кодовая страница)
00000000 (зарезервировано)
0108: 000001B0 (По смещению 0x1B0, для Тип #1, Имя #2,
00000004 (4 байта данных)
00000000 (кодовая страница)
00000000 (зарезервировано)
0118: 000001B4 (По смещению 0x1B4, для Тип #1, Имя #3,
00000004 (4 байта данных)
00000000 (кодовая страница)
00000000 (зарезервировано)
0128: 000001B8 (По смещению 0x1B8, для Тип #2, Имя #1,
00000004 (4 байта данных)
00000000 (кодовая страница)
00000000 (зарезервировано)
0138: 000001BC (По смещению 0x1BC, для Тип #2, Имя #2,
00000004 (4 байта данных)
00000000 (кодовая страница)
00000000 (зарезервировано) 0
0148: 000001C0 (По смещению 0x1C0, для Тип #2, Имя #3,
00000004 (4 байта данных)
00000000 (кодовая страница)
00000000 (зарезервировано)
0158: 000001C4 (По смещению 0x1C4, для Тип #2, Имя #4,
00000004 (4 байта данных)
00000000 (кодовая страница)
00000000 (зарезервировано)
0168: 000001C8 (По смещению 0x1C8, для Тип #9, Имя #1,
00000004 (4 байта данных)
00000000 (кодовая страница)
00000000 (зарезервировано)
0178: 000001CC (По смещению 0x1CC, для Тип #9, Имя #9, Язык #0
00000004 (4 байта данных)
00000000 (кодовая страница)
00000000 (зарезервировано)
0188: 000001D0 (По смещению 0x1D0, для Тип #9, Имя #9, Язык #1
00000004 (4 байта данных)
00000000 (кодовая страница)
00000000 (зарезервировано)
0198: 000001D4 (По смещению 0x1D4, для Тип #9, Имя #9, Язык #2
00000004 (4 байта данных)
00000000 (кодовая страница)
00000000 (зарезервировано)

Ну, а данные для ресурсов будут таковыми:
01A8: 00010001
01AC: 10010001
01B0: 00010002
01B4: 00010003
01B8: 00020001
01BC: 00020002
01C0: 00020003
01C4: 00020004
01C8: 00090001
01CC: 00090009
01D0: 10090009
01D4: 20090009

[Оглавление]

Опрос

Конкурсы
Реклама

 

Web дизайн: Бурлаков Михаил    

Web программирование: Бурлаков Михаил

Используются технологии uCoz