Добрый вечер Возник один вопрос по поводу загрузки адреса. И так имеем выполняемый файл PE формата, из заголовков файла нам известен базовый (желаемый) адрес загрузки образа в память. Предположим в некую переменную мы загружаем адрес строки (например Hello world). Код (Text): mov [ebp-4], 0xxxxxxxx ; адрес константной строки На этапе компиляции ее адрес к примеру 0x00403000. Все хорошо когда приложение загружается по базовому адресу, а что будет если ее базовый адрес будет другим, тогда каким то магическим образов должен поменяться адрес и константной строки? Что в данной ситуации происходит, когда система загружает образ по другому базовому адресу? Заменяются ли адреса на данные, которые лежат в секции data?
dev001 Адреса заменяются на другие (правильные) адреса. Но только при наличии в образе PE директории релоков, которая описывает, где находятся места, которые нужно заменять. Если директория релоков отсутствует, образ либо грузится по адресу, предусмотренному при компиляции, либо не грузится вообще (если такой адрес уже занят).
На то есть релоки. Там указаны адреса кодовой секции которые нужно пофиксить в случае загрузки по другому адрес. В данном случае загрузчик заменит 0x00403000 на другое значение.
спасибо за разъяснение данного вопроса... но тут же появился другой вопрос, на счет сегментного регистра ds. Можно для создаваемых потоков переназначать значение ds в контексте потока? ОС инициализируем если я правильно понял регистр ds с определенным значение (из дебага оно было рано 0), а что если на моменте выполнения потока сохранить старое значение регистра и для этого потока его переназначить и возможно ли такое? Т.е при выполнении какого то кода, в регистре ds будет храниться смещение от начального адреса где расположен код выполнения и используя относительные смещения от базового адреса, добираться до нужного места таким вот образом. Или где можно почитать доходчивую литературу по сегментым регистрам, как с ними работать, что можно делать а что нельзя...
dev001 Изменения любых регистров локальны для потока. В том числе и ds. Значение ds не может быть равно нулю (система туда грузит 0x23). Точнее может быть, но любое обращение через этот регистр (т.е. большинство обращений к памяти) вызовет исключение и свалит процесс. В сегментных регистрах не хрантися ни смещение, ни база. Там хранится селектор сегмента. Поэтому, чтобы заменить значение ds на своё, придётся сначала попросить Windows создать соответствующий дескриптор сегмента. Начать можно с первых пяти статей отсюда (но у автора, по-моему, неверное понимание некоторой терминологии). Потом имеет смысл прочитать эту статью. А вообще, естесственно, самый надёжный источник — официальный (как по мне, удобнее всего взять трёхтомник).
sasm.narod.ru, короче никак не описать основы. А сегментный регистр имеет теневую часть, где хранится часть дескриптора. В противном случае при каждом обращении к сегменту пришлось бы обращаться к GDT/LDT, а это задержки.
Наверное вот еще можно тоже зачитать -- http://www.wasm.ru/article.php?article=ollydbg33 сасм.народ.ру да, понятнее (и короче) на русском нету ни у кого основ. брокенсворд -- имхо одна вода.
MMIX сасм.народ.ру - чем не основы. Если вы их понимать не хотите, это уже другой вопрос. Я знаю всё это, читаю и могу вас заверить что описание краткое, грамотное и достаточное для понимания общей картины. У меня какое то внутреннее чувство говорит что вы не от туда движитесь. Тоесть необходимо вначале понять общие принципы, только потом изучать глубже. Хотя я поступаю иначе, к примеру книгу читаю с конца и топик. На счёт этого мне сказать нечего.
Malfoy Вы не поняли -- я и говорю, что сасм.народ.ру -- понятнее и короче чем кто-либо на русском. Я изучал и сасм и брокенсворда. Основы я понимаю (наверное).