Форум: "Система";
Текущий архив: 2003.07.21;
Скачать: [xml.tar.bz2];
Вниз
CreateProcess в памяти Найти похожие ветки
← →
Samael6 (2003-05-11 13:19) [0]Здравствуйте, Мастера!
У меня такая проблема: нужно загрузить ЕХЕ-файл в память и там его выполнить . Причем приходится переписовать часть стандартного загрузчика, чтобы прога запускалась из памяти. С загрузкой ЕХЕшника проблем нет, а вот как его потом там выполнить незнаю. Поможите?
← →
MBo (2003-05-11 16:05) [1]Забудь пока что
← →
NightAngel (2003-05-12 02:19) [2]> Samael6 © (11.05.03 13:19)
А чем не устраивает CreateProcess()?
> нужно загрузить ЕХЕ-файл в память и там его выполнить.
Принципиальных ограничений здесь нет.
Программы в формате PE в памяти, НЕ СООТВЕСТВУЮТ своему образу на диске. Например, экзешник для DOS"а загружается в память КАК ЕСТЬ - то есть, если побайтно эмулировать его работу (не загружая его в память), то все смещения и переходы будут указывать в нужное место. Для PE файлов это не так. PE программа грузится в память вместе со всеми заголовками. Секции в файле на диске обычно выровнены на размер сектора, в памяти на размер страницы. Это нужно будет учесть при загрузке файла. В запускаемом файле должна присутствовать таблица фиксапов (секции .reloc или .fixup). Если нет - будут проблемы. Значение Image Base, то есть адрес по которому будет загружен PE файл, должно быть выравнено на границу 64 Кб (10000h).
Далее как запустить:
1. Считать файл в память выровнив заголовки и секции.
2. Перенастроить все VA адреса в программе (в соответствии с информацией в секциии .reloc или .fixup).
3. Загрузить все используемые библиотеки и настроить импорт.
4. Если есть Tls callback, то пройти по списку функций.
5. Передать управление программе по Entry point RVA - адрес, относительно Image Base по которому передается управление при запуске программы (предварительно настроив все регистры общего назначения).
← →
Morfein (2003-05-12 02:47) [3]Ну таки программа - это не процедура! Просто так передать управление не выйдет хотя бы потому, что две программы по одному TSS работать не будут... а чтобы создать TSS, нужно добавить запись в GDT, а для этого надо привилегии нулевого кольца. Всё вышесказанное - ИМХО. Поправьте, если не прав...
← →
Vit@ly (2003-05-12 19:58) [4]2 Samael6 © (11.05.03 13:19)
Поясни, что следует понимать под "загрузить ЕХЕ-файл в память и там его выполнить". Стартовать из твоей проги или что-то иное?
← →
NightAngel (2003-05-13 03:05) [5]> Morfein © (12.05.03 02:47)
Ну таки программа - это не процедура! Просто так передать управление не выйдет хотя бы потому, что две программы по одному TSS работать не будут... а чтобы создать TSS, нужно добавить запись в GDT, а для этого надо привилегии нулевого кольца. Всё вышесказанное - ИМХО. Поправьте, если не прав...
Код любой Dll исполняется в контексте вызвавшего её процесса, а это тот-же PE файл (специфичный, конечно, но структура та-же).
А TSS (Task State Segment) - это всего лишь структура данных, которая определяет состояние (т.е. контекст) задачи. В ней хранится содержимое всех регистров общего назначения, сегментных и некоторых системных регистров а также некоторая дополнительная информация и используется для сохранения и восстановления состояния задачи (при переключении задач) и ничего более.
← →
Samael6 (2003-05-13 10:24) [6]Поясни, что следует понимать под "загрузить ЕХЕ-файл в память и там его выполнить". Стартовать из твоей проги или что-то иное?
Да, просто стартовать из своей проги, но не с диска! :)
Спасибо за разъяснения, а нет ли у кого-нибудь примеров практической реализации вопроса? Буду очень благодарен!
Заранее благодарен.
Страницы: 1 вся ветка
Форум: "Система";
Текущий архив: 2003.07.21;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c