Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > экзэ-извлечь ресурс из себя и запустить


Автор: SolodDemiurg 17.11.2002, 03:38
Help! Нужно чтоб прога извлекла ресурс из себя в память и запустила его как экзэшник

Здравствуйте! Я начинающий c++ программист и страшно нуждаюсь в помощи. Проблема:  
Моя программа содержит в себе бинарный экзэшник, хранящийся внутри как ресурс типа заданного мною типа.
Я хочу чтобы программа была в состоянии достать этот ресурс в память (примерно знаю, как– FindResource, … LockResource API функции)  и запустить как обычный экзэшник, причем не извлекая на диск, а прямо из памяти. Был бы очень благодарен если бы кто-нибудь мне помог либо, если это невозможно, объяснил, почему так.
Заранее благодарю,
[email protected]
[email protected]

Автор: Baa 17.11.2002, 11:17
Есть мысли как это сделать... насколько это реально надо проверять на собственном опыте... Вот например, те же эксплойты... если они могут выолнять свой код в памяти, значит и мы можем.
Берем область памяти, ставим на неё протект на выполнение (предварительно скопировав данные начиная с точки входа в исполняемый файл) и далее передаем из нашей программы управление на тот адрес в памяти.
з.ы. это токо моя теория, и насколько она верна - хз... надо пробовать

Автор: Baa 17.11.2002, 11:44
Не.... не прокатит это... можно выполнить определенный код с явными адресами.
Целый экзешник не получится хотя бы потому, что возникнут проблемы с таблицами импорта (с адресами импортируемых функций)

Автор: SolodDemiurg 19.11.2002, 04:41
спасибо за ответ, но хотелось бы запустить

Автор: Baa 19.11.2002, 10:33
Создателям joiner'а тоже наерно хотелось... пиши свой загрузчик... а еще лучше свою ОСь, которая будет уметь так делать :)

Автор: Fantasist 19.11.2002, 11:17
Ага, помниться я тоже хотел так делать.  :)
Только, как я понял, без редактирования ОС-и ничего не выйдет. Система предпологает (точнее она в этом уверена), что исполняемый модуль находиться на диске, и время от времени она к нему(файлу на диске) обращается. Даже написания собственного загрузчика будет недостадочно.

Автор: Vit 19.11.2002, 13:32
Дополняя Fantasist - Win32 "считает" что файл находится на диске. Как известно, при необходимости дополнительной памяти ось временно выгружает определённые участки памяти в файл подкачки. Для исполняемого файла только  значения переменных идут в файл подкачки, если же система посчитала что надо временно высвободить память занимаемую кодом программы, ось не переносит его в Swap, а просто уничтожает из памяти, при необходимости ось опять считывает нужный кусок файла в память. Другими словами текст исполняемого файла на момент выполнения файла становится как-бы кусочком Swap файла... Именно поэтому например невовремя вынутый CD диск может быть причиной появления Blue Screen, а все инсталляторы делают процесс "Подготовки к инсталлированию" который заключается копированию самого инсталлятора на HD и запуск его с винта дабы не вылететь в тот момент когда пользователь сменит диск

Автор: HexoGenus 19.11.2002, 18:49
Цитата(Fantasist @ 19.11.2002, 03:17)
Система предпологает (точнее она в этом уверена), что исполняемый модуль находиться на диске, и время от времени она к нему(файлу на диске) обращается. Даже написания собственного загрузчика будет недостадочно.

Хммммм... есть один вариант... но настолько некрасивый что боюсь меня за него здесь морально убъют....    ;-)
Предпосылки:
1. Экзешник из ресурса можно извлечь на диск и оттуда запустить...
2. Можно создать электронный диск т.е. диск который будет реально находится в оперативке а для ОС будет просто диском с определенной буковкой...
3. Диск в Windows можно спрятать если что то там в реестре поменять ...
(Может есть более гуманные способы прятать диски но я их не знаю)

Т.е. можно сделать так что виндовз будет все операции с EXE-файлом выполнять на виртуальном диске а его даже видно не будет...
Правда не знаю можно ли это сделать без перезагрузки компа...
Но если вы пишете прогу которая будет запускаться при включении компа то проблема эта для вас не существенна  :D

Автор: Baa 20.11.2002, 09:08
Ну прально, RAM-диск можно примонтировать, токо это не выход... насколько я понял нужно не это.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)