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
File align Object align Image Base зачем?
1) "File align - В байтовом значении указывает на границу на которую секции дополняются 0 при размещении в файле."
2)"Object align - выравнивание программных секций"
3)"Image Base - виртуальный начальный адрес загрузки программы (ее первого байта)."
1)File align. Это значит, какого размера кусок файла загрузить в сегмент?
2)Object align. ???
3)Image Base. Адрес от чего отсчитывается? От начала первого сегмента программы?
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
Еще, что такое аттач?
ы. аттач - это картинка, что тут прикреплена была :)
а вообще скомпилируйте на фасме этот код из обучащего курса
Код:
А можно записывать что нибудь в облать памяти, которая вне секции на этом сегменте?
это и еще что-нибудь про защищенную плоскую модель памяти со страничной адресацией
//возьмите уже PETools там есть карта памяти процесса, есть редактор и вьювер PE-файлов и всё наглядно будет видно.
советую еще почитать
//возьмите уже PETools там есть карта памяти процесса, есть редактор и вьювер PE-файлов и всё наглядно будет видно.
Загрузчик номерочков и оффсетов к ним в формате COL2 так же не сложно написать очень похоже, что в COL2 вместо имён моделей используются уникальные идентификаторы - ID, но пока что дальше заголовка информацию распознать не получается формат COL для меня такой же не понятный, как и COL2.