Решил для себя написать одну утилиту: хочу перемещать секцию ресурсов (.rsrc) из середины в конец файла (если она дефолтом не в конце). Для этого делаю следующее: меняю порядок в obj table (делаю obj ресурсов самым последним, а остальные сдвигаю), читаю секцию ресурсов и пишу её в конец файла, потом правлю obj ресурсов (высчитываю новые файловые оффсеты и RVA), изменяю DataDirectory[2]->VirtualAddress на новый. Что ещё надо сделать? P.S. “Мусор” от старой секции пусть пока валяется в exe.
Если я создаю новую секцию ресурсов (в конце файла), что надо поправить в заголовке (NT Header), чтобы эта секция зменила старую? (помимо DataDirectory[2])
>еняю порядок в obj table (делаю obj ресурсов самым последним, а остальные сдвигаю) Зачем? это не нужно >что надо поправить в заголовке тут вроде 88h DWord Resource Table RVA RVA адрес таблицы ресурсов 8Ch DWord Resource Data Size размер таблицы ресурсов По идее вообшето достаточно переписать данные в конец файла и изменить адрес(Physical Offset) а таблице обьектов.
>>еняю порядок в obj table (делаю obj ресурсов самым последним, а остальные сдвигаю) >Зачем? это не нужно Нужно. Проверено. Суть в следующем - для эксперемента я переставляю секции в obj table (никаких других изменений!). Потом запускаем этот exe в 9x - работает, в XP - нет. Hard Wisdom когда-то написал: "Последовательность секций кода и данных в памяти выбирается линкером. Виртуальные адреса объектам должны быть присвоены линкером в возрастающем порядке и являются кратными Object Align в заголовке PE Header. Стоит заметить, что текущая реализация загрузчика Windows'95 не различает порядка объектов (секций) в таблице, поэтому можно смело располагать их в произвольном порядке." В XPзагрузчик кричит что "неверный формат файла" (видать другие люди его писали ). >>что надо поправить в заголовке >тут вроде >88h DWord Resource Table RVA RVA адрес таблицы ресурсов >8Ch DWord Resource Data Size размер таблицы ресурсов >По идее вообшето достаточно переписать данные в конец файла и изменить адрес(Physical Offset) а таблице >обьектов. Размер не меняется, а вот RVA я правлю. Но эффект нулевой - ресурсов нет. Есть такой вопрос - относительные адреса в ресурсах считаются относительно начала секции или ImageBase'а?
RVA всмысле? Относительно ImageBase. >Нужно. Проверено. Да, вспомнил была подобная проблема под XP. Там ещё проверяется валидность секции ресурсов, из-за чего её не стоило было криптовать.
Посмотри тут в архиве 2 файла, исходный и переделанный, вроде всё работает. Делал так: 1)скопировал данные из секции ресурсов(600р-A00h)в конец файла. 2)Добавил новую секцию, с указателями на ресурсы в конце файла. 3) изменил RVA в заголовке. p.s. у меня Win2k sp2 1397417893__res.rar
Есть одна большая проблема - ресурсы, которые мы копируем в конец файла, не используются прогой. Причина заключается в странной реализации этой секции: все оффсеты ресурсных диров считаются относительно начала секции, а поинтеры на сами ресурсы - относительно ImageBase'a. Если мы затираем старую секцию в obj Table - случается сакс - поинтер на ресурсы показывает вне секции. Начал разбираться с оффсетами и вытаскиванием ресурсов вручную (чтобы RVA поменять) - наткнулся на одну странность: ResExplorer показывает что 2 папки, а у меня 3. Провери Hiew - точно три. ОК. Буду дальше мучить это дело.
Проверь у себя мою версию, plz. Я уже просто не знаю к чему придирается XP. 9x отлично кушает exe'шник, показывает все ресурсы, etc. Уже вроде и все оффсеты возрастают, а всё рано NT упрямится. _2132817288__1.rar