Столкнулся с проблемой: если если RVA таблиц импорта и экспорта (например NtPE_Header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress) в PE файле использовать как файловые смещения то по этим смещениям содержится всякий мусор. В статье "Вызов функции в другом процессе" http://www.rsdn.ru/article/baseserv/runcode.xml чтобы найти таблицу экспорта, VirtualAddress ипользуется как смещение относительно базы образа в памяти процесса. Как преобразовать VirtualAddress в файловое смещение, как загрузчик находит таблицы импорта и экспорта в файле ?
Находишь какой секции принадлежит RVA, вычитаешь из RVA, RVA секции и прибавляешь физический адрес секции, получаешь файловую проекцию на данные. Код (Text): DWORD RVA2RAW(DWORD RVA) { for(int i=0;i<SectionNum;i++) { memcpy(&TempSection, &VirtualFile[PEHeader+0x18+SizeOfOptionalHeaders+(i*0x28)],0x28); { TempSection.VirtualSize = AlignValue(TempSection.VirtualSize, SectionAlignment); if(RVA>=TempSection.VirtualAddress && RVA<TempSection.VirtualAddress+TempSection.VirtualSize) { if(TempSection.PhysicalOffset + (RVA - TempSection.VirtualAddress) > FileSize) return TempSection.PhysicalOffset+(RVA-TempSection.VirtualAddress); } } } }
Аесли RVA таблиц импорта и экспорта не принадлежат ни одной секции ? kernel32.dll Код (Text): Export Table: VirtualAddress 0x0000262C Import Table: VirtualAddress 0x00081778 .text: VirtualAddress 0x00085000 .data: VirtualAddress 0x0008A000 .rsrc: VirtualAddress 0x000F2000 .reloc: VirtualAddress 0x00000000
Как же не принадлежат? Код (Text): .text: VirtualAddress 0x00085000 Этой секции принадлежат, таблицы лежат внутри, т.к. их RVA меньше. Только как у вас начало виртуальной проекции первой секции так далеко находится, возможно это конец виртуальной проекции секции. Чем адреса смотрите?
Опа, сверился с PE Explorer и нашел ошибку в своей програме - пропустил первую секцию. Код (Text): Export Table: VirtualAddress 0x0000262C Import Table: VirtualAddress 0x00081778 .text: VirtualAddress 0x00001000 SizeOfRawData 0x00083200 .data: VirtualAddress 0x00085000 .rsrc: VirtualAddress 0x0008A000 .reloc: VirtualAddress 0x000F2000 Теперь видно что таблицы импорта и экспорта находятся в секции .text. Смотрю своей программой, только ещё не дописал её до конца. Застрял вот на импорте и экспорте. Спасибо за помощь !