(13.09.2010 21:00)Sav Wrote: Прошу прощения за тупой вопрос: динамический адрес может меняться при нескольких запусках программы на одном компьютере или только на разных компьютерах? И вообще, может кто-нибудь дать мне точное определение этого понятия?
Что-то никто не дал нормальный ответ. Теперь попробую я.
Для этого маленького исследования потребуется (из прог, которые мне знакомы):
либо PE Explorer,
либо не так давно найденная мной замечательная и очень компактная программка LordPE,
либо супермаленькая прога Икзелиона, некогда выложенная Дьяконом в приложение к одному из туториалов,
да почти любой дизасм.
В любом случае, нужна программа, позволяющая посмотреть сегментацию экзешника, его деление на секции. В принципе, подходит та же IDA, только там почему-то не видна секция .rsrc (видимо, за ненадобностью).
Мне лично нравится отображение секций в PE Explorer. Поэтому приведу скрин с него:
Size of Raw Data – размер секции непосредственно в файле.
Virtual Size – размер секции во время работы приложения. Включает в себя Raw Size.
Virtual Adress – адрес начала секции в запущенном приложении.
Pointer of Raw Data – адрес начала секции в файле.
Нетрудно заметить, что для сод-секций Virtual Adress = Pointer of Raw Data + 400000h, а для вог-секций Virtual Adress = Pointer of Raw Data + 465000h.
Для записи/чтения требуется знать только статическое виртуальное пространство, подходящее для этих целей. Достаточно нескольких минут, чтобы понять, что есть три НЕподходящих области:
1. < 401000h. В этих адресах работает система, поддерживая работу запущенного приложения. Также там находится стек. Запись/чтение там просто бесполезны и могут убить приложение.
2. >=6AD000/<701000. Иначе говоря, вся секция .rsrc. Этой секции просто не выставлены флаги Readable/Writeable, поэтому никаких операций с ней не выйдет и всё закончится вылетом (хотя можно выставить флаги и юзать, но лучше уж добавить новую секцию). Львиную долю её занимают иконки экзешника, также там информация о файле, менюшка, доступная в оконном режиме, и прочее.
3. >=293512Ch (21AE12C + 787000). Основная динамическая память. Сюда подгружаются библиотеки, здесь создаёт свои аллоки экзешник.
Существует закономерность: чем больше размер буфера, выделяемого в динамической памяти, тем больше шансов, что его адрес будет более статичен. Отюда многие заблуждения и принятие динамических адресов за статические. Достаточно запустить игру под отладчиком, подгрузить дополнительную длл или ресурс, запустить exe на другой системе или машине – и адрес окажется вовсе не таким.
Вот и всё.
Дополнения и уточнения принимаются, так как этот пост написан на основе личного практического знания.