Хелпаните с PE =)

Тема в разделе "WASM.BEGINNERS", создана пользователем LrdSpr, 28 июл 2009.

  1. LrdSpr

    LrdSpr New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2008
    Сообщения:
    13
    Адрес:
    Moscow
    Начал разбираться с PE форматом… Решил скопировать таблицу импорта в новую секцию, a именно список IMAGE_IMPORT_DESCRIPTOR ов, однако после такого копирования запуск приложения прерывается с ошибкой:
    “Ошибка при инициализации приложения (0xc0000005). Для выхода из приложения нажмите кнопку "ОК".”

    Что я делаю:
    1.Считаю количество этих самых IMAGE_IMPORT_DESCRIPTOR ов с учетом нулевого
    2.Создаю в PE файле новую секцию с учетом выравнивания
    3.Копирую IMAGE_IMPORT_DESCRIPTOR ы в новую секцию
    4.Указываю DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress соответственно VirtualAddress новой секции.
    5.Сохраняю PE файл.

    Пробовал открыть этот PE файл с помощью LordPE, открылся нормально, и таблицу импорта прочитал, вроде все ok… Причем сам LordPE при добавлении в таблицу импорта нового значения так же копирует IMAGE_IMPORT_DESCRIPTORы в новую секцию, но почему то у него все работает :). Причем, если я с помощью LordPE добавляю запись в таблицу импорта, а затем с помощью своей проги копирую таблицу импорта, созданную LordPe, в новую секцию, у меня тоже все пашет гыг :)

    Эксперименты провожу над калькулятором :)

    Исходник (C++)
     
  2. LrdSpr

    LrdSpr New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2008
    Сообщения:
    13
    Адрес:
    Moscow
    Файлик чет не залился =0
     
  3. Bazhan

    Bazhan Андрей

    Публикаций:
    0
    Регистрация:
    8 янв 2008
    Сообщения:
    71
    Адрес:
    Украина
    в IMAGE_DATA_DIRECTORY -> Import Address Table пустует
     
  4. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    это не обязательное поле
     
  5. LrdSpr

    LrdSpr New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2008
    Сообщения:
    13
    Адрес:
    Moscow
    =) Спасибо, заработало =))) Я, когда с LordPE баловался, пытался эту директорию ставить в 0 (calc.exe), но каких-либо изменений не происходило, т.е файл продолжал нормально запускаться, я и решил что она не сильно важна, и при ребилде exeшника ставил ее в 0, оказалось, что в ней проблема (=
    А можете поподробней рассказать про эту директорию? Как она влияет на работу таблицы импорта? И почему у большинства программ, написанных на Delphi IAT = 0?

    Еще раз спасибо за ответ!
     
  6. LrdSpr

    LrdSpr New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2008
    Сообщения:
    13
    Адрес:
    Moscow
    Чет пост продублировался, а удалить не могу )=
    Вот что нашел относительно IAT:
    на самом деле изначальная идея была в следующем: все IAT'ы всех DLL'ей сводятся в одну непрерывную область памяти, расположенную в секции с атрибутам RO, загрузчик использует IMAGE_DIRECTORY_ENTRY_IAT для нахождения этой самой области и временного присвоения ей атрибута RW, после окончания загрузки вновь восстаналивает.
    некоторые кретины (не бум показывать пальцем) используют IMAGE_DIRECTORY_ENTRY_IAT для быстрого нахождения эффективных адресов API-функций с целью поставить на них хук. в действительности же, IAT'ы не обязаны располагаться в непрерывной области, так что этот трюк не работает. более того IMAGE_DIRECTORY_ENTRY_IAT может быть равен и нулю, правда, тогда некоторые версии винды не восстнавят RO на IAT со всеми вытекающими отсюда...
     
  7. Bazhan

    Bazhan Андрей

    Публикаций:
    0
    Регистрация:
    8 янв 2008
    Сообщения:
    71
    Адрес:
    Украина
    вполне, если у секции в которой находится IAT установлен атрибут IMAGE_SCN_MEM_WRITE
     
  8. Bazhan

    Bazhan Андрей

    Публикаций:
    0
    Регистрация:
    8 янв 2008
    Сообщения:
    71
    Адрес:
    Украина
    LrdSpr
    добавляя секции, не забывай учитывать, что есть данные которые могут находиться вне секций
    (IMAGE_DEBUG_DIRECTORY->PointerToRawData, IMAGE_DATA_DIRECTORY->certificate table)
     
  9. LrdSpr

    LrdSpr New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2008
    Сообщения:
    13
    Адрес:
    Moscow
    Спасибо Bazhan, учту.
     
  10. litrovith

    litrovith Member

    Публикаций:
    0
    Регистрация:
    20 июн 2007
    Сообщения:
    509
    LrdSpr, а ну ка давайте посмотрим что будет, если старую таблицу импорта(директорию) забить нолями ;) ?
     
  11. litrovith

    litrovith Member

    Публикаций:
    0
    Регистрация:
    20 июн 2007
    Сообщения:
    509
    немного неправильно сказанул(лето), короче, LrdSpr, попробуйте потереть всё что связано со старыми импортами
     
  12. LrdSpr

    LrdSpr New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2008
    Сообщения:
    13
    Адрес:
    Moscow
    Ну если потереть только то, что я перенёс, а в нашем случае это IMAGE_DIRECTORY_ENTRY_IMPORT (т.е старый список IMAGE_IMPORT_DESCRIPTOR ов), то все работать будет. Так как названия функций и библиотек не входят в IMAGE_DIRECTORY_ENTRY_IMPORT, соответственно RVA, которые я скопировал, будут продолжать исправно указывать на нужные данные. В этом можно убедиться забив нулями старую табличку импорта при помощи LordPe.
     
  13. expert

    expert New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2009
    Сообщения:
    151
    bound import занули..
     
  14. LrdSpr

    LrdSpr New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2008
    Сообщения:
    13
    Адрес:
    Moscow
    Он у меня зануляется! =)
     
  15. litrovith

    litrovith Member

    Публикаций:
    0
    Регистрация:
    20 июн 2007
    Сообщения:
    509
    LrdSpr, ну тогда и флаг вам в руки, раз думать не хотите )
     
  16. LrdSpr

    LrdSpr New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2008
    Сообщения:
    13
    Адрес:
    Moscow
    Не не не, =) я в этом направлении тож думаю, тока времени не совсем хватает =) Как будут наработки выложу!