C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Запуск EXE из памяти.
Slava
Отправлено: 26.09.2003, 19:43


Не зарегистрирован







Привет.

Такой вопрос — помогите советом если кто знает. К примеру, есть массив BYTE Mem[xxx], в который прочитан exe PE файл. Как можно запустить этот файл из Mem c помощью CreateProcess и подобных ф-ций БЕЗ сохранения этого файла из памяти на винт? Заранее сенкс.
Admin
Отправлено: 26.09.2003, 21:37


Владимир

Группа: Администратор
Сообщений: 1190



Почитайте, может немного поможет
http://osp.admin.tomsk.ru/pcworld/1998/06/180.htm

---

А вообще этот вопрос я задал на форуме bcbdev.ru

Ответы здесь.

Так что тема остается открытой — можно ли это сделать и как ?

Отредактировано Admin — 26/09/2003, 22:51
Slava
Отправлено: 27.09.2003, 00:48


Не зарегистрирован







Спасибо за ответ. На ссылку про организацию памяти я наталкивался, а из ответов на форуме понял, что все так и осталось без ответаЖ-) из всего, что нашел за день кажется что делать это нужно через Memory maped files... здесь линк на может полезную тему... короче, что я понял:

hFile = CreateFile (filename, ...);
hMapping = CreateFileMapping(hFile, 0 , PAGE_READWRITE,...);
CloseHandle(hFile);

pMapping = MapViewOfFile(hMapping, FILE_MAP_WRITE,....);
CloseHandle(hMapping);

pMapping[1] = 0xXX; !!!

UnmapViewOfFile(pMapping);

т.е создаем сначла файлмэпинг объект, потом карту на его отбражение в адресном пространстве, а потом мы можем менять содержимое файла в памяти (!!!).

как я понял это делает винда при запуске приложения только еще потом делает CreateThread и передает управление...

т.е. может просто мапить нужного размера в памяти файлы, писать в эту память что нужно?

ладно, надо билдер запускать и пробоватьЖ-)) напишите плиз у кого что получилось если кому интересно конечно...

p.s. я не программер.. так пишу для своей работы и нужд иногда...
Георгий
Отправлено: 27.09.2003, 01:27


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



Вы забываете о том, что исполнимый образ в памяти и PE совсем не одно и тоже — между PE на диске и исполнимым образом в памяти находится т.н. загрузчик, который выполняет окончательную настройку кода (именно кода т.е. PE уже нет) для работы в конкретной ОС (разрешение адресов статически линкуемых DLL, в том числе и системных; базовый адрес приложения и т.п.). В принципе загрузить PE в память, обработать напильником, передать управление можно, но трудоёмко. Что и было сказано на bcbdev.ru.

Но эту же задачу решают всевозможные упаковщики программ (UPX, AsPack)...

Собственно я хочу сказать следующее — на сайте wasm.ru должна быть статья — "Об упаковщиках в последний раз" (мне это по почте пришло как подписанному на рассылки), в которой рассказывается о многих тонкостях работы упаковщиков. Руководствуясь этой статьёй можно решить вашу _задачу_.

PS. я бы без крайней необходимости не стал бы заниматься тем, что обсуждается.
Guest
Отправлено: 27.09.2003, 02:38


Не зарегистрирован







2 Георгий> обалдеть... (я про статью об упаковщиках). про разницу кода выполняемого в памяти я не забывал, просто не представлял насколько все запущенно..(( Мне это нужно только для одной цели — чтобы без наличия ключа (данные для расшифровки у него в памяти) — экзэшник нельзя было даже распаковать... сами понимаете что UPX, Aspack и пр для этих целей не подходят. надо будет посмотреть исходники UPX..

кстати про memory maped files все проверил — все работает.-))

удачи:-)
Георгий
Отправлено: 27.09.2003, 11:01


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



memory maped files прекрасно работают, но я никаких преимуществ между отображением файлов в память и чтением по кускам не заметил — ни скорости, ни выигрыша по памяти, разве что самому не надо заботиться о подгрузке частей в память...

А Вы какие преимущества видите, раз используете отображение файлов в память?
Admin
Отправлено: 27.09.2003, 11:24


Владимир

Группа: Администратор
Сообщений: 1190



QUOTE
кстати про memory maped files все проверил — все работает.-))


Что именно работает ? Запуск exe-файла из другого exe
без записи на диск?

Если работает — выложите код.
Slava
Отправлено: 27.09.2003, 14:31


Не зарегистрирован







Если честно, то вопрос я задал не имея детального представления о формате ПЕ, процессе запуска и даже ни одного исходника распаковщика.. как обычно, с надеждой на лучшее:-(

2 Георгий> я не использую их пока — только смотрю насколько это может быть удобно и полезно... если например — то при изучении кем-то работы моих программ:-) Почитав в инете еще немного умных людей ночью, я закрыл для себя вопрос по написанию собственного лоадера:-) я занимаюсь другим и изучаю другие "дырки" и ф-ции и мне проще заплатить за сделанный под меня исходник или использовать те что выложены, чем тратить на свой (сначала как обычно кривой:) довольно много времени — человек не может и не должен делать все сам — в этом случае для написания какой-нибудь более или менее стоящей софтины уходят месяцы, теряется ее актуальность, а сломана она все равно будет — это только вопрос времени и заинтересованных людей, если, конечно, не как а анекдоте про неуловимого джо:-)

2 Admin> кстати ответили на bcbdev.ru (хорошо) :-) а по поводу исходников — это читать сначала ту статью, про которую говорил Георгий и смотерть чужие:-)


Вернуться в Вопросы программирования в C++Builder