перемещение секции

Тема в разделе "WASM.WIN32", создана пользователем Zero Ice, 24 янв 2005.

  1. Zero Ice

    Zero Ice New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2003
    Сообщения:
    61
    Решил для себя написать одну утилиту: хочу перемещать секцию ресурсов (.rsrc) из середины в конец файла (если она дефолтом не в конце). Для этого делаю следующее: меняю порядок в obj table (делаю obj ресурсов самым последним, а остальные сдвигаю), читаю секцию ресурсов и пишу её в конец файла, потом правлю obj ресурсов (высчитываю новые файловые оффсеты и RVA), изменяю DataDirectory[2]->VirtualAddress на новый. Что ещё надо сделать?

    P.S. “Мусор” от старой секции пусть пока валяется в exe. :)
     
  2. Zero Ice

    Zero Ice New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2003
    Сообщения:
    61
    Если я создаю новую секцию ресурсов (в конце файла), что надо поправить в заголовке (NT Header), чтобы эта секция зменила старую? (помимо DataDirectory[2])
     
  3. ProgramMan

    ProgramMan New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2004
    Сообщения:
    263
    >еняю порядок в obj table (делаю obj ресурсов самым последним, а остальные сдвигаю)

    Зачем? это не нужно



    >что надо поправить в заголовке

    тут вроде

    88h DWord Resource Table RVA RVA адрес таблицы ресурсов

    8Ch DWord Resource Data Size размер таблицы ресурсов

    По идее вообшето достаточно переписать данные в конец файла и изменить адрес(Physical Offset) а таблице обьектов.
     
  4. Zero Ice

    Zero Ice New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2003
    Сообщения:
    61
    >>еняю порядок в obj table (делаю obj ресурсов самым последним, а остальные сдвигаю)

    >Зачем? это не нужно

    Нужно. :dntknw: Проверено.

    Суть в следующем - для эксперемента я переставляю секции в 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'а?
     
  5. ProgramMan

    ProgramMan New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2004
    Сообщения:
    263
    RVA всмысле? Относительно ImageBase.

    >Нужно. :dntknw: Проверено.

    Да, вспомнил была подобная проблема под XP. Там ещё проверяется валидность секции ресурсов, из-за чего её не стоило было криптовать.
     
  6. ProgramMan

    ProgramMan New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2004
    Сообщения:
    263
    Посмотри тут в архиве 2 файла, исходный и переделанный, вроде всё работает.

    Делал так:

    1)скопировал данные из секции ресурсов(600р-A00h)в конец файла.

    2)Добавил новую секцию, с указателями на ресурсы в конце файла.

    3) изменил RVA в заголовке.



    p.s. у меня Win2k sp2

    [​IMG] 1397417893__res.rar
     
  7. Zero Ice

    Zero Ice New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2003
    Сообщения:
    61
    Есть одна большая проблема - ресурсы, которые мы копируем в конец файла, не используются прогой. Причина заключается в странной реализации этой секции: все оффсеты ресурсных диров считаются относительно начала секции, а поинтеры на сами ресурсы - относительно ImageBase'a. Если мы затираем старую секцию в obj Table - случается сакс - поинтер на ресурсы показывает вне секции.

    Начал разбираться с оффсетами и вытаскиванием ресурсов вручную (чтобы RVA поменять) - наткнулся на одну странность: ResExplorer показывает что 2 папки, а у меня 3. Провери Hiew - точно три. :) ОК. Буду дальше мучить это дело. :)
     
  8. Zero Ice

    Zero Ice New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2003
    Сообщения:
    61
    Проверь у себя мою версию, plz. Я уже просто не знаю к чему придирается XP. 9x отлично кушает exe'шник, показывает все ресурсы, etc. Уже вроде и все оффсеты возрастают, а всё рано NT упрямится. :dntknw:

    [​IMG] _2132817288__1.rar
     
  9. ProgramMan

    ProgramMan New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2004
    Сообщения:
    263
    Секция .data у тебя пустая(размер 0)

    остальное на первый взгляд вроде нормально, но файл не пашет...
     
  10. Zero Ice

    Zero Ice New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2003
    Сообщения:
    61
    Это твой файл, пределанный моей прогой. В оригинале тоже 0.