Может ,цитирую http://www.rsdn.ru/article/baseserv/pe_coff.xml "Автор: Мэтт Питрек Секреты системного программирования в Windows 95. Глава 8."
Кому мне верить? Файлу http://www.microsoft.com/whdc/system/platform/firmware/pecoff.mspx или файлу WinNT.h из VS2008 ?Структура данных описанная в них почему то отличается =/
winnt.h конечно ты же на нее будешь ссылаться почитай статьи "От зеленого к красному" и статью Питрека "Форматы РЕ и COFF объектных файлов" там довольно просто описано
1. если IMAGE_IMPORT_DESCRIPTOR.TimeDateStamp==0 то патчим адреса в FirstThunk, а имена/ординалы берем из OriginalFirstThunk 2. если IMAGE_IMPORT_DESCRIPTOR.TimeDateStamp==-1 то это так называемый новый стиль привязки и используется BOUND_IMPORT И из какого места дллки вытаскивать этот TimeDateStamp? посмотри PE редактором FileHeader, посмотри при помощи CFFexplorer на мой взгляд он удобен и будет полезно почитать http://www.rsdn.ru/article/baseserv/peloader.xml
Подскажите какие есть ограничения по базе загрузки ПЕ файла в виртуальное АП? ЗЫ:можно линкеру VS 2008 как то указать какая имидж база должна быть?
дык 1. Project Properties->Linker->Advanced->Base Address 2. в коде: #pragma comment( linker, "/BASE:0x77777777" )
Надеюсь понятно на что намекает цитата? Если оставить релоки — похоже никаких. XP SP2 грузит PE .Exe с нулевой базой по виртуальному адресу 0x10000; туда же грузит, судя по результатам экспериментов, в случае нестыковки: к примеру, с базой 0x7FFF0000 или 0xBFFF0000 (хотя при базе 0x7FFF0000 могла бы и по родному адресу). Естественно, для нормальных баз релоки не используются.
Ещё такой вопрос.Допустим есть секция,и несколько связанных с ней блоков релоков.Первый из этих блоков будет всегда указывать в начало секции(имею ввиду IMAGE_BASE_RELOCATION.VirtualAddress)? Или необязательно?
_nic, Судя по LdrProcessRelocationBlockLongLong(), упорядоченность фиксапов безразлична. Могу ошибаться. Возьми себе WRK и не дури людям голову.
нет, не обьязательно.. релоки можно засунуть в любую секцию по любому разумному адресу, и в DataDirectory указать RVA и size релоков
Подскажите отладочную софтинку в которой видно что из себя представляет PE файл,в загруженном виде в памяти.
В FirstThunk адреса ф-ций должны быть по тому же индексу в массиве, что и их имена в OriginalFirstThunk ?
Да. Это два массива параллельных и идентичных до загрузки. В процессе загрузки один из них (FirstThunk) заполняется значениями.
Есть DLL со статическим адресом загрузки, есть те, для которых адрес меняется динамически. Смотрите, например, ASLR.
http://ru.wikipedia.org/wiki/Address_Space_Layout_Randomization и что надо линкеру сказать что бы он поставил флаг от этой каки?
/DYNAMICBASE, /DYNAMICBASE:NO -- в зависимости от того, что нужно. В VS тут: Linker -> Advanced -> Randomized Base Address.
Как в конченной7ке эту хрень вообще полностью вырубить? Ключ в рееестре HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\MoveImages с нулем нефига непомагает