Мне казалось, что я это понимаю, но сейчас начинаю сомневаться) собсно, взял программу на делфи, открыл WinHEXом, нашел дворд AddressOfEntryPoint, взял программу на ассемблере(практически пустую, специально скомпилил), открыл WinHEXом, нашел дворд AddressOfEntryPoint сравниваю. Они разные D шутка) значит сравниваю... В первом случаи, RVA адрес указывает точно на начало кода в файле, а во втором, RVA адрес указыает почти на конец последней секции в файле(и по нему идут нули(что понятное дело не так)) Во время исполнения оба они попадают на начало инструкций(тех каких надо) Далее, скомпилил почти пустой код на VC++, там точно так же, как и с Делфи. Про смещения нашел информацию в статьях от Зеленого к красному, там сказано: Что получается, RVA находится в заголовке, значит оно должно быть ровно файловому смещению. А это происходит только в случаи с программой на ассемблере. Отсюда вопрос, Почему?
Алгоритм расчета файлового смещения очень просто: 1. Ищем секцию, к которому принадлежит наш адрес (или RVA) 2. Затем вычисляем разницу между нашим адресом (или RVA) и адресом (или RVA), с которого начинается данная секция 3. К полученному значению из п.2 прибавляем физическое смещение этой секции файле P.S. Если адрес (или RVA) меньше чем адрес (или RVA) самой первой секции, то физическое смещение в файле равно RVA
Luzer Чтобы это проверить рекомендую посчитать файловое смещение для любого адреса с помощью PETools (в нем кстати заодно посмотришь адрес EntryPoint).
Возможно, я чего-то не понимаю) Но если следовать Вашему алгоритму, то я уже на первом пункте "получаю эскепшен", т.к мой rva не находится в секции
елыпалыгнатьменянанары... Я запутался и тупанул. проблема есть у меня, вот только я теперь сам не пойму какая... сейчас все обдумаю. топик втопку