Как преобразовать RVA таблицы экспорта в файловое смещение ?

Тема в разделе "WASM.WIN32", создана пользователем Charlief, 4 июн 2011.

  1. Charlief

    Charlief New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2010
    Сообщения:
    129
    Столкнулся с проблемой: если если RVA таблиц импорта и экспорта (например NtPE_Header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress) в PE файле использовать как файловые смещения то по этим смещениям содержится всякий мусор. В статье "Вызов функции в другом процессе" http://www.rsdn.ru/article/baseserv/runcode.xml чтобы найти таблицу экспорта, VirtualAddress ипользуется как смещение относительно базы образа в памяти процесса.

    Как преобразовать VirtualAddress в файловое смещение, как загрузчик находит таблицы импорта и экспорта в файле ?
     
  2. Sunzer

    Sunzer Member

    Публикаций:
    0
    Регистрация:
    25 май 2008
    Сообщения:
    256
    Находишь какой секции принадлежит RVA, вычитаешь из RVA, RVA секции и прибавляешь физический адрес секции, получаешь файловую проекцию на данные.

    Код (Text):
    1. DWORD RVA2RAW(DWORD RVA)
    2. {
    3.  for(int i=0;i<SectionNum;i++)
    4.  {
    5.   memcpy(&TempSection, &VirtualFile[PEHeader+0x18+SizeOfOptionalHeaders+(i*0x28)],0x28);
    6.   {
    7.    TempSection.VirtualSize = AlignValue(TempSection.VirtualSize, SectionAlignment);
    8.    if(RVA>=TempSection.VirtualAddress && RVA<TempSection.VirtualAddress+TempSection.VirtualSize)
    9.    {
    10.     if(TempSection.PhysicalOffset + (RVA - TempSection.VirtualAddress) > FileSize)
    11.     return TempSection.PhysicalOffset+(RVA-TempSection.VirtualAddress);
    12.    }
    13.   }
    14.  }
    15. }
     
  3. Charlief

    Charlief New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2010
    Сообщения:
    129
    Аесли RVA таблиц импорта и экспорта не принадлежат ни одной секции ?

    kernel32.dll
    Код (Text):
    1.  Export Table:    VirtualAddress 0x0000262C
    2.  Import Table:    VirtualAddress 0x00081778
    3.  
    4.  .text:              VirtualAddress 0x00085000
    5.  .data:             VirtualAddress 0x0008A000
    6.  .rsrc:              VirtualAddress 0x000F2000
    7.  .reloc:             VirtualAddress 0x00000000
     
  4. Sunzer

    Sunzer Member

    Публикаций:
    0
    Регистрация:
    25 май 2008
    Сообщения:
    256
    Как же не принадлежат?

    Код (Text):
    1.  .text:              VirtualAddress 0x00085000
    Этой секции принадлежат, таблицы лежат внутри, т.к. их RVA меньше.

    Только как у вас начало виртуальной проекции первой секции так далеко находится, возможно это конец виртуальной проекции секции. Чем адреса смотрите?
     
  5. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    даже если не принадлежат алгоритм остается такой же!
     
  6. Charlief

    Charlief New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2010
    Сообщения:
    129
    Опа, сверился с PE Explorer и нашел ошибку в своей програме - пропустил первую секцию.
    Код (Text):
    1. Export Table:    VirtualAddress 0x0000262C
    2.  Import Table:    VirtualAddress 0x00081778
    3.  
    4.  .text:              VirtualAddress 0x00001000
    5.                       SizeOfRawData 0x00083200
    6.  
    7.  .data:             VirtualAddress 0x00085000
    8.  .rsrc:              VirtualAddress 0x0008A000
    9.  .reloc:             VirtualAddress 0x000F2000
    Теперь видно что таблицы импорта и экспорта находятся в секции .text.
    Смотрю своей программой, только ещё не дописал её до конца. Застрял вот на импорте и экспорте.

    Спасибо за помощь !