Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для Windows/Dos > Перебазирование адресов PE


Автор: ТарасАтавин 13.9.2013, 07:57
Как оно вообще происходит? Хорошо, пусть существует поле с предпочтительным адресом загрузки и все адреса базируются на этот адрес, а когда фактический адрес загрузки отличается от предпочтительного, адреса просто складываются с разностью. Эйси. А как система ищет перебазируемые адреса? Пусть предпочтительный адрес загрузки 0x40000000, данные начинаются с 0x40002000, по этому адресу валяется 4=х байтное целое и где то в коде есть инструкция 
Код
MOV EAX, [0x40002000]
, или 
Код
MOV EAX, 0x40002000
MOV SI, EAX
MOV EAX, [SI]
, а файл загружен по адресу 0x60000000, тогда вместо 0x40002000 должно стоять 0x60002000. 0x40002000+(0x60000000-0x40002000)=0x60002000. Вроде адрес вычислен правильный. Только где его искать в коде исполняемой секции? И как быть если адрес 0x40002000 случайно совпал с константой 0x40002000? Ведь когда 0x40002000 - не адрес, а обычное данное, загружаемое в регистр для каких то математических расчётов, то исправлять его на 0x60002000 уже не надо. А в адресной арифметике
Код
MOV EAX, 0x40002000
ADD EAX, EBX
MOV SI, EAX
MOV EAX, [SI]
 надо.

Автор: _zorn_ 13.9.2013, 09:20
Релоки (relocation table)
Продолжай дальше курить PE формат  smile 

ЗЫ. Ты наверное имел ввиду ESI в своем примере ?

Автор: ТарасАтавин 13.9.2013, 11:14
А где про них можно прочитать?

Добавлено через 24 секунды
Цитата(_zorn_ @  13.9.2013,  09:20 Найти цитируемый пост)
ЗЫ. Ты наверное имел ввиду ESI в своем примере ?
Наверное.

Автор: bems 13.9.2013, 13:01
Цитата(ТарасАтавин @  13.9.2013,  11:14 Найти цитируемый пост)
А где про них можно прочитать?

я тебе давал ссылку на описание формата РЕ, там раздел "The .reloc Section (Image Only)"

Автор: ТарасАтавин 14.9.2013, 12:36
Цитата(bems @  13.9.2013,  13:01 Найти цитируемый пост)
я тебе давал ссылку на описание формата РЕ, там раздел "The .reloc Section (Image Only)"
Простите, где? Пока что я знаю ответ zornа: 
Цитата(_zorn_ @  4.9.2013,  08:51 Найти цитируемый пост)
Начни с простого
http://ru.wikipedia.org/wiki/Portable_Executable
: [quote=]Таблица перемещений[править | править исходный текст]
Файлы PE не содержат позиционно-независимого кода. Вместо этого они скомпилированы для предпочтительного базового адреса, и все адреса, генерируемые компилятором/компоновщиком, заранее фиксированы. Если PE файл не может быть загружен по своему предпочтительному адресу (потому что он уже занят чем-то ещё), операционная система будет перебазировать его. Это включает в себя перевычисление каждого абсолютного адреса и изменение кода для того, чтобы использовать новые значения. Загрузчик делает это, сравнивая предпочтительный и фактический адреса загрузки, и вычисляя значение разности. Тогда для получения нового адреса ячейки памяти эта разность складывается с предпочтительным адресом. Базовые адреса перемещений хранятся в списке и при необходимости добавляются к существующей ячейке памяти. Полученный код является теперь отдельным по отношению к процессу и не является больше разделяемым, так что при таком способе теряются многие из преимуществ экономии памяти динамически загружаемых библиотек. Такой способ также значительно замедляет загрузку модуля. По этой причине следует избегать перебазирования везде, где это возможно; например, библиотеки, поставляемые Microsoft, имеют предварительно вычисленные неперекрывающиеся базовые адреса. В случае отсутствия необходимости перебазировании PE файлы имеют преимущество очень эффективного кода, но при наличии перебазирования издержки в использовании памяти могут быть значительными. Это отличает формат PE от ELF, который использует полностью позиционно-независимый код и глобальную таблицу смещений, которая жертвует временем выполнения в пользу расходования памяти.[/quote] (если я правильно понял). А мне бы подробно про эту таблицу.

Автор: bems 14.9.2013, 13:32
Цитата(ТарасАтавин @  14.9.2013,  12:36 Найти цитируемый пост)
Простите, где?

вот в этом сообщении http://forum.vingrad.ru/index.php?showtopic=371673&view=findpost&p=2581085

Автор: ТарасАтавин 14.9.2013, 16:06
Цитата(bems @  14.9.2013,  13:32 Найти цитируемый пост)
вот в этом сообщении http://forum.vingrad.ru/index.php?showtopi...t&p=2581085 
Мне не чем читать docx.

Автор: bems 14.9.2013, 17:13
можно скачать фриварный опенофис или конвертеры к старым ms-офисам.
и вообще, было бы желание

Автор: ТарасАтавин 15.9.2013, 04:58
Цитата(bems @  14.9.2013,  17:13 Найти цитируемый пост)
можно скачать фриварный опенофис
Давно.

Добавлено через 40 секунд
Цитата(bems @  14.9.2013,  17:13 Найти цитируемый пост)
и вообще, было бы желание 
Этому формату не поможет ни какое желание.

Автор: bems 15.9.2013, 05:16
Цитата(ТарасАтавин @  15.9.2013,  04:58 Найти цитируемый пост)
Давно.

ну у меня опенофис отлично открывает docx

Автор: ТарасАтавин 16.9.2013, 10:42
А у меня он почему-то и doc понимает не до конца.

Автор: bems 16.9.2013, 15:47
ну насчет "не до конца" это есть такое, но docx поддерживается

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)