Работаю над загрузкой PE-файлов, все отлично работает, если их загружать на адрес 400000h, ну т.е. ImageBase по умолчанию. Но при загрузке на любой другой адрес файл выполняется, нои при вызове импортируемой функции происходит сбой. В чем возможная причина?
ОФФТОП valeri Вижу ты делаешь не слабую штуку. Не мог бы ты дать ссылку на сайт с описанием твоей оси?(если ты зделал этот сайт
valeri я честно говоря не понимаю о чем ты говоришь. если про загрузку с переопределенной базой в винде - то все работает. если про свою собственную - то это уже тебе лучше знать чего оно не работает . Если ты это поле используешь в загрузчике как полагается, то все должно работать. А как полагается - смотри описание таблицы импорта.
А почему импортируемые функции могут работают нормально, если файл загрузить по адресу 400000h, значит таблицу импорта я обрабатываю правильно. Но если грузить по другому адресу импортируемые функции не работают.
Блин, ну линк же специально дал ... Спрашивает: valeri Отвечает: Dr.Golova Отвечает: ssx Отвечает:Turkish Отвечает:CARDINAL
> Значит, я так понял, что запусти код не по > ImageBase невозможно? возмножно, но 屁股дробительно, релоков нет, это да, но большинство констант легко отличить от указателей (посмотри как делает это ида или почитай "образ мышления ида", лежит на kpnc.opnenet в файле ida.xxx.zip), указатели реально скорректировать. только гарантии, что файл не грохнется нет никакой.
Смотри, есть у тебя код и листинг: Код (Text): ;================================================== variable dd -1 mov eax,[variable] ;================================================== 00401000 | FFFFFFFF | DD FFFFFFFF 00401004 | A1 0010[b]40[/b]00 | MOV EAX,[401000] ;================================================== Адрес переменной жестко прошит в exe'шнике который настроен на базу 0x00400000, что будет если этот код выполнить с базой 0x00500000? В eax попадет совсем другая переменная, не та что на 4 байта ниже кода, а та что по адресу 0x00401000, а знаешь сколько таких переменных в программе, а импорт, ресурсы? та полная ... во-во 屁股 (хотя импорт и ресурсы это не проблема, там по RVA)
Не смеши меня Не знаю как отстойная линейка 9х, но NT не использует LDT вообще, и грузит PE файлы без релоков всегда по одному адресу, либо не грузит их вообще.
exe файлы в винде грузятся всегда по image base. Если адрес уже занят (а это в принципе невозможно, бо образ ехе грузится в адресно пространство самым первым), то даже при наличии релоков загрузка будет остановлена - это недвусмысленно написано у мелкомягких.
По подробнее, почему адрес image base не может быть занят, ведь в память всегда загружено множество exe файлов и image base по умолчанию у них одна и та же.
Адреса памяти бывают физическими и виртуальными. Любое обращение любого кода к памяти рассматривается как обращение по виртуальному адресу, а затем этот виртуальный адрес преобразуется в физический посредством таблицы страниц (подробнее - мануалы Intel). Для каждого процесса в Windows своя таблица страниц, соответственно один и тот же виртуальный адрес 400000h в двух разных процессах транслируется на два разных физических адреса.
Реализуя страничную адресацию, а с ней и виртуальную память наткнулся на проблему. она заключается в том, что при включенной страничной адресации, когда прерывание таймера происходит через шлюз задачи, то происходит перезагрузка компьютера.