Загрузка адреса

Тема в разделе "WASM.BEGINNERS", создана пользователем dev001, 12 фев 2012.

  1. dev001

    dev001 New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2010
    Сообщения:
    6
    Добрый вечер

    Возник один вопрос по поводу загрузки адреса.

    И так имеем выполняемый файл PE формата, из заголовков файла нам известен базовый (желаемый) адрес загрузки образа в память.

    Предположим в некую переменную мы загружаем адрес строки (например Hello world).
    Код (Text):
    1.     mov [ebp-4], 0xxxxxxxx ; адрес константной строки
    На этапе компиляции ее адрес к примеру 0x00403000.

    Все хорошо когда приложение загружается по базовому адресу, а что будет если ее базовый адрес будет другим, тогда каким то магическим образов должен поменяться адрес и константной строки?

    Что в данной ситуации происходит, когда система загружает образ по другому базовому адресу? Заменяются ли адреса на данные, которые лежат в секции data?
     
  2. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    dev001
    Адреса заменяются на другие (правильные) адреса. Но только при наличии в образе PE директории релоков, которая описывает, где находятся места, которые нужно заменять. Если директория релоков отсутствует, образ либо грузится по адресу, предусмотренному при компиляции, либо не грузится вообще (если такой адрес уже занят).
     
  3. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    На то есть релоки. Там указаны адреса кодовой секции которые нужно пофиксить в случае загрузки по другому адрес. В данном случае загрузчик заменит 0x00403000 на другое значение.
     
  4. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    Релоки.
     
  5. dev001

    dev001 New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2010
    Сообщения:
    6
    спасибо за разъяснение данного вопроса...

    но тут же появился другой вопрос, на счет сегментного регистра ds.


    Можно для создаваемых потоков переназначать значение ds в контексте потока?

    ОС инициализируем если я правильно понял регистр ds с определенным значение (из дебага оно было рано 0), а что если на моменте выполнения потока сохранить старое значение регистра и для этого потока его переназначить и возможно ли такое?

    Т.е при выполнении какого то кода, в регистре ds будет храниться смещение от начального адреса где расположен код выполнения и используя относительные смещения от базового адреса, добираться до нужного места таким вот образом.

    Или где можно почитать доходчивую литературу по сегментым регистрам, как с ними работать, что можно делать а что нельзя...
     
  6. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    dev001
    Можно.
     
  7. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    dev001
    Изменения любых регистров локальны для потока. В том числе и ds.
    Значение ds не может быть равно нулю (система туда грузит 0x23). Точнее может быть, но любое обращение через этот регистр (т.е. большинство обращений к памяти) вызовет исключение и свалит процесс.
    В сегментных регистрах не хрантися ни смещение, ни база. Там хранится селектор сегмента. Поэтому, чтобы заменить значение ds на своё, придётся сначала попросить Windows создать соответствующий дескриптор сегмента.

    Начать можно с первых пяти статей отсюда (но у автора, по-моему, неверное понимание некоторой терминологии). Потом имеет смысл прочитать эту статью. А вообще, естесственно, самый надёжный источник — официальный (как по мне, удобнее всего взять трёхтомник).
     
  8. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    sasm.narod.ru, короче никак не описать основы. А сегментный регистр имеет теневую часть, где хранится часть дескриптора. В противном случае при каждом обращении к сегменту пришлось бы обращаться к GDT/LDT, а это задержки.
     
  9. dev001

    dev001 New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2010
    Сообщения:
    6
    спасибо будемс читать :)
     
  10. MMIX

    MMIX New Member

    Публикаций:
    0
    Регистрация:
    9 дек 2011
    Сообщения:
    385
    Наверное вот еще можно тоже зачитать -- http://www.wasm.ru/article.php?article=ollydbg33
    сасм.народ.ру да, понятнее (и короче) на русском нету ни у кого основ.
    брокенсворд -- имхо одна вода.
     
  11. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    MMIX
    сасм.народ.ру - чем не основы. Если вы их понимать не хотите, это уже другой вопрос. Я знаю всё это, читаю и могу вас заверить что описание краткое, грамотное и достаточное для понимания общей картины. У меня какое то внутреннее чувство говорит что вы не от туда движитесь. Тоесть необходимо вначале понять общие принципы, только потом изучать глубже. Хотя я поступаю иначе, к примеру книгу читаю с конца и топик. На счёт этого мне сказать нечего.
     
  12. MMIX

    MMIX New Member

    Публикаций:
    0
    Регистрация:
    9 дек 2011
    Сообщения:
    385
    Malfoy

    Вы не поняли -- я и говорю, что сасм.народ.ру -- понятнее и короче чем кто-либо на русском. :)

    Я изучал и сасм и брокенсворда. Основы я понимаю (наверное).