Начал разбираться с 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++)
=) Спасибо, заработало =))) Я, когда с LordPE баловался, пытался эту директорию ставить в 0 (calc.exe), но каких-либо изменений не происходило, т.е файл продолжал нормально запускаться, я и решил что она не сильно важна, и при ребилде exeшника ставил ее в 0, оказалось, что в ней проблема (= А можете поподробней рассказать про эту директорию? Как она влияет на работу таблицы импорта? И почему у большинства программ, написанных на Delphi IAT = 0? Еще раз спасибо за ответ!
Чет пост продублировался, а удалить не могу )= Вот что нашел относительно IAT: на самом деле изначальная идея была в следующем: все IAT'ы всех DLL'ей сводятся в одну непрерывную область памяти, расположенную в секции с атрибутам RO, загрузчик использует IMAGE_DIRECTORY_ENTRY_IAT для нахождения этой самой области и временного присвоения ей атрибута RW, после окончания загрузки вновь восстаналивает. некоторые кретины (не бум показывать пальцем) используют IMAGE_DIRECTORY_ENTRY_IAT для быстрого нахождения эффективных адресов API-функций с целью поставить на них хук. в действительности же, IAT'ы не обязаны располагаться в непрерывной области, так что этот трюк не работает. более того IMAGE_DIRECTORY_ENTRY_IAT может быть равен и нулю, правда, тогда некоторые версии винды не восстнавят RO на IAT со всеми вытекающими отсюда...
LrdSpr добавляя секции, не забывай учитывать, что есть данные которые могут находиться вне секций (IMAGE_DEBUG_DIRECTORY->PointerToRawData, IMAGE_DATA_DIRECTORY->certificate table)
немного неправильно сказанул(лето), короче, LrdSpr, попробуйте потереть всё что связано со старыми импортами
Ну если потереть только то, что я перенёс, а в нашем случае это IMAGE_DIRECTORY_ENTRY_IMPORT (т.е старый список IMAGE_IMPORT_DESCRIPTOR ов), то все работать будет. Так как названия функций и библиотек не входят в IMAGE_DIRECTORY_ENTRY_IMPORT, соответственно RVA, которые я скопировал, будут продолжать исправно указывать на нужные данные. В этом можно убедиться забив нулями старую табличку импорта при помощи LordPe.
Не не не, =) я в этом направлении тож думаю, тока времени не совсем хватает =) Как будут наработки выложу!