Удаление самого себя

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Lunatic
Обычный пользователь
Обычный пользователь
 
Сообщения: 98
Зарегистрирован: 04.03.2008 (Вт) 17:33

Re: Удаление самого себя

Сообщение Lunatic » 09.11.2009 (Пн) 4:48

А как тогда? Какие последствия?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Удаление самого себя

Сообщение Хакер » 09.11.2009 (Пн) 5:40

Я бы посоветовал вообще не заниматься этой глупостью.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Lunatic
Обычный пользователь
Обычный пользователь
 
Сообщения: 98
Зарегистрирован: 04.03.2008 (Вт) 17:33

Re: Удаление самого себя

Сообщение Lunatic » 09.11.2009 (Пн) 11:12

Так всё же чем это чревато?

А если попробывать узнать с помощью NtQueryInformationProcess имя родителя в клоне, и килнуть его?

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Удаление самого себя

Сообщение iGrok » 09.11.2009 (Пн) 14:50

Lunatic писал(а):Так всё же чем это чревато?

А если попробывать узнать с помощью NtQueryInformationProcess имя родителя в клоне, и килнуть его?

А что тебе мешает передавать на хэндл, а PID?
label:
cli
jmp label

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Удаление самого себя

Сообщение Хакер » 09.11.2009 (Пн) 14:53

Что чем чревато? Самоубийство? Тем, что это нарушает одно из главных правил компьютерного этикета: удалять файлы имеет право только тот, кто их создал. Программа свой exe-файл сама не создала, его создал я, явно, скачав из интернета, или косвенно, запустив программу установки. Следовательно и удалять этот exe-файл не её (программы) собачья привилегия.

Кроме того, метод может обломиться (и я желаю ему этого) в трёх местах:
1) На CreateFile, с отказом в доступе.
2) На WaitForSingleObject, с WAIT_FAILED, из-за некорректного хендла. Соответственно, программа попытается убить файл-образ, пока процесс ещё работает, и получит отказ в доступе.
3) При удалении файла, с отказом в доступе (из-за того, что удаление запрещено, или из-за того, например, что были ещё работающие экземпляры).
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Удаление самого себя

Сообщение Хакер » 09.11.2009 (Пн) 15:13

С корректностью хендла отбой, я проглядел TRUE в handle inheritance. Впрочем, я бы всё равно юзал DuplicateHandle.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Lunatic
Обычный пользователь
Обычный пользователь
 
Сообщения: 98
Зарегистрирован: 04.03.2008 (Вт) 17:33

Re: Удаление самого себя

Сообщение Lunatic » 09.11.2009 (Пн) 18:46

Ну CreateFile специально в темповскую папку и пихается, потому что доступ к остальному пространству может быть ограничен. А вот лок на темп, это уже круто) К тому же можно добавить кучу проверок, ret ведь не просто так подобавлял (создание файла, корректность хендла, ну и с удалением тоже)

Насчёт удаления файла самим собой, я тоже против того чтоб программы жили своей жизнью). К примеру хочу сделать обновление версии, без отдельного апдейтера. Притом можно сделать всё по выбору юзера. Всё зависит от человека который пишет прогу, а не от способов которыми он пользуется.

Lunatic
Обычный пользователь
Обычный пользователь
 
Сообщения: 98
Зарегистрирован: 04.03.2008 (Вт) 17:33

Re: Удаление самого себя

Сообщение Lunatic » 09.11.2009 (Пн) 19:27

А DuplicateHandle как юзать? Я прост раньше не сталкивался.

Так?
Код: Выделить всё
hProcessOrig = OpenProcess(SYNCHRONIZE, True, GetCurrentProcessId())
ret=DuplicateHandle(hProcessOrig ,DHandle, hProcessOrig, DHandle, 0&, 0&, DUPLICATE_SAME_ACCESS)
If ret=0 Then ....

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Удаление самого себя

Сообщение Хакер » 09.11.2009 (Пн) 22:13

Lunatic писал(а):Ну CreateFile специально в темповскую папку и пихается, потому что доступ к остальному пространству может быть ограничен. А вот лок на темп, это уже круто) К тому же можно добавить кучу проверок, ret ведь не просто так подобавлял (создание файла, корректность хендла, ну и с удалением тоже)

А он не из-за прав, а из-за того, что EXE-файл пытается создать, будет обломан.

Насчёт удаления файла самим собой, я тоже против того чтоб программы жили своей жизнью). К примеру хочу сделать обновление версии, без отдельного апдейтера. Притом можно сделать всё по выбору юзера. Всё зависит от человека который пишет прогу, а не от способов которыми он пользуется.

Вот для этого и сделаны Delayed-операции.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Re: Удаление самого себя

Сообщение Andrey Fedorov » 10.11.2009 (Вт) 10:32

В принципе, в интернете ходит следующий код самоуничтожения:

Код: Выделить всё
Option Explicit

Public Type SHELLEXECUTEINFO
        cbSize As Long
        fMask As Long
        hwnd As Long
        lpVerb As String
        lpFile As String
        lpParameters As String
        lpDirectory As String
        nShow As Long
        hInstApp As Long
        '  Optional fields
        lpIDList As Long
        lpClass As String
        hkeyClass As Long
        dwHotKey As Long
        hIcon As Long
        hProcess As Long
End Type

Public Const IDLE_PRIORITY_CLASS = &H40
Public Const SEE_MASK_NOCLOSEPROCESS = &H40
Public Const REALTIME_PRIORITY_CLASS = &H100
Public Const THREAD_BASE_PRIORITY_LOWRT = 15
Public Const THREAD_PRIORITY_TIME_CRITICAL = THREAD_BASE_PRIORITY_LOWRT
Public Const NORMAL_PRIORITY_CLASS = &H20
Public Const THREAD_PRIORITY_NORMAL = 0
Public Const SW_HIDE = 0

Public Declare Function SetProcessPriorityBoost Lib "kernel32" (ByVal hProcess As Long, ByVal DisablePriorityBoost As Long)
Public Declare Function GetModuleFileName Lib "kernel32" Alias "GetModuleFileNameA" (ByVal hModule As Long, ByVal lpFileName As String, ByVal nSize As Long) As Long
Public Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long
Public Declare Function GetEnvironmentVariable Lib "kernel32" Alias "GetEnvironmentVariableA" (ByVal lpName As String, ByVal lpBuffer As String, ByVal nSize As Long) As Long
Public Declare Function SetPriorityClass Lib "kernel32" (ByVal hProcess As Long, ByVal dwPriorityClass As Long) As Long
Public Declare Function SetThreadPriority Lib "kernel32" (ByVal hThread As Long, ByVal nPriority As Long) As Long
Public Declare Function GetCurrentProcess Lib "kernel32" () As Long
Public Declare Function GetCurrentThread Lib "kernel32" () As Long
Public Declare Function ShellExecuteEx Lib "shell32.dll" Alias "ShellExecuteExA" (sei As SHELLEXECUTEINFO) As Long

Sub Main()
    SelfDelete
End Sub

Function SelfDelete() As Boolean
  Dim sei As SHELLEXECUTEINFO
  Dim sModule As String, sComspec As String, i As Long
 
  sModule = App.Path & "\" & App.EXEName & ".exe"
  i = GetShortPathName(sModule, sModule, Len(sModule))
  sModule = Left$(sModule, i)
  sComspec = Environ("COMSPEC")
 
    If Len(sComspec) Then
        sei.cbSize = LenB(sei)
        sei.hwnd = 0
        sei.lpVerb = "Open"
        sei.lpFile = sComspec
        sei.lpParameters = "/c del " & sModule & " > nul"
        sei.lpDirectory = 0
        sei.nShow = SW_HIDE
        sei.fMask = SEE_MASK_NOCLOSEPROCESS
        SetPriorityClass GetCurrentProcess(), REALTIME_PRIORITY_CLASS
        SetThreadPriority GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL
        If ShellExecuteEx(sei) <> 0 Then
            SetPriorityClass sei.hProcess, IDLE_PRIORITY_CLASS
            SetProcessPriorityBoost sei.hProcess, 1
            SelfDelete = True
        Else
            SetPriorityClass GetCurrentProcess(), NORMAL_PRIORITY_CLASS
            SetThreadPriority GetCurrentThread(), THREAD_PRIORITY_NORMAL
        End If
    End If
End Function


Но его беда в том что он далеко не всегда срабатывает...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Re: Удаление самого себя

Сообщение Andrey Fedorov » 10.11.2009 (Вт) 10:38

Lunatic писал(а):Насчёт удаления файла самим собой, я тоже против того чтоб программы жили своей жизнью). К примеру хочу сделать обновление версии, без отдельного апдейтера. Притом можно сделать всё по выбору юзера. Всё зависит от человека который пишет прогу, а не от способов которыми он пользуется.


С обновлением версии проще - команда Name вполне нормально работает и с Exe-шником собственно программы...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Lunatic
Обычный пользователь
Обычный пользователь
 
Сообщения: 98
Зарегистрирован: 04.03.2008 (Вт) 17:33

Re: Удаление самого себя

Сообщение Lunatic » 10.11.2009 (Вт) 14:50

Хакер писал(а):
Lunatic писал(а):Ну CreateFile специально в темповскую папку и пихается, потому что доступ к остальному пространству может быть ограничен. А вот лок на темп, это уже круто) К тому же можно добавить кучу проверок, ret ведь не просто так подобавлял (создание файла, корректность хендла, ну и с удалением тоже)

А он не из-за прав, а из-за того, что EXE-файл пытается создать, будет обломан.


И что? Чё-то я не вьеду. Куча программ создают файлы, и вроде траблов никаких нет. Или ты за то что файл неупеет создатся, до закрытия процесса?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Удаление самого себя

Сообщение Хакер » 10.11.2009 (Вт) 16:03

Куча программ создают файлы

Так у тебя же не просто файлы, у тебя exe-файл.
Мне известно лишь три категории программ, создающих EXE-файлы:
1) Компиляторы.
2) Распаковщики (архиваторы и инсталляторы)
3) Вредоносные.

Твой способ порождает четвёртую категорию: самоубийцы. И её, вероятно, ждёт такой же облом, как и третью: первые две создают EXE-файлы потому что это нужно пользователю (поэтому он позаботится, чтобы у них это получилось, если он по по умолчанию запретил такое), вторые две создают exe-файл из "личных" интересов.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: Удаление самого себя

Сообщение MIT » 10.11.2009 (Вт) 16:20

На правах оффтопа:
Хакер писал(а):Мне известно лишь три категории программ, создающих EXE-файлы
Lunatic, обмани всех: создай .bin файл, а потом переименуй его в .exe.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Удаление самого себя

Сообщение Хакер » 10.11.2009 (Вт) 16:31

Это обманет не всех, а только очень тупой ограничивающий софт.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Lunatic
Обычный пользователь
Обычный пользователь
 
Сообщения: 98
Зарегистрирован: 04.03.2008 (Вт) 17:33

Re: Удаление самого себя

Сообщение Lunatic » 10.11.2009 (Вт) 19:06

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

P.S. Да если юзер решит зарезать этот процесс самоуничтожения, ну на здоровье. Пусть хоть своими средствами это делает, хоть в проге у меня невключает эту функцию.
(Главное что всё будет происходить по согласию юзера, а не без его ведома)

qwertyhp
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 156
Зарегистрирован: 07.10.2009 (Ср) 15:02
Откуда: Москва

Re: Удаление самого себя

Сообщение qwertyhp » 15.11.2009 (Вс) 9:03

Я поступил бы проще. В программу прописывается:
1)Запись адреса местоположения шифрованной программы (ну, например, в реестр);
2)Запуск рассшифрованной программы;
3) Удаление программы, находящейся по считанному (см. п.1) из реестра адресу.
Как это работает.
1. Запускается исходная (шифрованная) копия программы.
2. Она пытается считать в переменную XXX свой адрес из реестра.
Если это действительно шифрованная копия - то никакого адреса ещё нет:
Len(Trim$((XXX)) = 0;
обрабатываем ошибку, пишем свой адрес+ИМЯ.EXE в реестр,
дешифровываемся, и - запускаем уже дешифрованную копию.
DoEvents
End.

Запущенная дешифрованная копия начинает выполнять два первых пункта.
Но п.2 выполняется правильно, поэтому
If Len(Trim$((XXX)) <> 0 (т.е. запуск дешифрованной копии) - Then
KILL XXX [XXX - переменная, суть адрес из реестра].
DEL эту самую запись в реестре, чтобы не вызвала в будущем ошибку.
END.
End If

Собственно, всё.
Пятачок Forever! :)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Удаление самого себя

Сообщение Хакер » 15.11.2009 (Вс) 9:09

Не пишите больше такую ерунду.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: Удаление самого себя

Сообщение SLIM » 15.11.2009 (Вс) 19:52

Хакер, ты говорил о документированном способе удаления программы.
Или я пропустил или поведуй если не трудно?
Пишите жизнь на чистовик.....переписать не удастся.....

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Удаление самого себя

Сообщение Хакер » 15.11.2009 (Вс) 21:28

Выше говорил.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

qwertyhp
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 156
Зарегистрирован: 07.10.2009 (Ср) 15:02
Откуда: Москва

Re: Удаление самого себя

Сообщение qwertyhp » 16.11.2009 (Пн) 16:03

[Хакер] :: Бред удалён.
Пятачок Forever! :)

Пред.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: YaCy [Bot] и гости: 90

    TopList