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


Автор: BumSoft 9.12.2002, 19:53
Вот такой вопрос:

есть файл:
xxxxxxxxxxxyyyyyyyyyyyyyyyxxxxxxxxxxxx
              |<- exe-файл ->|
внутри этого файла содержится exe-ник.
Как запустить этот exe-ник из какой-либо проги,через темп-файл не
устраивает :)

Автор: Step 9.12.2002, 20:57
попробуй shellexecutiv

Автор: BumSoft 9.12.2002, 21:33
Что - то не нашел я описание shellexecutiv в MSDN-е

Автор: AntonSaburov 9.12.2002, 22:00
Цитата(BumSoft @ 09.12.2002, 13:33)
Что - то не нашел я описание shellexecutiv в MSDN-е

Здесь ошибочка вышла - ShellExecute. Хотя можно было бы и догадаться.
К тому же есть такая штука - CreateProcess. Самое то. Если MSDN есть - то смотри и "да прибудет с тобой шворц" :)

Автор: Step 9.12.2002, 22:02
ShellExecute

Автор: AntonSaburov 9.12.2002, 22:03
Прочитал еще раз самое первое сообщение - и задумался.
Если ты имеешь в виду, что у тебя внутри файла есть поток байт, который будучи отдельно выделенным представляет из себя фактически EXE-файл, то я таких способов не знаю.
Думаю, что никак не получится - ты не можешь выполнять код, который является данными. А то, что ты считаешь - это данные.

А зачем такое сложное надо ? Для секретности ?

Автор: BumSoft 9.12.2002, 23:08
Цитата
Если ты имеешь в виду, что у тебя внутри файла есть поток байт, который будучи отдельно выделенным представляет из себя фактически EXE-файл


Совершенно верно!  Причем я знаю смещение его и длину.
Конечно можно выделить его и записать(например в темп-файл) и запустить
через ShellExecute, потом удалить (тоже проблематично) - но мне это не очень
подходит( а если комп перезагрузили в это время - то темп-файл останется!).

Автор: AntonSaburov 9.12.2002, 23:18
Цитата(BumSoft @ 09.12.2002, 15:08)
Цитата
Если ты имеешь в виду, что у тебя внутри файла есть поток байт, который будучи отдельно выделенным представляет из себя фактически EXE-файл


Совершенно верно!  Причем я знаю смещение его и длину.
Конечно можно выделить его и записать(например в темп-файл) и запустить
через ShellExecute, потом удалить (тоже проблематично) - но мне это не очень
подходит( а если комп перезагрузили в это время - то темп-файл останется!).

В том виде, в котором ты хочешь это сделать - никак. Вообще. Механизм защиты у Виндов тебе не позволит такое вытворять.
Может ты опишешь для чего тебе такое ? Может быть получится придумать альтернативу на более высоком уровне.

Автор: BumSoft 9.12.2002, 23:49
Надо сделать обертку над ехе-ком и запускать его при выполнении
каких-либо условий(типа пароля что -ли ).

Автор: neutrino 10.12.2002, 00:05
Единственное, что можно - это оставить данные после ЕХЕ файла. Он все равно выйдет до них и вернет точку входа. А вот с началом... Это я не знаю.

Автор: Grey 10.12.2002, 00:17
Мне стало интересно вот что: если этого нельзя сделать то как же работают всякие запаковщики экзешников?

Автор: AntonSaburov 10.12.2002, 00:22
Цитата(Grey @ 09.12.2002, 16:17)
Мне стало интересно вот что: если этого нельзя сделать то как же работают всякие запаковщики экзешников?

Они работают в свое досовской виртуальной машине - тормоза жуткие. Зато можно много чего.

Автор: Fantasist 10.12.2002, 07:01
Ха. Такой же вопрос я поднимал в этом форуме года полтора назад. Пришли к тому, что стандартно это сделать нельзя. Можно ли это сделать как-то не стандартно выяснено не было, но подозреваю, что нельзя(имеется ввиду без переписывания приличной части ядра Windows)

Автор: HexoGenus 11.12.2002, 21:54
Цитата(Fantasist @ 09.12.2002, 23:01)
Ха. Такой же вопрос я поднимал в этом форуме года полтора назад. Пришли к тому, что стандартно это сделать нельзя. Можно ли это сделать как-то не стандартно выяснено не было, но подозреваю, что нельзя(имеется ввиду без переписывания приличной части ядра Windows)

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

Автор: XpyDi 13.12.2002, 23:04
Во-первых: привет Fantasist.
А во-вторых предлагаю способ, который предлагал пол года тому назад:
Итак берем наш подопытный exe-шник и начиная с точки входа выдираем оттуда около 1000 байт, соответсвено если его запустить ничего толкового не получиться. Сохраняем у себя эти 1000 байт и сохраняем у себя этот exe. Потом когда нужно запустить этого подопытного кролика запускаем его с помошью ф-ции CreateProcess с установленным флагом СREATE_SUSPENDED, при помощи функций WriteProcessMemory дописываем на свое место "похищенные" байты и вызываем ResumeThread для запуска основного потока процесса.
Плюсы: при перезагрузке компьютера получаем неработоспособный exe.
Можно, конечно сделать дапм всего процесса, но тогда прийдеться восстанавливать таблицу импорта, да и вообще дамп прийдеться сделать сразу после того, как ваша программа вернут все на место, но до исполнения подопытной.
Минусы: Это как и все существующие на сегодняшний день защиты несовершена. Это как всегда дамп процесса.
Аналоги: StarForce

Способ 2: если коротко то смотри исходник upx.
Плюсы: обертка стоит, программа для запуска не сохраняеться во внешний файл.
Минусы: посмотри как часто снимают одного из лучших представителей пакеров-протекторов для Shareware программ ASProtect.
Аналоги: ASProtect, VBOX, да практически все покеры-протекторы.

Автор: Fantasist 14.12.2002, 05:57
Цитата(XpyDi @ 13.12.2002, 15:04)

Привет.
Что-то я не помню такого предложенного тобой способа. :) Ну правда давно это было. А ты сам это пробывал? Теоретически выглядит все здорово.

Кстати, недавно прошло обсуждение(не здесь) в ходе которого было данно утверждение, что запущенный екзешник удалить можно. Для этого надо только закрыть FileMapping который windows открывает для запущенного екзешника. Правда, как я понял, надо рассчитывать, что далее екзешник не будет использован системой для подкачки (то есть лучше чтобы этот екзешник сразу бы и завершал работу). Сам не эксперементировал.

Автор: XpyDi 14.12.2002, 06:19
Первый способ был предложен полгода назад, правда тогда я сам не очень сильно представлял, как, что и куда пихать.
По-поводу пробывал ли сам, честно скажу - нет. Сегодня попробую, завтра скажу какие были результаты. А так StarForce уже существует достаточно долго и вот не помню с какой или в какой версии было реализовано нечто похожее, точнее, там загрузчик прежде, чем запустить программу загружал все dll, а StarForce'вская dll'ка в ф-ии WinMain, как раз и дописывала похищенные байты на место.

А ссылку на это обсуждение не дашь?

Автор: Fantasist 14.12.2002, 10:34
Ну, это не сама та ветка (ту вроде найти не удалось), однако в ней это утверждение было повторенно по моей просбе. Мне это в принципе не очень интересно, но если тебе интересно, там и поспрашивай. Хотя, как я понял, надо идти на http://sysinternals.com и там можно все это, и не только, прочитать.

http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1038248523&n=5

Автор: XpyDi 14.12.2002, 20:49
Вообщем так первый способ я проверил работает стабильно(по крайней мере у меня).
Если хочешь сам проверить вот:
http://xpydi.narod.ru/experement/WorkTable.exe
http://xpydi.narod.ru/experement/testProtection.exe
Подопытная не запускаеться самостоятельно, а только при помощи загрузчика. Из неё я наглым образом из RVE взял 31 байт(может можно было и меньше, но я хотел сразу получить ошибку при запуске).
Едиснственное предупреждаю, что подопытная начинает перемещать иконки по рабочему столу, чтобы это небыло для вас сюрпризом.

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

Жаль конечно, что ту самую ветку найти не удалось. Я если честно не совсем понял, все что там написано про размапивание файла это проверено практикой или просто очень похоже на действительность.

Вообщем если можно размапить, то тогда у меня есть такая идея. Как вариант можно пройтись по всему файлу в памяти считывая и записывая код, но не изменяя его, таким образом ОС будет думать, что кусок изменился не будет свопить его из первоначального exe, а скинет в отдельный файл, таким образом первоначальный exe уже не нужен. Вот только тут одна проблемка, если размапить файл не выгрузит ли ОС сразу программу из памяти?

Автор: Fantasist 15.12.2002, 06:56
Цитата
Вообщем так первый способ я проверил работает стабильно(по крайней мере у меня).
Если хочешь сам проверить вот:


Да ладно, я тебе верю.  :) Спасибо, что проверил. Можно объеденить с самоудалением, и получиться в принципе ниче. Правда все равно, пока екзешник запущен его можно скопировать. Разве что, если загрузчик удалить, то восстановить его будет практически невозможно. Правда неизвестно насколько трудно будет достать загрузчик, но это уже проблема из другой области. Да и это все-таки обходное решение, запустить ехе так, чтобы сам его файл не был бы доступен не получиться.

Цитата
Вообщем если можно размапить, то тогда у меня есть такая идея. Как вариант можно пройтись по всему файлу в памяти считывая и записывая код, но не изменяя его, таким образом ОС будет думать, что кусок изменился не будет свопить его из первоначального exe


Что-то сомнительно. Мне не думается что ОС будет себя так вести. Хотя говорю, на системном уровне я практически 0.

Автор: BumSoft 16.12.2002, 21:39
2XpyDi

У меня не запускается ни подопытная, ни с помощью загрузчика,
причем в обоих случаях вываливаются по разным адресам.

Автор: XpyDi 17.12.2002, 02:09
2BumSoft:
Если честно, то был очень удивлен твоим сообщением, т.к. специально после его прочтения скачал заново в отдельную папку запустил и все работает.
Тогда у меня к тебе пару вопросов:
1 В какой ОС ты проверял?
Дело в том, что сама подопытная писалась для себя и проверялась только на моем компьютере, да и для себя, так что ничего не могу гарантировать.
2 А сам загрузчик запускаеться?
3 Можно белее полные сообщения об ошибках?
2Fantasist:
1 Я предложил вариант, который хоть и не универсальный, но его можно развить во что-нибудь более-менее нормальное.
2 Сама идея, заставить ОС думать, что кусок кода изменился, чтобы его теперь не свопить из первоначального exe основывалась только на документацию и на то что написано в книге Джефри Рихтера о памяти и о процессе работы ОС с ней. Никаких практических тестов не проводилось.

Автор: BumSoft 20.12.2002, 21:55
2XpyDi

Не мог быстро ответить-был в командировке.
У меня WIN98(SE).
При запуске WorkTable.exe вываливается по адресу 017f:00403b1c.
Загрузчик сам запускается, при нажатии на кнопку
WorkTable.exe вываливается по адресу 017f:00403b3e.

Автор: XpyDi 22.12.2002, 23:51
2BumSoft
Посмотрел я на ошибки и если честно был крайне удивлен, т.е. первая срабатывает там где нужно, а вот вторая происходит:
1) уже после тех байт которые я записывал, т.е. я записывал в начало 31 байт, а исключение показывает на 34 байт от начала.
2) исключение указывает на середину интсрукции процессора.
У меня, к несчастью, не стоит Win98(SE), поэтому тут есть 3 выхода:
1) ты повторишь этот эксперимент на своем компьютере и посмотришь на результаты.
2) После исключения сделаешь дамп памяти и отошлешь мне, а я уже буду смотреть.
3) Я перепишу эти программу на асм, т.к. тогда я буду уверен в каждом байте программы, а не только в логике её работы.

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