Таблица адресов импорта дает неверный RVA для имени импорта - PullRequest
2 голосов
/ 24 ноября 2011

У меня проблемы с заголовками Win32 NT, которые дают мне странные RVA для имен импорта.Вот соответствующий код, который вызывает у меня проблему:

//Get a pointer to the import table
PIMAGE_IMPORT_DESCRIPTOR piidImportTableAddr; 
piidImportTableAddr = (PIMAGE_IMPORT_DESCRIPTOR)(pImgNtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress + (DWORD)pMemFile);

while(piidImportTableAddr->Name != 0)
{
    //Itterate over every IMAGE_IMPORT_DESCRIPTOR structure, extracting the names of the DLLs to import
    char* name = (char*)((DWORD)piidImportTableAddr->Name + (DWORD)pMemFile);

    //Do nothing for now

    piidImportTableAddr++;
}

Однако члены структуры piidImportTableAddr содержат адреса с плохими указателями, вот таблица членов:

Characteristics 0x42746553
OriginalFirstThunk 0x42746553
TimeDateStamp 0x646f4d6b
ForwarderChain 0x02260065
Name 0x54746547
FirstThunk 0x4d747865

Это все плохие RVA и области памяти.Есть ли что-то, что я делаю неправильно при поиске имени DLL этим методом?Я сравнил RVA таблицы импорта с той, которая показана в PE Lord, они одинаковые, поэтому я не уверен, почему значения IMAGE_IMPORT_DESCRIPTOR неверны.

Вот ссылка на исходный код целиком: http://pastebin.com/32MBEvWU

Ответы [ 2 ]

1 голос
/ 24 ноября 2011

У вас есть RVA таблицы импорта, но, поскольку модуль не был загружен, разделы все еще находятся в своих физических местоположениях.Физическое смещение раздела импорта обычно отличается от RVA.Вам придется перебирать заголовки разделов (_IMAGE_SECTION_HEADER), и с помощью значений VirtualAddress и VirtualSize найти раздел, содержащий таблицу импорта.Затем получите физический адрес этого раздела из PointerToRawData.

То есть фактический адрес, который вы хотите, выглядит примерно так:

importTableRVA - importSectionRVA + importSectionPhysicalAddress + pMemFile
1 голос
/ 24 ноября 2011

Ваш код создает впечатление, что вы проверяете IAT модуля, который уже был виртуализирован (загружен в память), что означает, что IAT не будет содержать RVA, но вместо этого адреса будут настроены загрузчиком Windows для необходимые динамические смещения.

Однако, учитывая сказанное, данные, сообщаемые LordPE, являются подозрительными, если двоичный модуль действительно действителен (то есть: окна могут загрузить его и он работает), то вы можете иметь дело с запутанным файлом, иначе двоичный файл поврежден или не является файлом Win32 PE.

...