Вычисление смещения таблицы экспорта

Тема в разделе "WASM.RESEARCH", создана пользователем uni, 19 дек 2006.

  1. uni

    uni New Member

    Публикаций:
    0
    Регистрация:
    23 май 2005
    Сообщения:
    67
    Доброго, уважаемые.
    Такое дело. Не могу понять как получается смещение от начала файла (.dll) таблицы экспорта.
    По смещению 0x0178, где находится описание секций (SECTION_TABLE) таблица экспорта не описана. Её засунули в один из разделов - секцию кода. В IMAGE_OPTIONAL_HEADER в массиве IMAGE_DATA_DIRECTORY для таблицы экспорта (первой записи) указано:
    [0x00F8] VirtualAddress = 0x00067F50
    Когда-то давно я писал свой собстенный peviewer, но он этого файла не берёт, т.к. вложенности секций друг в друга не поддерживает (не дописал я его, а зря). Так вот нашёл я эту секцию просто поиском в hex-редакторе. Поскольку структуру я знаю, что нашёл и начало смещения от начала файла: 0x00066750
    Разница получается 0x1800, хоть убейте не пойму как. Ещё меня смутило что после структуры IMAGE_EXPORT_DIRECTORY где идут массивы с адресами, ординалами и именами функций - так вот в именах функций есть имя этой dll, это нормально? А... в поле name там адрес, потому может мой просмотрщик и слетает, что я тогда не предусмотрел этого. Кстати, если вычесть из адреса, который в name истинное смещение имени dll, то получается вообще 0x40E2. Нифига не понимаю.
    Но вопрос в остался, как вычислить PointerToRawData, если в SECTION_TABLE нет записи.
    Только плз не отсылайте FAQ читать, там везде одно и тоже пишут - сыт по горло. Лучше такой FAQ где про вложенность пишут. Кроме того я видел в секции кода ещё одно вложение, но не понял что это пока, не до этого. dumpbin находит секцию без проблем зараза. Какие поля нужно учитывать?
     
  2. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    Примерно так.
    1. Найти Export_RVA = IMAGE_DATA_DIRECTORY[IMAGE_DIRECTORY_ENTRY_EXPORT]
    2. В списке секций найти секцию s, содержащую Export_RVA (т.е. s.VirtualAddress <= Export_RVA < s.VirtualAddress+s.VirtualSize)
    3. Найти смещение в файле: Export_Offset = (Export_RVA-s.VirtualAddress)+s.PointerToRawData;
     
  3. uni

    uni New Member

    Публикаций:
    0
    Регистрация:
    23 май 2005
    Сообщения:
    67
    Ё-маё, точно так. Я всё смотрю на секцию кода, да кода, а это ресурсы оказывается. Превелико Вам благодарен, нашёл я все смещения. Вопрос исчерпан. (от балда) P.S. Ой балда дважды, какие ресурсы, это .rdata - данные только для чтения.