Расширить PE-заголовок / Добавить секцию (в файлах драйверов)

Тема в разделе "WASM.WIN32", создана пользователем luckysundog, 7 июл 2009.

  1. luckysundog

    luckysundog New Member

    Публикаций:
    0
    Регистрация:
    28 окт 2008
    Сообщения:
    106
    Вопрос по PE-заголовкам.
    Написал аналог функции программы LordPE для увеличения SizeOfHeaders. Это необходимо для того, чтобы добавить новую секцию. Осуществляется это простым сдвигом содержимого всех секций на 0x200 байтов вперед, освобождая тем самым место для большего количество заголовков секций.

    Функция успешно работает применимо к exe-файлам. А вот драйверы - не запускаются, StartService возвращает 2001. Checksum само собой пересчитан, и все вроде как должно работать, но не работает.

    Может кто сталкивался с таким? Как решить проблему?
     
  2. dermatolog

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    Заголовок можно расширять только в пределах RVA первой секции. Если заголовок вылазит за RVA первой секции, то придется двигать весь Image дальше по адресам.
     
  3. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    dermatolog
    спасибо, не знал (скорее не задумывался :)), полезная информация
     
  4. 737061

    737061 New Member

    Публикаций:
    0
    Регистрация:
    3 авг 2007
    Сообщения:
    74
    dermatolog
    Думаю в дроваш можно и так сделать, у них табличка релоков всегда на месте.
     
  5. dermatolog

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    737061
    Можно, только помимо релоков придется ребилдить еще и все остальное (импорт, экспорт и т.д.)
     
  6. luckysundog

    luckysundog New Member

    Публикаций:
    0
    Регистрация:
    28 окт 2008
    Сообщения:
    106
    спасибо, что-то я до очевидного не смог додуматься (( у меня же RVA первой секции == 0x200

    и драйвер-то тут ни при чем, такая же фигня могла быть и с .exe...
     
  7. luckysundog

    luckysundog New Member

    Публикаций:
    0
    Регистрация:
    28 окт 2008
    Сообщения:
    106
    самое сложное - ребилдить ресурсы :dntknw: хорошо, что их нет в файле.
     
  8. Jupiter

    Jupiter Jupiter

    Публикаций:
    0
    Регистрация:
    12 авг 2004
    Сообщения:
    532
    Адрес:
    Russia
    перестраивать ресурсы - как раз не самое сложное - поскольку данные лишь сдвигаются, а не перемещаются из разных мест, то достаточно прибавить дельту ко всем смещениям
     
  9. luckysundog

    luckysundog New Member

    Публикаций:
    0
    Регистрация:
    28 окт 2008
    Сообщения:
    106
    ну а таблицы импорта/экспорта? там ведь тоже всего лишь дельту прибавить нужно ко всем смещениям. просто ресурсы обходить чуток сложнее.

    или опять какие-то подводные камни?

    а то сейчас всплыла еще одна неочевидная проблема - при перестройке релоков. к каждому TypeOffset ведь тоже надо прибавлять дельту. а что, если TypeOffset равен, например, 0x3FFF ? тогда 0x3FFF+дельта выходит за пределы 0x1000. выходит, релоки полностью переписывать нужно.

    а пока я решил схитрить и освободить место под заголовок секции путем уменьшения NumberOfRvaAndSizes.

    задача добавления новой секции оказалось на самом деле не такой тривиальной, и выполнение этой задачи не всегда возможно :dntknw:
     
  10. dermatolog

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    luckysundog
    Если дров твой, то задача решается перекомпиляцией с более бОльшим значением выравнивания для секций.
     
  11. luckysundog

    luckysundog New Member

    Публикаций:
    0
    Регистрация:
    28 окт 2008
    Сообщения:
    106
    а еще FileAlignment и SectionAlignment следует СТРОГО соблюдать!
     
  12. dermatolog

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    luckysundog
    Ты это кому говоришь - виндовому загрузчику? :))