Добавление в раздел импорта

Тема в разделе "WASM.RESEARCH", создана пользователем Ikar, 1 сен 2004.

  1. Ikar

    Ikar New Member

    Публикаций:
    0
    Регистрация:
    1 сен 2004
    Сообщения:
    3
    Адрес:
    Singapore
    Собственно возникла проблема с осуществлением сабжа. Как я это делал - расширял последнюю секцию и переносил туда массив IMAGE_IMPORT_DESCRIPTOR[], добавлял к нему новую запись, дописывал IMAGE_THUNK_DATA, делал на них ссылки на имена длл и ф-ии, ну вобщем все как положенно - все утилиты типа dumpbin и PELord открывали это дело нормально и обнаруживали новую длл и ф-ию, но система не в какую не хочет замечать новую длл, загружает без проблем, но длл не подгружается... Еще одна странность, есть такая директория - IMAGE_DIRECTORY_ENTRY_IAT, в некоторых прогах она заполнена, в некоторых нет, доки о ее назначении ничего толком не сказать не могут, хотелось бы узнать ее роль во всем этом... Заранее спасибо за любую помощь.

    PS Простьба на RTFM не посылать тк уже от туда ;)
     
  2. sep

    sep New Member

    Публикаций:
    0
    Регистрация:
    1 июн 2004
    Сообщения:
    51
    "Об упаковщиках в последний раз часть 1" там вроде это обсуждалось. Вот только сегодня читал с большим удовольствием :)
     
  3. Ikar

    Ikar New Member

    Публикаций:
    0
    Регистрация:
    1 сен 2004
    Сообщения:
    3
    Адрес:
    Singapore
    sep

    спасибо, статья мне на многое открыла глаза, но проблемы все таки остались. Вот, например, во всех exe генерируемых vc7 есть такая директория - IAT, насколько я понимаю она содержит массивы OriginalFirstThunk и FirstThunk для каждой DLL, еще мне кажется, что она сделана лишь для ускорения линковки ехе и dll, тк, когда я затираю ее RVA и Size в массиве директорий, ехе нормально грузится... Но! Когда я просто переношу массив IMAGE_IMPORT_DESCRIPTOR и ставлю новую ссылку на него в массиве директорий, то прога вылетает с ошибкой инициализации... Причем эта же самая операция успешно проходит на кривых борландовских файлах, но без IAT.. Я уже незнаю что и думать :dntknw:
     
  4. kaspersky

    kaspersky New Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    3.006
    > Вот, например, во всех exe генерируемых vc7

    и ms vc 6 тоже



    > есть такая директория - IAT

    > насколько я понимаю она содержит массивы

    > OriginalFirstThunk и FirstThunk для каждой DLL

    она указывает на некий FirstThunk. какой? хз.



    > еще мне кажется, что она сделана лишь для ускорения

    > линковки ехе и dll

    ну и как она ее ускоряет? :derisive: предложи хоть один возможный механизм.

    на самом деле изначальная идея была в следующем: все IAT'ы всех DLL'ей сводятся в одну непрерывную область памяти, расположенную в секции с атрибутам RO, загрузчик использует IMAGE_DIRECTORY_ENTRY_IAT для нахождения этой самой области и временного присвоения ей атрибута RW, после окончания загрузки вновь восстаналивает.

    некоторые кретины (не бум показывать пальцем) используют IMAGE_DIRECTORY_ENTRY_IAT для быстрого нахождения эффективных адресов API-функций с целью поставить на них хук. в действительности же, IAT'ы не обязаны располагаться в непрерывной области, так что этот трюк не работает. более того IMAGE_DIRECTORY_ENTRY_IAT может быть равен и нулю, правда, тогда некоторые версии винды не восстнавят RO на IAT со всеми вытекающими отсюда...



    > Когда я просто переношу массив IMAGE_IMPORT_DESCRIPTOR

    > и ставлю новую ссылку на него в массиве директорий,

    > то прога вылетает с ошибкой инициализации...

    а пример вылетающего файла можно?

    ну обнули IMAGE_DIRECTORY_ENTRY_IAT и дело с концом!
     
  5. Ikar

    Ikar New Member

    Публикаций:
    0
    Регистрация:
    1 сен 2004
    Сообщения:
    3
    Адрес:
    Singapore
    kaspersky огромное спасибо за подсказку по поводу IAT и атрибутов RW :) Оказалось все просто - IAT подсказывет загрузчику у каких страниц менять менять атрибуты, но когда я затираю заголовок IAT - загрузчик ничего не меняет и, как результат, массивы FirstThunk доступны только на чтение... Для решения проблемы достаточно у секции содержашей FirstThunk-и поставить аттрибут Write.