![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
BumSoft |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 9.12.2002 Репутация: нет Всего: нет |
Вот такой вопрос:
есть файл: xxxxxxxxxxxyyyyyyyyyyyyyyyxxxxxxxxxxxx |<- exe-файл ->| внутри этого файла содержится exe-ник. Как запустить этот exe-ник из какой-либо проги,через темп-файл не устраивает ![]() |
|||
|
||||
Step |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5151 Регистрация: 26.9.2002 Где: дурдом.UA Репутация: 5 Всего: 25 |
попробуй shellexecutiv
-------------------- - Дурак учится на своих ошибках, умный на чужих. - умные учатся у дураков |
|||
|
||||
BumSoft |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 9.12.2002 Репутация: нет Всего: нет |
Что - то не нашел я описание shellexecutiv в MSDN-е
|
|||
|
||||
AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: нет Всего: 118 |
Здесь ошибочка вышла - ShellExecute. Хотя можно было бы и догадаться. К тому же есть такая штука - CreateProcess. Самое то. Если MSDN есть - то смотри и "да прибудет с тобой шворц" ![]() |
|||
|
||||
Step |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5151 Регистрация: 26.9.2002 Где: дурдом.UA Репутация: 5 Всего: 25 |
ShellExecute
-------------------- - Дурак учится на своих ошибках, умный на чужих. - умные учатся у дураков |
|||
|
||||
AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: нет Всего: 118 |
Прочитал еще раз самое первое сообщение - и задумался.
Если ты имеешь в виду, что у тебя внутри файла есть поток байт, который будучи отдельно выделенным представляет из себя фактически EXE-файл, то я таких способов не знаю. Думаю, что никак не получится - ты не можешь выполнять код, который является данными. А то, что ты считаешь - это данные. А зачем такое сложное надо ? Для секретности ? |
|||
|
||||
BumSoft |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 9.12.2002 Репутация: нет Всего: нет |
Совершенно верно! Причем я знаю смещение его и длину. Конечно можно выделить его и записать(например в темп-файл) и запустить через ShellExecute, потом удалить (тоже проблематично) - но мне это не очень подходит( а если комп перезагрузили в это время - то темп-файл останется!). |
|||
|
||||
AntonSaburov |
|
||||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: нет Всего: 118 |
В том виде, в котором ты хочешь это сделать - никак. Вообще. Механизм защиты у Виндов тебе не позволит такое вытворять. Может ты опишешь для чего тебе такое ? Может быть получится придумать альтернативу на более высоком уровне. |
||||
|
|||||
BumSoft |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 9.12.2002 Репутация: нет Всего: нет |
Надо сделать обертку над ехе-ком и запускать его при выполнении
каких-либо условий(типа пароля что -ли ). |
|||
|
||||
neutrino |
|
|||
![]() Gothic soul ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3041 Регистрация: 25.3.2002 Где: Верхняя Галилея, Кармиэль Репутация: 1 Всего: 62 |
Единственное, что можно - это оставить данные после ЕХЕ файла. Он все равно выйдет до них и вернет точку входа. А вот с началом... Это я не знаю.
-------------------- The truth comes from within ... Покойся с миром, Vit |
|||
|
||||
Grey |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 91 Регистрация: 25.3.2002 Репутация: нет Всего: нет |
Мне стало интересно вот что: если этого нельзя сделать то как же работают всякие запаковщики экзешников?
|
|||
|
||||
AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: нет Всего: 118 |
Они работают в свое досовской виртуальной машине - тормоза жуткие. Зато можно много чего. |
|||
|
||||
Fantasist |
|
|||
![]() Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Ха. Такой же вопрос я поднимал в этом форуме года полтора назад. Пришли к тому, что стандартно это сделать нельзя. Можно ли это сделать как-то не стандартно выяснено не было, но подозреваю, что нельзя(имеется ввиду без переписывания приличной части ядра Windows)
-------------------- Волны гасят ветер... |
|||
|
||||
HexoGenus |
|
|||
![]() Шустрый ![]() Профиль Группа: Экс. модератор Сообщений: 110 Регистрация: 28.8.2002 Где: Ростов-на-Дону Репутация: нет Всего: нет |
А нельзя как нибудь сделать что бы программа могла еще раз запустить сама себя но уже с другой точкой входа в программу и что бы при втором запуске она сама вычищала из себя часть кода исходной программы так что-бы оставался только вложенный exe... ![]() (т.е. программа оригинал находится как бы не до а после вложенного exe... а в начале стоит команда перехода, при втором же запуске эта команда заменяется на то что и должно стоять во вложенном exe и уменьшается блок памяти отведенный под программу таким образом что бы отрезать вложенную программу) --------------------
Когда невозможно уже работать напряженнее, начни работать умнее. |
|||
|
||||
XpyDi |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 114 Регистрация: 25.11.2002 Где: USSR Репутация: нет Всего: 2 |
Во-первых: привет Fantasist.
А во-вторых предлагаю способ, который предлагал пол года тому назад: Итак берем наш подопытный exe-шник и начиная с точки входа выдираем оттуда около 1000 байт, соответсвено если его запустить ничего толкового не получиться. Сохраняем у себя эти 1000 байт и сохраняем у себя этот exe. Потом когда нужно запустить этого подопытного кролика запускаем его с помошью ф-ции CreateProcess с установленным флагом СREATE_SUSPENDED, при помощи функций WriteProcessMemory дописываем на свое место "похищенные" байты и вызываем ResumeThread для запуска основного потока процесса. Плюсы: при перезагрузке компьютера получаем неработоспособный exe. Можно, конечно сделать дапм всего процесса, но тогда прийдеться восстанавливать таблицу импорта, да и вообще дамп прийдеться сделать сразу после того, как ваша программа вернут все на место, но до исполнения подопытной. Минусы: Это как и все существующие на сегодняшний день защиты несовершена. Это как всегда дамп процесса. Аналоги: StarForce Способ 2: если коротко то смотри исходник upx. Плюсы: обертка стоит, программа для запуска не сохраняеться во внешний файл. Минусы: посмотри как часто снимают одного из лучших представителей пакеров-протекторов для Shareware программ ASProtect. Аналоги: ASProtect, VBOX, да практически все покеры-протекторы. |
|||
|
||||
Fantasist |
|
|||
![]() Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Привет. Что-то я не помню такого предложенного тобой способа. ![]() Кстати, недавно прошло обсуждение(не здесь) в ходе которого было данно утверждение, что запущенный екзешник удалить можно. Для этого надо только закрыть FileMapping который windows открывает для запущенного екзешника. Правда, как я понял, надо рассчитывать, что далее екзешник не будет использован системой для подкачки (то есть лучше чтобы этот екзешник сразу бы и завершал работу). Сам не эксперементировал. -------------------- Волны гасят ветер... |
|||
|
||||
XpyDi |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 114 Регистрация: 25.11.2002 Где: USSR Репутация: нет Всего: 2 |
Первый способ был предложен полгода назад, правда тогда я сам не очень сильно представлял, как, что и куда пихать.
По-поводу пробывал ли сам, честно скажу - нет. Сегодня попробую, завтра скажу какие были результаты. А так StarForce уже существует достаточно долго и вот не помню с какой или в какой версии было реализовано нечто похожее, точнее, там загрузчик прежде, чем запустить программу загружал все dll, а StarForce'вская dll'ка в ф-ии WinMain, как раз и дописывала похищенные байты на место. А ссылку на это обсуждение не дашь? |
|||
|
||||
Fantasist |
|
|||
![]() Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Ну, это не сама та ветка (ту вроде найти не удалось), однако в ней это утверждение было повторенно по моей просбе. Мне это в принципе не очень интересно, но если тебе интересно, там и поспрашивай. Хотя, как я понял, надо идти на http://sysinternals.com и там можно все это, и не только, прочитать.
http://delphi.mastak.ru/cgi-bin....523&n=5 -------------------- Волны гасят ветер... |
|||
|
||||
XpyDi |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 114 Регистрация: 25.11.2002 Где: USSR Репутация: нет Всего: 2 |
Вообщем так первый способ я проверил работает стабильно(по крайней мере у меня).
Если хочешь сам проверить вот: Подопытная Загрузчик Подопытная не запускаеться самостоятельно, а только при помощи загрузчика. Из неё я наглым образом из RVE взял 31 байт(может можно было и меньше, но я хотел сразу получить ошибку при запуске). Едиснственное предупреждаю, что подопытная начинает перемещать иконки по рабочему столу, чтобы это небыло для вас сюрпризом. Думаю второй способ в проверке не нуждается, т.к. он заключаеться в простом написании собственного упаковщика с включением в него нужных функций. Жаль конечно, что ту самую ветку найти не удалось. Я если честно не совсем понял, все что там написано про размапивание файла это проверено практикой или просто очень похоже на действительность. Вообщем если можно размапить, то тогда у меня есть такая идея. Как вариант можно пройтись по всему файлу в памяти считывая и записывая код, но не изменяя его, таким образом ОС будет думать, что кусок изменился не будет свопить его из первоначального exe, а скинет в отдельный файл, таким образом первоначальный exe уже не нужен. Вот только тут одна проблемка, если размапить файл не выгрузит ли ОС сразу программу из памяти? |
|||
|
||||
Fantasist |
|
||||
![]() Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Да ладно, я тебе верю. ![]()
Что-то сомнительно. Мне не думается что ОС будет себя так вести. Хотя говорю, на системном уровне я практически 0. -------------------- Волны гасят ветер... |
||||
|
|||||
BumSoft |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 9.12.2002 Репутация: нет Всего: нет |
2XpyDi
У меня не запускается ни подопытная, ни с помощью загрузчика, причем в обоих случаях вываливаются по разным адресам. |
|||
|
||||
XpyDi |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 114 Регистрация: 25.11.2002 Где: USSR Репутация: нет Всего: 2 |
2BumSoft:
Если честно, то был очень удивлен твоим сообщением, т.к. специально после его прочтения скачал заново в отдельную папку запустил и все работает. Тогда у меня к тебе пару вопросов: 1 В какой ОС ты проверял? Дело в том, что сама подопытная писалась для себя и проверялась только на моем компьютере, да и для себя, так что ничего не могу гарантировать. 2 А сам загрузчик запускаеться? 3 Можно белее полные сообщения об ошибках? 2Fantasist: 1 Я предложил вариант, который хоть и не универсальный, но его можно развить во что-нибудь более-менее нормальное. 2 Сама идея, заставить ОС думать, что кусок кода изменился, чтобы его теперь не свопить из первоначального exe основывалась только на документацию и на то что написано в книге Джефри Рихтера о памяти и о процессе работы ОС с ней. Никаких практических тестов не проводилось. |
|||
|
||||
BumSoft |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 17 Регистрация: 9.12.2002 Репутация: нет Всего: нет |
2XpyDi
Не мог быстро ответить-был в командировке. У меня WIN98(SE). При запуске WorkTable.exe вываливается по адресу 017f:00403b1c. Загрузчик сам запускается, при нажатии на кнопку WorkTable.exe вываливается по адресу 017f:00403b3e. |
|||
|
||||
XpyDi |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 114 Регистрация: 25.11.2002 Где: USSR Репутация: нет Всего: 2 |
2BumSoft
Посмотрел я на ошибки и если честно был крайне удивлен, т.е. первая срабатывает там где нужно, а вот вторая происходит: 1) уже после тех байт которые я записывал, т.е. я записывал в начало 31 байт, а исключение показывает на 34 байт от начала. 2) исключение указывает на середину интсрукции процессора. У меня, к несчастью, не стоит Win98(SE), поэтому тут есть 3 выхода: 1) ты повторишь этот эксперимент на своем компьютере и посмотришь на результаты. 2) После исключения сделаешь дамп памяти и отошлешь мне, а я уже буду смотреть. 3) Я перепишу эти программу на асм, т.к. тогда я буду уверен в каждом байте программы, а не только в логике её работы. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |