Помогите пожалуйста разобраться. Если я правильно понял документацию по формату 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 по другому базовому адресу, чтоб проверить ее работоспособность?
Поменять ImageBase в заголовке недостаточно. Надо пробеждать еще по всем релокейшинам и ко всем элементам В ФАЙЛЕ (!!!) добавить разницу между новой и старой ImageBase (т.е. фактически повторить все то, что делает обычный загрузчик при загрузке по новой ImageBase).
Другими словами все адреса\указатели в коде соответствуют ImageBase, указанной в PE. Поэтому если длл грузится по ImageBase, указанной в PE, то загрузчик их не пересчитывает и "заставить его сделать это" невозможно. Поэтому для изменения базы нужно либо самому пересчитать все адреса (можно заюзать ф-ю ReBaseImage), либо воспользоваться готовыми утилитами типа rebase.exe