Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Системное программирование и WinAPI > Удаление исполняемого файла самим приложением |
Автор: null56 28.1.2010, 15:28 | ||||
Всем привет Возникла задача, чтобы по истечению работы приложения, удалялся бы исполняемый файл самого приложения. Как известно, операционка помечает файлы, которые используются в данный момент и стандартным способом не получится
Я порыл в интернете нашел 1,5 способа: 1) создание bat файла в процессе работы программы, который бы в бесконечном цикле пытался удалить нужный файл, а потом закрывался (или сам себя тоже удалял, я так и не понял) http://sources.ru/cpp/faqs/47.htm 2) Второй способ, который я нашел, связан с использованием функции
но я так и не понял, можно ли выполнить с помощью неё задуманное Вопрос: существует ли способ (алтернативный от создания вспомогательных файлов на жестком диске) удаления, в процессе выполнения, собственного исполняемого файла? если есть, подскажите пожалуйста Заранее благодарен всем откликнувшимся ЗЫ: вариант через временные файлы может решить мою проблему? |
Автор: GremlinProg 28.1.2010, 15:48 | ||
используй MoveFileEx с флагом MOVEFILE_DELAY_UNTIL_REBOOT и путем назначения NULL
это нормальная операция, когда удалить файл больше некому, не надо мусорить батниками |
Автор: null56 28.1.2010, 15:49 |
Создание нового процесса не решит эту проблему? 1) Создаю новый процесс 2) Тут же завершаю текущий 3) Удаляю из нового процесса файл ... кажется вряд ли ( Добавлено через 46 секунд GremlinProg, да, я тоже к этому склоняюсь |
Автор: null56 28.1.2010, 17:43 |
Немного не в ту степь.... Раз под вындой нет fork, то реально ли сэмитировать его собственноручно? В смысле: 1) Создать область памяти 2) Загрузить туда исполняемый код 3) Передать указатель на эту область 4) Завершить первоначальный процесс или пускай не через память, а через какие - нибудь "временные файлы", которые бы находились на на жестком диске, а в памяти, которые можно было бы заполнить и запустить, а позже они бы почистились? нет ли ничего подобного в винде? |
Автор: GoldFinch 28.1.2010, 18:22 |
null56, инжектом в другой процесс) но вообще, наверное можно создать скрипт wsh (.vbs, .js) который сам себя удалит Добавлено через 3 минуты и 8 секунд вообще в идее с инжектом чтото есть. можно взять любой .exe, например notepad.exe, запустить его замороженным (SUSPENEDED) заменить в памяти код на нужный тебе, который в конце делает ExitProcess() тогда у этой запускаемой программы выполнение не дойдет даже до ее точки входа и загрузки ее длл, фактически от нее будет просто позаимствован файл. |
Автор: null56 28.1.2010, 19:05 |
GoldFinch, а ты реализовывал подмену кода другого процесса? я нет. подсказать можешь куда смотреть? |
Автор: GoldFinch 28.1.2010, 21:16 | ||
Такая задача весьма нетривиальная и занимательная. Здесь есть несколько нюансов - в дочерний процесс надо писать шеллкод, а С++ и шеллкоды - вещи малосовместимые, поэтому шеллкод проще написать на асме, благо он короткий. Само собой если писать 32-разрядный шеллкод, его надо внедрять в 32-разрядный процесс, для 64-разрядного- 64-разрядный процесс. Собственно вот код:
тестировал на 32рязрядной winXP, при этом заметил что если запускать калькулятор - шеллкод не срабатывает, и ollydbg почему-то не может приаттачиться к калькулятору (не видит его в списке процессов), а с блокнотом и другими программами все работает. |
Автор: GremlinProg 29.1.2010, 06:55 |
GoldFinch, ты это под каким антивирусом запускал? |
Автор: GoldFinch 29.1.2010, 09:10 |
GremlinProg, nod32 Вобщем-то если процесс создает дочерний процесс, то он имеет право делать с дочерним чтоугодно, так что антивирусы не должны этому мешать. Другое дело инжект уже в работающий процесс. |
Автор: GoldFinch 29.1.2010, 11:16 | ||
Есть куча программ которые запускают другие программы, например TotalCommander, если ты не знал, программы можно запускать не только через ярлычок или через эксплорер. Антивирус (и фаервол) никуда не смотрит и ничего не считает, там есть проактивка которая перехватывает часть функций АПИ ОС, и проверяет опасность тех или иных действий. Например фаерфол может запрещать инжект в процесс который добавлен в настройки фаервола как приложение которому разрешено работать с сетью. Но он не будет запрещать любой инжект как таковой, т.к. это вполне легальное действие. "антивирус считает тебя добропорядочным юзером и спокойно смотрит на твои в нем ковыряния" при чем тут юзер? в чем ковыряния? в антивирусе? пиши грамотно, по русски, а то я ничего не понимаю. |
Автор: GremlinProg 29.1.2010, 11:39 | ||||||
не надо путать редьку с хреном
![]()
на счет его легальности мы уже давно все выяснили, "НЕ ЛЕГАЛЬНО", безтолку не спорь, все доказано документально а вот на счет "не будет запрещать любой инжект", ну давай, пускай на тройке более-менее популярных антивирусов свой инжект в калькулятор, нодпад и т.п. софт )) кто первый пропустит? только вот если хоть один не пропустит, любой дальнейший выпад на эту тему будешь обсуждать с остальными, кто не осилил почитать учебник по информатике |
Автор: GoldFinch 29.1.2010, 11:54 | ||
пруфлинк давай
тебе охота проверить - вот и займись. |
Автор: null56 29.1.2010, 11:56 |
не ссортесь, ребята... на счет легитимности способа GoldFinch я сам особо не уверен надо проверять на различных антивирях и смотреть как они себя ведут. По своей сути я попросил GoldFinch показать мне метод инжекции, как его можно реализовать в винде, с другой стороны стоит палево со стороны антивирусов... сейчас стоит задача найти компромисс методами проверок... спасибо вам обоим за участие |
Автор: GremlinProg 29.1.2010, 11:57 |
http://forum.vingrad.ru/forum/topic-269823/kw-non-dll-inject/view-all.html |
Автор: xvr 29.1.2010, 12:58 |
Вариант с батником намного проще и безопаснее. Надо только не забыть из батника стереть его самого (после exe'ника). Для батников такой фокус проходит ![]() Вариант с MOVEFILE_DELAY_UNTIL_REBOOT оставит болтаться exe'ник в системе до ближайшего reboot'а, а он может случиться нескоро ![]() |
Автор: GremlinProg 29.1.2010, 13:08 |
реально проходит! к примеру, для C:\a.bat, последняя команда должна быть del C:\a.bat |
Автор: null56 29.1.2010, 14:56 |
знаю, что проходит... просто искал альтернативные решения |
Автор: bra1ny 29.1.2010, 17:39 |
GremlinProg, Абсолютно прав , на нормальнйо системе вам даже этого запустить не дадут. Взял пример с инжектом из этого топика , собрал , результат не заставил себя долго ждать ![]() Никто не даст вам писать в ап процесса и "мутить с потоком" , хотя бы потому что хукаются NtWriteVirtualMemory и NtSetContnextThread. |
Автор: cvid 6.3.2010, 18:43 | ||
А никому в голову не пришло использовать для удаления cmd? Просто делаем ShellExecute и удаляем командой "del" собственный файл. Вот готовый код:
Проверенно собственноручно уже много раз. P.S: данный способ абсолютно легален и антивири на него не ругаются))) |
Автор: xvr 6.3.2010, 19:02 | ||
Приходило, о чем и было написанно несколько постов назад ![]() |