Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.07.21;
Скачать: 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 вся ветка

Текущий архив: 2003.07.21;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.022 c
4-68123
Mr. xXx
2003-05-20 16:05
2003.07.21
Как отловить нажатие по Desktop у


14-68068
Кен
2003-06-28 04:00
2003.07.21
Как замерять время выполнения отдельных частей программы ?


1-67878
Tornado
2003-07-08 09:33
2003.07.21
Форма в DLL


14-68011
Крот
2003-07-03 07:36
2003.07.21
Можно мне немножко поныть?...


1-67797
guest0
2003-07-04 08:03
2003.07.21
Горячие клавиши