Вниз
Скачать: CL | DM;

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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: -0.989 c
4-68127
sosv
2003-05-21 15:47
2003.07.21
Win API Call


1-67842
Fotog
2003-07-07 19:07
2003.07.21
сервисы


1-67907
adogg
2003-07-08 12:42
2003.07.21
StringGrid and Button


7-68078
Uncle Archi
2003-05-06 23:51
2003.07.21
Список процессов.


14-67984
VDen
2003-07-03 17:44
2003.07.21
Выполнить код из ресурса




   Наверх