Помогите новичку с relocations

Discussion in 'WASM.RESEARCH' started by yura_lvk, Jul 9, 2008.

  1. yura_lvk

    yura_lvk New Member

    Blog Posts:
    0
    Помогите пожалуйста разобраться.
    Если я правильно понял документацию по формату PE,то PE-файл загружается по базовыму адресу, указанному в ImageBase. Если вдруг системный загрузчик не смог этого сделать, то грузимся куда удастся и адреса всех перемещаемых элементов пересчитываются. Так?

    Я делаю следующее:
    есть dll, у которой ImageBase = 0x10000000 и она нормально работает. В HIEW меняю ей ImageBase на 0х20000000 и
    при загрузке она падает. Сделал в Visual'e LoadLibrary (с GlobalFlag'ом равным SHOW_LDR_SNAPS) и получил что инструкция по адресу 0х2000f80e ( mov ) обратилась по недоступному адресу 0х1003027f. Адрес 0х1003027f - это перемещаемый элемент! А теперь вопрос, почему его адрес не пересчитался, и как заставить загрузчик сделать это? И вообще как загрузить dll по другому базовому адресу, чтоб проверить ее работоспособность?
     
  2. dermatolog

    dermatolog Member

    Blog Posts:
    0
    Поменять ImageBase в заголовке недостаточно. Надо пробеждать еще по всем релокейшинам и ко всем элементам В ФАЙЛЕ (!!!) добавить разницу между новой и старой ImageBase (т.е. фактически повторить все то, что делает обычный загрузчик при загрузке по новой ImageBase).
     
  3. leo

    leo Active Member

    Blog Posts:
    0
    Другими словами все адреса\указатели в коде соответствуют ImageBase, указанной в PE. Поэтому если длл грузится по ImageBase, указанной в PE, то загрузчик их не пересчитывает и "заставить его сделать это" невозможно. Поэтому для изменения базы нужно либо самому пересчитать все адреса (можно заюзать ф-ю ReBaseImage), либо воспользоваться готовыми утилитами типа rebase.exe
     
  4. yura_lvk

    yura_lvk New Member

    Blog Posts:
    0
    Спасибо большое dermatolog и leo, теперь понятно как сия штука работает :)
     
  5. crypto

    crypto Active Member

    Blog Posts:
    0
    yura_lvk
    К сож. по жизни встречаются и файлы с пустой таблицей релоков.