Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > 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 | ||
Здесь ошибочка вышла - ShellExecute. Хотя можно было бы и догадаться. К тому же есть такая штука - CreateProcess. Самое то. Если MSDN есть - то смотри и "да прибудет с тобой шворц" ![]() |
Автор: Step 9.12.2002, 22:02 |
ShellExecute |
Автор: AntonSaburov 9.12.2002, 22:03 |
Прочитал еще раз самое первое сообщение - и задумался. Если ты имеешь в виду, что у тебя внутри файла есть поток байт, который будучи отдельно выделенным представляет из себя фактически EXE-файл, то я таких способов не знаю. Думаю, что никак не получится - ты не можешь выполнять код, который является данными. А то, что ты считаешь - это данные. А зачем такое сложное надо ? Для секретности ? |
Автор: BumSoft 9.12.2002, 23:08 | ||
Совершенно верно! Причем я знаю смещение его и длину. Конечно можно выделить его и записать(например в темп-файл) и запустить через ShellExecute, потом удалить (тоже проблематично) - но мне это не очень подходит( а если комп перезагрузили в это время - то темп-файл останется!). |
Автор: AntonSaburov 9.12.2002, 23:18 | ||||
В том виде, в котором ты хочешь это сделать - никак. Вообще. Механизм защиты у Виндов тебе не позволит такое вытворять. Может ты опишешь для чего тебе такое ? Может быть получится придумать альтернативу на более высоком уровне. |
Автор: BumSoft 9.12.2002, 23:49 |
Надо сделать обертку над ехе-ком и запускать его при выполнении каких-либо условий(типа пароля что -ли ). |
Автор: neutrino 10.12.2002, 00:05 |
Единственное, что можно - это оставить данные после ЕХЕ файла. Он все равно выйдет до них и вернет точку входа. А вот с началом... Это я не знаю. |
Автор: Grey 10.12.2002, 00:17 |
Мне стало интересно вот что: если этого нельзя сделать то как же работают всякие запаковщики экзешников? |
Автор: AntonSaburov 10.12.2002, 00:22 | ||
Они работают в свое досовской виртуальной машине - тормоза жуткие. Зато можно много чего. |
Автор: Fantasist 10.12.2002, 07:01 |
Ха. Такой же вопрос я поднимал в этом форуме года полтора назад. Пришли к тому, что стандартно это сделать нельзя. Можно ли это сделать как-то не стандартно выяснено не было, но подозреваю, что нельзя(имеется ввиду без переписывания приличной части ядра Windows) |
Автор: HexoGenus 11.12.2002, 21:54 | ||
А нельзя как нибудь сделать что бы программа могла еще раз запустить сама себя но уже с другой точкой входа в программу и что бы при втором запуске она сама вычищала из себя часть кода исходной программы так что-бы оставался только вложенный 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 | ||
Привет. Что-то я не помню такого предложенного тобой способа. ![]() Кстати, недавно прошло обсуждение(не здесь) в ходе которого было данно утверждение, что запущенный екзешник удалить можно. Для этого надо только закрыть 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 | ||||
Да ладно, я тебе верю. ![]()
Что-то сомнительно. Мне не думается что ОС будет себя так вести. Хотя говорю, на системном уровне я практически 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) Я перепишу эти программу на асм, т.к. тогда я буду уверен в каждом байте программы, а не только в логике её работы. |