Для чего нужен RVA

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Для чего нужен RVA

Сообщение BP » 16.08.2004 (Пн) 3:35

Как это число использует загрузчик?

Approximator
Постоялец
Постоялец
 
Сообщения: 572
Зарегистрирован: 26.06.2004 (Сб) 3:10

Re: Для чего нужен RVA

Сообщение Approximator » 16.08.2004 (Пн) 3:47

ответ на сабж
Относительный (относительно Image base) адрес.
BP писал(а):Как это число использует загрузчик?

А как его будет использовать загрузчик зависит от того каков контекст (чего именно это RVA, их в PE-заголовке аж двенадцать штук). Если же вопрос был совсем общим, то загрузчик использует это число для нахождения сегмента в файле.
С уважением, Approximator.

BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Сообщение BP » 16.08.2004 (Пн) 4:41

Относительный (относительно Image base) адрес.

Ну прочесть это я и сам смог (по твоим источникам кстати).
Но вот связать RVA c Image base (чаще всего &H400000) никак не получается.

загрузчик использует это число для нахождения сегмента в файле

Под сегментом ты имел ввиду секции?
Так у них и так всё известно. Section RVA и Physical Offset.

Вот у меня есть формула вычисления позиции в файле по RVA. Я её делал для 16 таблиц (импорт, экспорт, ресурсы и т.д.), но она вроде работает для всех RVA

Код: Выделить всё
Function TABLE_PhysicalOffset(TABLE_RVA As Long) As Long
'TABLE_RVA - Смещение к таблице в PE-заголовке
'          (находится в PE_HEADER.Export_Table_RVA, .Import_Table_RVA, .Resource_Table_RVA...
'           всего 16 таблиц)
'----------
'SectionRVA - Смещение к очередной секции
'          (берётся из таблицы этой секции OBJHDR.SectionRVA)
'--------------
'PhysicalOffset - Реальное смещение к очередной секции в файле
'                  относительно начала файла

Dim SectionAddr_RVA As Long, SectionAddr_File As Long
For EnumSections = 1 To UBound(Sections)
  'Проверить находится ли искомый RVA в диапазоне адресов конкретной секции
  If TABLE_RVA >= Sections(EnumSections).SectionRVA And TABLE_RVA <= Sections(EnumSections).SectionRVA + Sections(EnumSections).VirtualSize Then
    'Смещение в файле = RVA - (RVA начала секции) + (Смещение к началу секции в файле)
    TABLE_PhysicalOffset = TABLE_RVA - Sections(EnumSections).SectionRVA + Sections(EnumSections).PhysicalOffset
  End If
Next EnumSections
End Function


===
Если уж совсем в общем, то нахрен этот RVA нужен? Не, ну он конечно нужен (наверное) вот только зачем? Может это разница между выравниваниями в памяти и в файле? А может он како то хитро суммируется с Image Base? Или может с точкой входа какая связь?
Блуждаю вот блуждаю, а решение как у GSerg'a - очевидно для всех, кроме меня.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 16.08.2004 (Пн) 8:39

Объясняю... :)
Заранее ведь неизвестно, куда именно загрузчик загрузит файл - куда место будет, туда и загрузит. Вот для того, чтобы адреса работали в любом случае, независимо от места реальной загрузки, используется не абсолютная виртуальная адресация (VA), а относительная (RVA), где каждый адрес - это не адрес, а расстояние от места реальной загрузки. А место реальной загрузки будет известно, когда состоится оная :)

И вообще, вот вам мануал по формату PE на русском языке, там всё красиво :)
Вложения
pe.zip
Мануал по PE на русском
(54.7 Кб) Скачиваний: 90
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Сообщение BP » 16.08.2004 (Пн) 14:40

абсолютная виртуальная адресация (VA), а относительная (RVA)

По крайней мере эти(выделенные) слова мне знакомы и по этому с теорией покончено.
А как насчёт практики? Не мог бы ты пошагово расписать механизм позиционирования RVA в памяти непосредственно?
Ни или хотя бы скажи что распологается по нулевому RVA.

вот вам мануал по формату PE

За хелп спасибо. Правда это всего лишь красиво оформленное описание от Hard Wisdom. Кстати несколько отличается от описания Iczelion'а. У последнего сложнее, зато выполнено по всем правилам.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 16.08.2004 (Пн) 14:46

Нулевой RVA - это HINSTANCE.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Сообщение BP » 16.08.2004 (Пн) 14:52

Спасибо. А что за ним следует?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 16.08.2004 (Пн) 15:28

Досовский заголовок. А за ним - заголовок PE. Всё как в файле.
Думаешь, зачем функции работы с ресурсами требует HINSTANCE? Это же указатель на начало образа исполняемого файла в памяти. Эти функции из него находят ресурсную секцию и работают с ней.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Сообщение BP » 16.08.2004 (Пн) 16:43

Тогда ещё вопрос. Если это относительный адрес, то относительно чего?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 16.08.2004 (Пн) 17:09

Относительно места реальной загрузки. Относительно HINSTANCE то есть.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Сообщение BP » 17.08.2004 (Вт) 0:38

А как создать самому этот RVA? Есть какая то формула?

Approximator
Постоялец
Постоялец
 
Сообщения: 572
Зарегистрирован: 26.06.2004 (Сб) 3:10

Сообщение Approximator » 17.08.2004 (Вт) 3:30

BP писал(а):
Относительный (относительно Image base) адрес.

Ну прочесть это я и сам смог (по твоим источникам кстати).

Тогда не пойму, что именно тебе нужно.
Но вот связать RVA c Image base (чаще всего &H400000) никак не получается.

Когда выдаётся время пишу перелинковщик. Будет что-нить стоящее сброшу сюда.
загрузчик использует это число для нахождения сегмента в файле

Под сегментом ты имел ввиду секции?

Ты опять? :) И нравится же тебе спорить о словах...
Если уж совсем в общем, то нахрен этот RVA нужен? Не, ну он конечно нужен (наверное) вот только зачем? Может это разница между выравниваниями в памяти и в файле? А может он како то хитро суммируется с Image Base? Или может с точкой входа какая связь?
Блуждаю вот блуждаю, а решение как у GSerg'a - очевидно для всех, кроме меня.

GSerg тебе всё правильно сказал. Здесь простая идея - mem-mapped-images. Иначе их будет неудобно хранить и загружать.
С уважением, Approximator.

Approximator
Постоялец
Постоялец
 
Сообщения: 572
Зарегистрирован: 26.06.2004 (Сб) 3:10

Сообщение Approximator » 17.08.2004 (Вт) 3:34

GSerg писал(а):И вообще, вот вам мануал по формату PE на русском языке, там всё красиво :)

Не, так не честно :) Такая у меня уже есть.
С уважением, Approximator.

Approximator
Постоялец
Постоялец
 
Сообщения: 572
Зарегистрирован: 26.06.2004 (Сб) 3:10

Сообщение Approximator » 17.08.2004 (Вт) 3:37

BP писал(а):А как создать самому этот RVA? Есть какая то формула?

"Формула, где формула?!" Ты хочешь написать свой компилятор?
С уважением, Approximator.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 4

    TopList