Проясните пожалуйста ситуацию с таблицей импорта. Во всех описаниях PE файлов написано, что таблица импорта (не берем в счет таблицу диапазонного импорта и отложенного) находится по адресу, указанному во втором элементе DATA DIRECTORY. Причем это RVA адресс. Вопрос стоит вот как: как получить RAW Offset на таблицу импорта? Если это делать как в статье Iczelion, то необходимо грузить файл в память (он проецирует файл в память). Так в общем то и у других(например Касперски). Но как тогда системный загрузчик считывает таблицу импорта (он то ведь грузит файл с диска)? Может быть я что-нибудь пропустил, если да то укажите где.
Bubon RVA транслируется в RAW Offset, используя таблицу секций я писал так: Код (Text): RVA2RAW proc uses edi ecx edx ebx,lpPEHeader:DWORD, dwRVA:DWORD LOCAL nSections:WORD LOCAL pSections:DWORD mov edi, lpPEHeader movzx ecx, word ptr [edi].IMAGE_NT_HEADERS.FileHeader.NumberOfSections dec ecx add edi, sizeof IMAGE_NT_HEADERS mov pSections, edi mov edx, dwRVA @TRY_NEXT: mov edi, sizeof IMAGE_SECTION_HEADER imul edi, ecx add edi, pSections mov ebx, [edi].IMAGE_SECTION_HEADER.VirtualAddress add ebx, [edi].IMAGE_SECTION_HEADER.Misc.VirtualSize .if edx >= [edi].IMAGE_SECTION_HEADER.VirtualAddress && edx <= ebx mov eax, edx sub eax, [edi].IMAGE_SECTION_HEADER.VirtualAddress add eax, [edi].IMAGE_SECTION_HEADER.PointerToRawData ; check if it lay in the raw range mov edx, [edi].IMAGE_SECTION_HEADER.PointerToRawData add edx, [edi].IMAGE_SECTION_HEADER.SizeOfRawData .if eax <= edx && eax >= [edi].IMAGE_SECTION_HEADER.PointerToRawData jmp @RETURN .endif .endif dec ecx cmp ecx, -1 jnz @TRY_NEXT or eax, -1 @RETURN: ret RVA2RAW endp