PE format

Тема в разделе "WASM.WIN32", создана пользователем Sonic, 2 сен 2004.

  1. Sonic

    Sonic New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2004
    Сообщения:
    77
    Адрес:
    Днепропетровск
    Решил разобрать PE формат и для примера взял исходник

    sectionAdd. У меня возникло пару вопросов, если можно

    помогите:

    когда добавляется секция, добавляется ещё одна

    Object Entry, причём по смещению Num_of_Objects*28h

    Кто сказал, что там не кому не нужных 28h байт ?
     
  2. sep

    sep New Member

    Публикаций:
    0
    Регистрация:
    1 июн 2004
    Сообщения:
    51
    Сначала смотришь есть ли в section table свободное место, потом рассчитываешь параметры секции (выравнивание считаешь, адреса и все такое), потом перемапливаешь файл в соответствии с новым размером, а уж потом прибавляешь в заголовке 1 в количестве секций, пишешь в section table новую запись и про SizeOfImage не забудь
     
  3. Dr.Golova

    Dr.Golova New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2002
    Сообщения:
    348
    28h - это размер Object Entry, тоесть последний свободный оффсет так и считается Num_of_Objects*28h (тут написано умножить а не плюс =)
     
  4. Sonic

    Sonic New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2004
    Сообщения:
    77
    Адрес:
    Днепропетровск
    Попробовал я такой "последний свободный оффсет" для

    taskmgr.exe и оказался он не таким уж и свободным,

    попробуй сам, советую !
     
  5. sep

    sep New Member

    Публикаций:
    0
    Регистрация:
    1 июн 2004
    Сообщения:
    51
    вот только что смотрел на этот таск менеджер... ну так там с секциями накручено :) VirtualSize (то бишь реальное количество полезных данных в секции) больше чем размер секции на диске... а еще там в конце оверлей есть
     
  6. sep

    sep New Member

    Публикаций:
    0
    Регистрация:
    1 июн 2004
    Сообщения:
    51
    что с оверлеем, что без него один результат ругается, что не может библиотеку найти. кажется, что новая запись что-то затирает.
     
  7. sep

    sep New Member

    Публикаций:
    0
    Регистрация:
    1 июн 2004
    Сообщения:
    51
    хе-хе :) у них вобщем какого-то хм... ну вобщем таблица импорта (часть таблицы) находится в свободном месте таблицы секций. может кто-нибудь из знающих расскажет, что это за прием такой ?



    P.S. все сказанное про taskmgr.exe [w2k sp4]
     
  8. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    sep



    Так вроде у Касперски

    http://www.wasm.ru/article.php?article=h2000_05

    описан взлом программы с хитрыми секциями.
     
  9. Dr.Golova

    Dr.Golova New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2002
    Сообщения:
    348
    > VirtualSize (то бишь реальное количество полезных

    > данных в секции) больше чем размер секции на диске...



    Было бы удивительно, если бы размер выделяемой памяти под секцию был меньше чем данных на диске =)



    > а еще там в конце оверлей есть



    А в нем конечно же путь до файла с отладочной инфой



    > у них вобщем какого-то хм... ну вобщем таблица импорта

    > (часть таблицы) находится в свободном месте таблицы

    > секций.



    Это называется Bound Import Directory, так штааа делаешь

    PE->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].V irtualAddress = 0;

    PE->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT].S ize = 0;

    И преспокойно пишешь новый заголовок секции поверх этого крэпа.
     
  10. ssx

    ssx Member

    Публикаций:
    0
    Регистрация:
    19 авг 2003
    Сообщения:
    336


    и вовсе это не крэп, MS в свои системные бинарники везде bound import напихала(типа быстрее грузиться будут?)
     
  11. kaspersky

    kaspersky New Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    3.006
    > Кто сказал, что там не кому не нужных 28h байт ?

    никто ;) хотя обычно свободное место там есть,

    поскольку стартовый адрес первой секции на диске должен быть выровнен на 200h байт, а стандартный заголовк занимает чуть-чуть больше 200h байт, то в ~90% файлах мы имеем поряка 200h байт халявного пространства, но встречаются и исключения.

    надо проверить, что SizeOfHeaders располагает к внедрению

    и что здесь находятся одни нули, в противном случае лучше отказаться от внедрения



    > что с оверлеем, что без него один результат ругается,

    > что не может библиотеку найти. кажется, что новая

    > запись что-то затирает.

    здесь расположена таблица BOUND IMPORT'а (кстати, подробно описанная мной в стаье по PE-формату, опубликованной в одном из последних номеров "системного администратора").

    решение - либо пененести BOUND IMPORT на любое свободное место, либо прибить его нахер. работать будет и без него, только файл будет грузиться чуть-чуть дольше.



    даже когда оверлей есть, то можно смело дописываться в его конец, при условии что ImageSize будет расчитан верно (оверлей будет болтаться в памяти)



    > Было бы удивительно, если бы размер выделяемой памяти

    > под секцию был меньше чем данных на диске =)

    и такое встречается ;)

    ситуацию с размером равным нулю мы рассматривать не будем, т.к. тут все понятно (если размер выделяемой памяти равен нулю, берем размер секции на диске, выравнивая его до OA). лучше возьмем оверлей, расположенный в середине файла ;)
     
  12. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    kaspersky

    > при условии что ImageSize будет расчитан верно (оверлей будет болтаться в памяти)



    А когда это оверлей в память грузился?
     
  13. sep

    sep New Member

    Публикаций:
    0
    Регистрация:
    1 июн 2004
    Сообщения:
    51
    Asterix



    когда нужным образом заголовок подправить :)



    kaspersky

    вот все вспоминаете про сей чудесный журнал, а найти его где ? и вот как раз эта статья интересует