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


Автор: Sl@va 8.9.2005, 17:56
Здравствуйте !
Известно, что при помощи функции Win32Api ShellExecute можно например запустить какой либо файл на выполнение, либо открыть файл, если он например является текстовым.
Но как сделать, чтобы можно было запустить файл на выполнение, если он на данный момен находится не на жестком диске, а в оперативной памяти.
Заранее спасибо.

Автор: JoyEx 9.9.2005, 13:58
Передай управление jmp, call и т.п..

Автор: Romikgy 9.9.2005, 14:57
В смысле
Цитата(Sl @ 8.9.2005, 17:56)
если он на данный момен находится не на жестком диске, а в оперативной памяти.

? Загружен при запуске или побайтово считан ехе-файл в память?

Автор: Sl@va 10.9.2005, 10:18
Есть такое понятие, может вы с ним знакомы, как Ресурс Исполняемого файла. Дело в том, что каждый exe файл состоит из нескольких частей, где все разложено по полочкам. Тоесть например иконки хранятся в одном месте, рисунки в другом, диалоговые окна в третьем, сама кодовая часть в четвертом, и т.д. Все это формируется на стадии компановки исполняемого модуля. Это и есть ресурсы. Так же в exe файл можно запрятать и еще например один exe файл. Тоесть программа работает следующим образом:
Запускается программа, она извлекает из самой себя еще один exe файл, который находится в оперативной памяти. Передомной как раз и стоит задача, как запустить этот самый извлеченный exe файл, не записывая его на жесткий диск.
Тоесть тут получается такая вещь, что программа находится в оперативной памяти, но она не запущена, и мне как раз и нужно передать ей управление.

Автор: bilbobagginz 10.9.2005, 12:23
когда ты загружаешь данные таким образом, они заходят в регион данных. если ты можешь передать контроль программы региону в сегменте данных, то можно это делать и со злым умыслом, как делают в атаках основанных на переполнение буфферов, загоняя в стек данных команды компьютеру, и передавая им контроль в какой-то момент напр. с помощью jmp.
как ни странно, но большинство автоматических взломов компьютеров происходит именно по этому принципу ( см. статью http://www.phrack.org/show.php?p=49&a=14)
всё это сейчас пытаются заглушить с помощью специальных защит железом и низко-уровневым софтом - сам CPU в конце концов не позволит относиться к данным как к инструкциям.
не совсем понятно какая именно цель тут тобой преследуется, но ясно что перспективы у неё не очень светлые. т.е. если и напишешь ты программу по этому принципу, в какой то момент оне просто не сможет быть перенесена на новые модели процессоров.
напр. уже сейчас в Windows XP SP2 есть фича DEP - (Data Execution Prevention), которая по идее ( если работает и включена) должна блокировать твою такую програмку.


Автор: dmit10 10.9.2005, 13:20
Дык сущестует же программа Aspack, нарушающая объявленные выше принципы... Как ты это объяснишь?

Автор: En_t_end 10.9.2005, 13:57
Sl@va
Я не вижу оснований у обычной программы НЕ извлекать из себя нужный исполняемый файл и если нужно удалять его после его закрытия. По сему я предполагаю, что это либо очередной вирус, либо шпион(в данном контексте вероятно автор хочет загрузить в память резидента, под прикрытием другой программы). Разработка и обсуждение(на данном форуме) и того и другого - противозаконно.

Автор: takedo 12.9.2005, 06:56
En_t_end А что наоборот не может что-ли быть?? Такая технология вполне приемлема для защиты программы от несанкционированного использования!!! Я вот и сам подумывал об этом, а ты "противопоказано". Вообще очень полезно это уметь, ибо не один хацкер не додумается как взять дамп памяти и посмотреть, что эта программа делает, а если ты запускаешь с диска - вот тут то и пиши пропало... писец всей твоей суперзащите.
Поэтому, предлагаю дообсуди ть эту тему. smile

Автор: oleg1973 12.9.2005, 10:20
JoyEx
Цитата
Передай управление jmp, call и т.п..

зависнет 100 процентов
bilbobagginz
а откуда цпу узнает что код - это как бы данные? ) так что уровень железа отпадает
если определять данные как некую информацию которая находится в сегменте данных и имеет атрибут реад/врите то обойти это дело 5 секунд VirtualProtect еще никто не отменял, ставим реад/врите/ехекуте и вперед
ну а если сделать ехе с 1 секцией в которой все понапичкано то еще проще )))

ну а чтоб запустить ехе из тела своей проги нада делать так (назовем ехе для запуска ехе1)
1) получить место в памяти с адреса указаного в image base exe1
2) перенести туда ехе1 с учетом смещений секций (RVA) тоесть разложить его там
3) заполнить таблицу импорта ехе1
4) передать на него управление

Автор: takedo 12.9.2005, 10:52
oleg1973
Вот я не столь крут и понял, что ничего не понял. Если есть несколько минуток свободных, может можно кусочек текста или пояснения или ссылочки???
PS.: Я и сам знаюя, что все есть в MSDN, но когда мне говорят читайте MSDN - я понимаю это как предложение в мою сторону о проведении путешествия с эротическим уклоном (а пошёл ты на ...). И сам уже иногда начинаю людям предлагать почитать MSDN, но неприятно это. smile

Автор: oleg1973 12.9.2005, 12:50
как раз в МСДН и нет ничего в данном случае )))
на оффсайте UPX есть исходники http://upx.sourceforge.net/
но без понимания структуры РЕ/ЕХЕ там делать нечего

Автор: Romikgy 12.9.2005, 12:53
В данной теме, на мой взгляд, есть два решения (я сам такого не делал, так что это чистая теория smile ):
1. искать в нете статьи , типа: " Как запускается ехе-файлы?" и что при этом куда пишется в памяти,
2. создать в памяти виртуальный диск, скинуть на него побайтно весь требуемый ехе-шник, и с оттуда запустить, после работы удалить и прогу и диск.

Автор: takedo 12.9.2005, 13:51
Romikgy
Цитата
2. создать в памяти виртуальный диск,

Тут то и писец... smile
Добавлено @ 13:51
oleg1973
За ссылку спасибо

Автор: Romikgy 12.9.2005, 14:31
Цитата(takedo @ 12.9.2005, 13:51)
Тут то и писец...

Помоему в нете куча исодников и объяснений как это сделать smile

Автор: p0s0l 12.9.2005, 16:46
Вот неплохой простой пример для старта, правда на Delphi...
http://forum.vingrad.ru/index.php?showtopic=49437&view=findpost&p=391622

Автор: JoyEx 14.9.2005, 16:34
Цитата(oleg1973 @ 12.9.2005, 10:20)
ну а чтоб запустить ехе из тела своей проги нада делать так (назовем ехе для запуска ехе1)
1) получить место в памяти с адреса указаного в image base exe1
2) перенести туда ехе1 с учетом смещений секций (RVA) тоесть разложить его там
3) заполнить таблицу импорта ехе1
4) передать на него управление


Так, да не так.
Если в коде нету команд с абсолютными адресами, то не надо делать п.1-2, если нету импорта, то не нужен п.3.. Остается тока п.4 о чём я и говорил smile

Без импорта можно обойтись - вызывать API по общеизвестным адресам или через шлюз ловушки.

А вооще, программа должна иметь свое адресное пр-во и т.д...

Автор: oleg1973 14.9.2005, 17:47
Цитата
Если в коде нету команд с абсолютными адресами

а как ты это определиш?
Цитата
Без импорта можно обойтись - вызывать API по общеизвестным адресам или через шлюз ловушки.

ну дык может та прога которую мы запускамем имеет импорт ) или ты ее переделвать будеш? да и адреса разные на разных версиях винды
Цитата
А вооще, программа должна иметь свое адресное пр-во и т.д...

не обязательно, посматри как упаковшики ехешников работают

Автор: JoyEx 14.9.2005, 17:57
oleg1973 , с праздником!


smile водочка-водочка меняешь ты походочку! smile

1) Мне вааще это не надо
2) Аналогично
3) Аналогично


Автор: p0s0l 14.9.2005, 20:00
JoyEx, таких программ которые ты описал, мало, и в природе встречаются в основном в виде вирей...
А если нужно запустить прогу, которая написана на HLL ? smile

Цитата(JoyEx @ 14.9.2005, 16:34)
А вооще, программа должна иметь свое адресное пр-во и т.д...
Посмотри пример по ссылке что я дал, там хорошая идея, заключающаяся в запуске cmd.exe. После запуска имейдж cmd.exe унмаппится, и туда по нужным адресам рассовываются секции ресурсного EXE-шника... А дальше управление передаётся ОС, которая старательно сама заполняет импорт и начинает работу проги...
Правда не всё запускается таким способом, но при желании можно и доработать... По крайней мере это намного лучше того, чем накладывать огромные ограничения на запускаемую программу... Имхо smile

Автор: JoyEx 14.9.2005, 20:33
Цитата(p0s0l @ 14.9.2005, 20:00)
Цитата (JoyEx @ 14.9.2005, 16:34)
А вооще, программа должна иметь свое адресное пр-во и т.д...

Посмотри пример по ссылке что я дал, там хорошая идея,


Ни разу не делал, но ... smile "ход мыслей мне нравится" (- © Мел Брукс <Всемирная История>)

p0s0l, и тебя тоже с праздником!

Автор: Helicopterr 9.11.2005, 22:45
Насколько я понял, автор темы интересовался аналогом ф-ции ShellExecute для файла в оперативной памяти. Вместо этого наиболее существенное что он получил - параноидальные обвинения в вирмейкерстве.
Я считаю очень важным умение работать с содержимым оперативки. В стандартной инфе по С++ не встречал функции для этого.
Есть утилита разработчика MoleBox. Она пакует к основной экзехе всё что требуется. Может и другую экзеху, используемую основной. При этом она работает только с оперативной и найти в папке Temp unzip нереально.

Автор: gki 20.12.2005, 20:25
Как организовать из оперативной память Windows XP виртуальный диск

Автор: Sardar 20.12.2005, 23:18
На сколько помню современные процы бьют память на страницы, каждая страница имеет аттрибуты. В страницу помеченную как "код" нельзя писать, из страницы "даные" нельзя исполнять код. По моему только ось (из режима супервизора) может изменить аттрибуты страницы.

Просто мысли... по идее что бы запустить прогу нужно загрузить её в память(создать имейдж процесса), убить себя, т.к. прога в виртуальном пространстве хочет быть одна обычно. Как то сервисами оси указать что страницы с инфой вообще то страницы с кодом, у оси права менять аттрибуты страниц есть. Раз паковщики exe'шников существуют, значит это всё возможно сделать... smile

Автор: p0s0l 21.12.2005, 09:11
Цитата(Sardar @ 20.12.2005, 23:18)
Раз паковщики exe'шников существуют, значит это всё возможно сделать..
Это делается через VirtualProtect(Ex)

Автор: Helicopterr 11.1.2006, 12:41
Цитата(p0s0l @ 21.12.2005, 09:11)
Это делается через VirtualProtect(Ex)

А есть пример как юзать эту функцию?

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