Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

File align Object align Image Base зачем?

5.9K
09 июня 2010 года
qwerpoi
17 / / 31.05.2010
Пытаюсь вникнуть в PE формат, непонял:


1) "File align - В байтовом значении указывает на границу на которую секции дополняются 0 при размещении в файле."
2)"Object align - выравнивание программных секций"
3)"Image Base - виртуальный начальный адрес загрузки программы (ее первого байта)."

1)File align. Это значит, какого размера кусок файла загрузить в сегмент?
2)Object align. ???
3)Image Base. Адрес от чего отсчитывается? От начала первого сегмента программы?
8.2K
10 июня 2010 года
bagie2
299 / / 26.10.2008
File Alignment - на это значение выравниваются секции на диске. Т.е. если секция в файле у вас размером 100 байт, то она должна быть выровнена до 512, если 513 то до 1024 и т.д. (File Alignment обычно 0x200, реже 0x400. других значений не припомню)

Object Alignment (иногда наз. Section Alignment) - это то же самое, что и File Alignment, только разница в том, что File Alignment отвечает за выравнивание секций на диске (в самом PE-файле), а Object Alignment - когда PE-файл проецируем в память и делает это загрузчик. Обычно равен 0x1000.

File Alignment и Object Alignment распростряняется кроме секций и на весь заголовок MZ+PE (он как отдельная секция получается) с ограничением, что размер заголовка MZ+PE максимум 64кб

Пример. Допустим мы делаем вручную PE-файл. Все заголовки вышли у нас на 832 байта. Мы должны их выровнять на File Alignment (в нашем случае пусть 0x200) в большую сторону - это значит, что мы остатки в заголовке должны заполнить нулями или чем угодно другим. Теперь у нас весь хидер занимает 1024 байта. Далее могут идти сами секции. Пусть у нас секция с кодом. Размер всего кода 10456 байт но мы должны также выровнять его на 0x200 = 10752 байт (остатки также заполняем нулями или чем хотим) и сохранить в таком виде секцию в PE-файл. Теперь когда эта секция будет отображаться на адресное пространство процесса загрузчик этот размер 10752 выровняет на Object Alignment (0x1000) и получится 12288 байт.

Последнюю секцию в файле можно и не выравнивать на File Alignment - работать будет, хотя лучше наверное это сделать.

Еще поглядите аттач. У секции CODE V.Size = 0x3EEC4, а теперь V. Offset у след. секции DATA = 0x40000, что равно выровненному на 0x1000 значению 0x3EEC4 + 0x1000(V. Offset у CODE)

Надеюсь всё теперь понятно стало?

ImageBase это базовый адрес. на этот виртуальный адрес будет отображен образ исполняемого модуля в адресном пространстве процесса. у DLL файлов он является предпочитаемым, но может меняться, а чтобы все абсолютные адреса в программе после этого указывали туда куда нужно используют релоки (Relocations\Fix-Up Table) (это отдельный раздел по формату PE)
также ImageBase динамически меняется, когда применяется техника его сокрытия ASLR

еще заметьте, что адреса в PE-формате имеют вид относительных (RVA - Relative Virtual Address) дак вот чтобы вычислить абсолютный VA (Virtual Address) просто плюсуют ImageBase к какой надо RVA
5.9K
10 июня 2010 года
qwerpoi
17 / / 31.05.2010
Понял, но не понял, что делается, когда выполнение доходит до конца секции в памяти. Кто перекинет выполнение на следующую? Может, ос? Или надо позаботиться об этом мне (типа jmp).
Еще, что такое аттач?
8.2K
11 июня 2010 года
bagie2
299 / / 26.10.2008
да ничего не происходит) обычно весь код программы лежит в одной секции и кто сказал что весь код в секции выполняется обязательно последовательно пока не кончится?)))
ы. аттач - это картинка, что тут прикреплена была :)

а вообще скомпилируйте на фасме этот код из обучащего курса
Код:
format PE GUI 5.0 at 0x400000 ; ImageBase == 0x400000

include 'win32wxp.inc'
include 'encoding/win1251.inc'

section '.code' readable executable

        entry $

@@:     invoke MessageBox,0,ololo,'???',MB_ICONERROR+MB_YESNO
        cmp eax,IDYES
        jne @b

        invoke MessageBox,0,'Так точно :)','Ыыы',MB_ICONWARNING

        invoke ExitProcess,666

section '.data' data readable

        ololo du 'Тролль детектед?)',0

section '.idata' data import readable writeable

        library kernel32,'KERNEL32.DLL',\
                user32,'USER32.DLL'

        import_kernel32
        import_user32

        all_api
5.9K
11 июня 2010 года
qwerpoi
17 / / 31.05.2010
Я с фасмом не знаком, скачал FASM v1.6, не компилится, может, не та версия?

А можно записывать что нибудь в облать памяти, которая вне секции на этом сегменте?
8.2K
12 июня 2010 года
bagie2
299 / / 26.10.2008
советую еще почитать это и еще что-нибудь про защищенную плоскую модель памяти со страничной адресацией

//возьмите уже PETools там есть карта памяти процесса, есть редактор и вьювер PE-файлов и всё наглядно будет видно.
61K
19 июня 2010 года
Labia
4 / / 17.06.2010
Загрузчик номерочков и оффсетов к ним в формате COL2 так же не сложно написать очень похоже, что в COL2 вместо имён моделей используются уникальные идентификаторы - ID, но пока что дальше заголовка информацию распознать не получается формат COL для меня такой же не понятный, как и COL2.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог