две DLL по одному адресу
Я, например, понимаю организацию .so библиотек в UNIX, а вот организация библиотек в Windows как-то не понятна... Можете разъяснить?
А с чего ты вязл, что они грузятся по одному адресу? ;)
Может, ты имел в виду ImageBase? это у всех одинаково - 0x10000000.
Почитать про Dll очень подробно и предельно понятно можно у Джеффри Рихтера, "Часть IV: Динамически подключаемые библиотеки.", раздел - "Модификация базовых адресов модулей" там описывается именно то, что ты хотел узнать :о)
В сети эта книжка есть - советую прочесть! многие вопросы отпадут сами собой после этого :о)
[QUOTE=disasm]Как в Windows по одному адресу в адресном пространстве процесса могут находится две разные DLL? Как это возможно?[/QUOTE] У всякой библиотеки в заголовке значится базовый адрес (ImageBase), который, при желании, можно изменить. Если библиотека не может быть загружена по данному адресу, она загружается в свободный участок памяти, а все адреса в заголовках секций PE пересчитываются. ImageBase - всего лишь предпочтительный адрес загрузки. Исключение составляют системные библиотеки, во всех программах каждая из них загружается по одному и тому же адресу.
Идея понятна, но как тогда собрать библиотеку с возможностью динамического изменения адреса, ведь код библиотеки обращается к своим данным напрямую, а не через GOT например.. Как это реализовать на ассемлере я знаю, а вот как на C/C++ (например с помощью компилятора MSVCPP) это сделать?
Не волнуйся, компилятор и линкер сделают это за тебя.
А вот в отладчике (IDA) этого не видно...
Блин, ну проще простого ведь. Не знаю, как в IDA - не пользовался, но в Process Explorer Руссиновича все прекрасно видно.
Выбираешь любое приложение, нажимаешь на кнопку DLL и любуешься. Возможно, придется включить отображение колонок "Image Base" и "Base", если не включены по умолчанию. Для приложения с плагинами, например, Far, картина получается весьма интересной.
Мне казалось, что это дизассемблер.