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

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

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

Сообщение Glyckmen » 26.07.2006 (Ср) 8:59

Добрый день!
Мне понадобилось сделать удаление запущенной программы из программы, как это реализовать? При попытке себя удалить прога ругается на ошибку 75.
Сейчас объясню по конкретней.
Я сделал модуль SFX (обыкновенный exe файл написанный на VB6 который читает присоедененные к нему данные) для расшифровки зашифрованного файла.
В моей основной программе зашифровывается файл и добавляется в конец модуля SFX. Теперь получился отдельный запускаемый файл с зашифрованным файлом. Я его запускаю, ввожу код, далее происходит чтение и расшифровка (с этим проблем нет) но я хочу чтобы программа автоматически удалялась(по решению пользователя) после расшифровки, оставляя после себя только расшифрованный файл. Помогите решить проблему.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 26.07.2006 (Ср) 9:04

Обсуждалось. ANDLL предлагал инъекцию в explorer.exe, но такое не будет работать без прав админа. Проще иметь отдельную прогу-удалитель, и запускать её.

См. тж. http://www.rsdn.ru/article/baseserv/QnADelExe.xml
Последний раз редактировалось tyomitch 26.07.2006 (Ср) 9:05, всего редактировалось 1 раз.
Изображение

Sasha_karasov
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 436
Зарегистрирован: 03.03.2005 (Чт) 19:38
Откуда: ua.dp

Сообщение Sasha_karasov » 26.07.2006 (Ср) 9:13

по этой теме была целая статья, так что стоит поискать.
Удачи!
С уважением, Алексадр.

Glyckmen
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 30.04.2006 (Вс) 15:32
Откуда: Санкт-Петербург

Сообщение Glyckmen » 26.07.2006 (Ср) 12:18

Все понял, что ничего не понял. Для меня эта функция не критична, просто хотелось сделать удобство для пользователя. А таскать ещё за собой удалитель тоже не выход, интересно а его кто будет удалять. :-)
Всем спасибо!

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

Сообщение Хакер » 26.07.2006 (Ср) 12:25

При выходе, создай батник, котоый удаляет прогу...
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 26.07.2006 (Ср) 12:44

Glyckmen писал(а):Все понял, что ничего не понял. Для меня эта функция не критична, просто хотелось сделать удобство для пользователя. А таскать ещё за собой удалитель тоже не выход, интересно а его кто будет удалять. :-)
Всем спасибо!

По ссылке не сходил?
Изображение

Glyckmen
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 30.04.2006 (Вс) 15:32
Откуда: Санкт-Петербург

Сообщение Glyckmen » 26.07.2006 (Ср) 19:01

Конечно смотрел, но там примеры на С и к тому-же с ограничениями, в первом должна быть переменная окружения, а в других примерах используется асемблер, короче надо разбираться.

Александр Дмитриев
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 296
Зарегистрирован: 05.01.2005 (Ср) 3:39
Откуда: Санкт-Петербург    Куда: /dev/null

Сообщение Александр Дмитриев » 26.07.2006 (Ср) 22:18

Ну а батник-то чем тебе не нравится?

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

Сообщение Хакер » 27.07.2006 (Чт) 1:56

Glyckmen
Батник - это файл с расширением .bat

в который ты создаёшь из проги и пишешь туда строчку

Код: Выделить всё
Open "killer.bar" For OutPut As #1
Print #1, "del "+App.ExeName
Print #1, "del killer.bat"
Close #1


И перед завершением проги делаешь
Shell "killer.bat"

прога закрывается и батник удаляет её EXEфайл и следом убивает себя. Всё - ничего не остаётся от твоей программы.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Сообщение Хакер » 27.07.2006 (Чт) 2:32

Батник будет работать дольше. Насколько я знаю - происходит огромная задежрка, ока открывается досовское окно. Вобщем, если не прокатит автор спросит, и мы ему штонить скажем.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

AjaxVS
Постоялец
Постоялец
 
Сообщения: 506
Зарегистрирован: 01.12.2004 (Ср) 13:12
Откуда: Donetsk, Battle.Net

Сообщение AjaxVS » 27.07.2006 (Чт) 3:57

Пока открывается dos-окно.. закрывается и сама прога. Батник в 99% работать не будет. Я уже давно использую (вроде, даже на форуме код когда-то писал) удаление через созданный скрипт vbs:

Перед концом проги создать в %temp% файл .vbs. В нем отслеживать окончание работы своей проги (с помощью WMI). Потом - постирать все нужные файлы (с помощью FSO).

Сложно? Вроде нет.. И надежно.

ЗЫ. Я обычно не удаляю .exe, а пишу в него такое содержание: "MZ По вопросам лицензионной покупки программы обращаться туда-то.." или типа того..

Glyckmen
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 30.04.2006 (Вс) 15:32
Откуда: Санкт-Петербург

Сообщение Glyckmen » 27.07.2006 (Чт) 10:14

Хакер
Ну во первых через bat файл это как-то некрасиво и во вторых- это не работает если имя exe файла содержит кирилицу, пользователь сам выбирает имя файла и тем более он может просто переименовать файл, что тогда делать?

AjaxVS
Я уже давно использую (вроде, даже на форуме код когда-то писал) удаление через созданный скрипт vbs:

Если не сложно то хотелось-бы по подробней, я просто ни разу не писал VBS.

ЗЫ. Я обычно не удаляю .exe, а пишу в него такое содержание: "MZ По вопросам лицензионной покупки программы обращаться туда-то.." или типа того..
Здесь дело в другом, я использую готовый исполняемый модуль (что-то вроде самораспаковывающегося архива), в основной программе я объединяю свой модуль и зашифрованный файл, в результате чего получается саморасшифровывающаяся программа, которая может быть перенесена на другой комп где нет моей основной программы, но запустив саморасшифратор и введя ключ для расшифровки пользователь получает исходный файл, а саморасшифратор после этого должен сам удалиться.

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

Сообщение Хакер » 27.07.2006 (Чт) 10:52

Glyckmen писал(а):ХакерЕсли не сложно то хотелось-бы по подробней, я просто ни разу не писал VBS.


Создай на рабочем столе файл "ha ha ha.txt". Открой его блокнотом, непиши
MsgBox "Всем привет!"

Поменяй расширение, с txt на vbs - и запусти. Вот тебе и будет скрипт на VBS.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Dummiel
Бывалый
Бывалый
 
Сообщения: 235
Зарегистрирован: 11.06.2004 (Пт) 9:15
Откуда: Алтай

Сообщение Dummiel » 27.07.2006 (Чт) 12:41

Glyckmen, на сайте в разделе статей была такая тема "Удаление приложения после завершения работы". Посмотри, глядишь чего зародится в голове. :)

Александр Дмитриев
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 296
Зарегистрирован: 05.01.2005 (Ср) 3:39
Откуда: Санкт-Петербург    Куда: /dev/null

Сообщение Александр Дмитриев » 27.07.2006 (Чт) 16:12

AjaxVS писал(а):Батник в 99% работать не будет

Как же не будет, когда я только что протестировал?
Glyckmen писал(а):это не работает если имя exe файла содержит кирилицу

Ну, может, ты ещё скажешь, что это не работает, если в батнике не указывать ни одной команды del. Хотя, конечно, это минус..
Glyckmen писал(а):пользователь... может просто переименовать файл, что тогда делать?

Тогда App.EXEName + ".exe" правильно определит имя нового файла.

Glyckmen
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 30.04.2006 (Вс) 15:32
Откуда: Санкт-Петербург

Сообщение Glyckmen » 27.07.2006 (Чт) 23:27

Александр Дмитриев писал(а):Ну, может, ты ещё скажешь, что это не работает, если в батнике не указывать ни одной команды del. Хотя, конечно, это минус..
А я не говорил что не надо использовать del, просто эта команда не понимает кирилицу.
Тогда App.EXENAME+".exe"
А здесь я имел ввиду что пользователь переименует исходное имя на имя с использованием кирилицы.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 28.07.2006 (Пт) 5:36

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

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 28.07.2006 (Пт) 7:54

Twister прочитал "хардкорные ассемблерные методы" с RSDN?
Что мешает заюзать их из прог на VB?
Изображение

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 28.07.2006 (Пт) 9:37

Нет, не читал. Есть линк?
А я все практикую лечение травами...

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 28.07.2006 (Пт) 10:22

Есть. В первом ответе.
"о пользе чтения топиков прежде, чем отвечать"
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 28.07.2006 (Пт) 10:31

Плохая статья.
Статья гораздо лучше - http://www.catch22.net/tuts/selfdel.asp
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 29.07.2006 (Сб) 6:24

tyomitch писал(а):Есть. В первом ответе.
"о пользе чтения топиков прежде, чем отвечать"
Ну прежде чем ответить я топик прочитал (иначе бы не писал сюда), да вот только по ссылке не ходил...

Да, а линк GSerg-а и впрямь поинформативней будет...
А я все практикую лечение травами...

Александр Дмитриев
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 296
Зарегистрирован: 05.01.2005 (Ср) 3:39
Откуда: Санкт-Петербург    Куда: /dev/null

Сообщение Александр Дмитриев » 03.08.2006 (Чт) 7:58

Glyckmen писал(а):я имел ввиду что пользователь переименует исходное имя на имя с использованием кирилицы.

Да, точно, ты прав. Просто я смотрел на эти две задачи по отдельности.

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

Re:

Сообщение Lunatic » 08.11.2009 (Вс) 1:18

GSerg писал(а):Плохая статья.
Статья гораздо лучше - http://www.catch22.net/tuts/selfdel.asp


Win API))

Нашёл такой код
Код: Выделить всё
#include <Windows.h>
#include <stdlib.h>
#include <tchar.h>

/////////////////////////////////////////////////////////////////////

// int WINAPI WinMain(HINSTANCE h, HINSTANCE h2, LPSTR psz, int n) {
int main(int argc,char* argv[])
{
// Is this the original EXE or the clone EXE?
// If the command-line 1 argument, this is the original EXE
// If the command-line >1 argument, this is the clone EXE
if (argc == 1) {
// Original EXE: Spawn clone EXE to delete this EXE
// Copy this EXEcutable image into the user's temp directory
TCHAR szPathOrig[_MAX_PATH], szPathClone[_MAX_PATH];
GetModuleFileName(NULL, szPathOrig, _MAX_PATH);
GetTempPath(_MAX_PATH, szPathClone);
GetTempFileName(szPathClone, __TEXT("Del"), 0, szPathClone);
CopyFile(szPathOrig, szPathClone, FALSE);
// Open the clone EXE using FILE_FLAG_DELETE_ON_CLOSE
HANDLE hfile = CreateFile(szPathClone, 0, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, NULL);
// Spawn the clone EXE passing it our EXE's process handle
// and the full path name to the original EXE file.
TCHAR szCmdLine[512];
HANDLE hProcessOrig = OpenProcess(SYNCHRONIZE, TRUE,
GetCurrentProcessId());
wsprintf(szCmdLine, __TEXT("%s %d \"%s\""), szPathClone,
hProcessOrig,szPathOrig);
STARTUPINFO si;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
PROCESS_INFORMATION pi;
CreateProcess(NULL, szCmdLine, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
CloseHandle(hProcessOrig);
CloseHandle(hfile);
// This original process can now terminate.
} else {
// Clone EXE: When original EXE terminates, delete it
HANDLE hProcessOrig = (HANDLE) _ttoi(argv[1]);
WaitForSingleObject(hProcessOrig, INFINITE);
CloseHandle(hProcessOrig);
DeleteFile(argv[2]);
// Insert code here to remove the subdirectory too (if desired).
// The system will delete the clone EXE automatically
// because it was opened with FILE_FLAG_DELETE_ON_CLOSE
}
return(0);
}


Пытался переделать под ВБ6((
Код: Выделить всё
Private Type STARTUPINFO
    cb As Long
    lpReserved As Long
    lpDesktop As Long
    lpTitle As Long
    dwX As Long
    dwY As Long
    dwXSize As Long
    dwYSize As Long
    dwXCountChars As Long
    dwYCountChars As Long
    dwFillAttribute As Long
    dwFlags As Long
    wShowWindow As Integer
    cbReserved2 As Integer
    lpReserved2 As Byte
    hStdInput As Long
    hStdOutput As Long
    hStdError As Long
End Type

Private Type PROCESS_INFORMATION
    hProcess As Long
    hThread As Long
    dwProcessId As Long
    dwThreadId As Long
End Type

Private Type SECURITY_ATTRIBUTES
    nLength As Long
    lpSecurityDescriptor As Long
    bInheritHandle As Long
End Type


Private Declare Sub ZeroMemory Lib "kernel32.dll" Alias "RtlZeroMemory" (ByRef Destination As Any, ByVal Length As Long)
Private Declare Function GetModuleFileName Lib "kernel32.dll" Alias "GetModuleFileNameA" (ByVal hModule As Long, ByVal lpFileName As String, ByVal nSize As Long) As Long
Private Declare Function GetTempPath Lib "kernel32.dll" Alias "GetTempPathA" (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long
Private Declare Function GetTempFileName Lib "kernel32.dll" Alias "GetTempFileNameA" (ByVal lpszPath As String, ByVal lpPrefixString As String, ByVal wUnique As Long, ByVal lpTempFileName As String) As Long
Private Declare Function CopyFile Lib "kernel32.dll" Alias "CopyFileA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal bFailIfExists As Long) As Long
Private Declare Function CreateFile Lib "kernel32.dll" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByRef lpSecurityAttributes As SECURITY_ATTRIBUTES, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Private Declare Function OpenProcess Lib "kernel32.dll" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function GetCurrentProcessId Lib "kernel32.dll" () As Long
Private Declare Function wsprintf Lib "user32.dll" (ByVal lpstr As String, ByVal lpcstr As String, ByRef OptionalArguments As Any) As Long
Private Declare Function CreateProcess Lib "kernel32.dll" Alias "CreateProcessA" (ByVal lpApplicationName As String, ByVal lpCommandLine As String, ByRef lpProcessAttributes As SECURITY_ATTRIBUTES, ByRef lpThreadAttributes As SECURITY_ATTRIBUTES, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, ByRef lpEnvironment As Any, ByVal lpCurrentDriectory As String, ByRef lpStartupInfo As STARTUPINFO, ByRef lpProcessInformation As PROCESS_INFORMATION) As Long
Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long
Private Declare Function WaitForSingleObject Lib "kernel32.dll" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function DeleteFile Lib "kernel32.dll" Alias "DeleteFileA" (ByVal lpFileName As String) As Long

Private Const MAX_PATH As Long = 260
Private Const FILE_SHARE_READ As Long = &H1
Private Const OPEN_EXISTING As Long = 3
Private Const SYNCHRONIZE As Long = &H100000
Private Const FILE_FLAG_DELETE_ON_CLOSE As Long = &H4000000
Private Const INFINITE As Long = &HFFFFFFFF

Private Function SelfKill(ARGC As Integer, ARGV() As Byte)
Dim hfile As Long
Dim szPathOrig As String * MAX_PATH
Dim szPathClone As String * MAX_PATH
Dim hProcessOrig As Long
Dim szCmdLine As String * 512
Dim SI As STARTUPINFO
Dim PI As PROCESS_INFORMATION
Dim lpSecurityAttributes As SECURITY_ATTRIBUTES

If ARGC = 1 Then
GetModuleFileName 0, szPathOrig, MAX_PATH
GetTempPath MAX_PATH, szPathClone
GetTempFileName szPathClone, "Del", 0, szPathClone
CopyFile szPathOrig, szPathClone, False
hfile = CreateFile(szPathClone, 0, FILE_SHARE_READ, lpSecurityAttributes, OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, 0&)
hProcessOrig = OpenProcess(SYNCHRONIZE, True, GetCurrentProcessId())
'#### Чё это вообще такое? И как оно работает?  А главное параметров сколько? Помоему больше чем нужно #####
'wsprintf szCmdLine, "%s %d \" & Chr(34) & "%s\" & Chr(34), szPathClone, hProcessOrig, szPathOrig
ZeroMemory SI, Len(SI)
SI.cb = Len(SI)
CreateProcess 0, szCmdLine, lpSecurityAttributes, lpSecurityAttributes, True, 0, 0, 0, SI, PI
CloseHandle (hProcessOrig)
CloseHandle (hfile)
Else
'##### Тут тоже не понял  ######
'hProcessOrig= (HANDLE)_ttoi(argv(1))
WaitForSingleObject hProcessOrig, INFINITE
CloseHandle (hProcessOrig)
DeleteFile (ARGV(2))
End If
SelfKill = 0
End Function


Посмотрите, может еще найдёте косяки в переводе.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

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

Сообщение ANDLL » 08.11.2009 (Вс) 11:06

Жудь

wsprintf szCmdLine, "%s %d \" & Chr(34) & "%s\" & Chr(34), szPathClone, hProcessOrig, szPathOrig
=>
dim szCmdLine as string
szCmdLine = szPathClone & " " & hProcessOrig & " """ & szPathOrig & """"

'##### Тут тоже не понял ######
'hProcessOrig= (HANDLE)_ttoi(argv(1))
А что в твоем коде вот это тогда значит:
If ARGC = 1 Then
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

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

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

Сообщение Lunatic » 08.11.2009 (Вс) 17:47

Ну если я правильно понял саму систему. То ход такой:
szCmdLine представляет из себя, имя файла клона, хендл процесса файл которого нам нужно убить, и сам файл для уничтожения.
Дальше создаём процесс для файла клона

// If the command-line 1 argument, this is the original EXE
// If the command-line >1 argument, this is the clone EXE
if (argc == 1) {

При создании процесса командная строка которого содержит больше одного аргумента идём к этой ужасной строчке
HANDLE hProcessOrig = (HANDLE) _ttoi(argv[1]);
WaitForSingleObject(hProcessOrig, INFINITE);
CloseHandle(hProcessOrig);
DeleteFile(argv[2]);

Тут я так понял нам нужно получить из параметров командной строки хендл процесса
дальше дождатся пока процесс не закроется и удалить файл.

P.S. помоему тут еще нужно добавить код который будет разбивать командную строку на параметры. Потому что тут чё-то такого невижу.

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

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

Сообщение Lunatic » 09.11.2009 (Пн) 1:05

Ура!))) ANDLL спс, натолкнул на правельную мысль.


Код: Выделить всё
Attribute VB_Name = "Terminator"
Option Explicit

Private Const MAX_PATH As Long = 260
Private Const FILE_SHARE_READ As Long = &H1
Private Const OPEN_EXISTING As Long = 3
Private Const SYNCHRONIZE As Long = &H100000
Private Const FILE_FLAG_DELETE_ON_CLOSE As Long = &H4000000
Private Const INFINITE As Long = &HFFFFFFFF
Private Const MOVEFILE_DELAY_UNTIL_REBOOT As Long = &H4
Private Const HIGH_PRIORITY_CLASS As Long = &H80
Private Const IDLE_PRIORITY_CLASS As Long = &H40
Private Const NORMAL_PRIORITY_CLASS As Long = &H20
Private Const INVALID_HANDLE_VALUE = -1

Private Type STARTUPINFO
    cb As Long
    lpReserved As Long
    lpDesktop As Long
    lpTitle As Long
    dwX As Long
    dwY As Long
    dwXSize As Long
    dwYSize As Long
    dwXCountChars As Long
    dwYCountChars As Long
    dwFillAttribute As Long
    dwFlags As Long
    wShowWindow As Integer
    cbReserved2 As Integer
    lpReserved2 As Byte
    hStdInput As Long
    hStdOutput As Long
    hStdError As Long
End Type

Private Type PROCESS_INFORMATION
    hProcess As Long
    hThread As Long
    dwProcessId As Long
    dwThreadId As Long
End Type

Private Type SECURITY_ATTRIBUTES
    nLength As Long
    lpSecurityDescriptor As Long
    bInheritHandle As Long
End Type

Private Type FILETIME
    dwLowDateTime As Long
    dwHighDateTime As Long
End Type

Private Type WIN32_FIND_DATA
    dwFileAttributes As Long
    ftCreationTime As FILETIME
    ftLastAccessTime As FILETIME
    ftLastWriteTime As FILETIME
    nFileSizeHigh As Long
    nFileSizeLow As Long
    dwReserved0 As Long
    dwReserved1 As Long
    cFileName As String * MAX_PATH
    cAlternate As String * 14
End Type

Private Declare Sub ZeroMemory Lib "kernel32.dll" Alias "RtlZeroMemory" (ByRef Destination As Any, ByVal Length As Long)
Private Declare Function GetModuleFileName Lib "kernel32.dll" Alias "GetModuleFileNameA" (ByVal hModule As Long, ByVal lpFileName As String, ByVal nSize As Long) As Long
Private Declare Function GetTempPath Lib "kernel32.dll" Alias "GetTempPathA" (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long
Private Declare Function GetTempFileName Lib "kernel32.dll" Alias "GetTempFileNameA" (ByVal lpszPath As String, ByVal lpPrefixString As String, ByVal wUnique As Long, ByVal lpTempFileName As String) As Long
Private Declare Function CopyFile Lib "kernel32.dll" Alias "CopyFileA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal bFailIfExists As Long) As Long
Private Declare Function CreateFile Lib "kernel32.dll" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByRef lpSecurityAttributes As SECURITY_ATTRIBUTES, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Private Declare Function OpenProcess Lib "kernel32.dll" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function GetCurrentProcessId Lib "kernel32.dll" () As Long
Private Declare Function CreateProcess Lib "kernel32.dll" Alias "CreateProcessA" (ByVal lpApplicationName As String, ByVal lpCommandLine As String, ByRef lpProcessAttributes As SECURITY_ATTRIBUTES, ByRef lpThreadAttributes As SECURITY_ATTRIBUTES, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, ByRef lpEnvironment As Any, ByVal lpCurrentDriectory As String, ByRef lpStartupInfo As STARTUPINFO, ByRef lpProcessInformation As PROCESS_INFORMATION) As Long
Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long
Private Declare Function WaitForSingleObject Lib "kernel32.dll" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function DeleteFile Lib "kernel32.dll" Alias "DeleteFileA" (ByVal lpFileName As String) As Long
Private Declare Function MoveFileEx Lib "kernel32" Alias "MoveFileExA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal dwFlags As Long) As Long
Private Declare Function FindFirstFile Lib "kernel32.dll" Alias "FindFirstFileA" (ByVal lpFileName As String, ByRef lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function FindClose Lib "kernel32.dll" (ByVal hFindFile As Long) As Long

Public Sub SelfKill()
    Dim TMP As String
    Dim CurPos As Integer
    Dim hfile As Long
    Dim szPathOrig As String
    Dim szPathClone As String
    Dim hProcessOrig As Long
    Dim szCmdLine As String
    Dim SI As STARTUPINFO
    Dim PI As PROCESS_INFORMATION
    Dim sec1 As SECURITY_ATTRIBUTES
    Dim sec2 As SECURITY_ATTRIBUTES
    Dim ret As Long
    Dim hProccess As Long
    Dim OriginalEXE As String
    Dim FindData As WIN32_FIND_DATA
    Dim hPStr As String
TMP = Command$

If Len(TMP) = 0 Then
    szPathOrig = String(MAX_PATH, Chr$(0))
    szPathClone = String(MAX_PATH, Chr$(0))
    ret = GetModuleFileName(0, szPathOrig, MAX_PATH)
    ret = GetTempPath(MAX_PATH, szPathClone)
    ret = GetTempFileName(szPathClone, "Del", 0, szPathClone)
    ret = CopyFile(szPathOrig, szPathClone, False)
    hfile = CreateFile(szPathClone, 0, FILE_SHARE_READ, sec1, OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, 0&)
    hProcessOrig = OpenProcess(SYNCHRONIZE, True, GetCurrentProcessId())
    szPathOrig = Left$(szPathOrig, InStr(szPathOrig, Chr$(0)) - 1)
    szPathClone = Left$(szPathClone, InStr(szPathClone, Chr$(0)) - 1)
    ret = MoveFileEx(szPathClone, vbNullString, MOVEFILE_DELAY_UNTIL_REBOOT)
    szCmdLine = szPathClone & " " & hProcessOrig & " #" & szPathOrig
    ZeroMemory SI, Len(SI)
    SI.cb = Len(SI)
    sec1.nLength = Len(sec1)
    sec2.nLength = Len(sec2)
    ret = CreateProcess(vbNullString, szCmdLine, sec1, sec2, True, NORMAL_PRIORITY_CLASS, Null, vbNullString, SI, PI)
    ret = CloseHandle(hProcessOrig)
    ret = CloseHandle(hfile)
    '------------------------>
   
    '<------------------------
    End
Else
CurPos = InStr(1, TMP, "#")
    If CurPos > 2 Then
    hPStr = Left(TMP, CurPos - 2)
        If IsNumeric(hPStr) Then
        hProccess = CLng(hPStr)
        OriginalEXE = Mid$(TMP, CurPos + 1)
        ret = FindFirstFile(OriginalEXE, FindData)
            If Not ret = INVALID_HANDLE_VALUE Then
            ret = FindClose(ret)
            ret = WaitForSingleObject(hProccess, INFINITE)
            ret = CloseHandle(hProccess)
            ret = DeleteFile(OriginalEXE)
            End If
        End If
    End If
End If
End Sub

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

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

Сообщение ANDLL » 09.11.2009 (Пн) 1:16

И что, работает? И темп-файл то же удаляет?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

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

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

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

Как часики!))
А темповский после перезапуска там же MOVEFILE_DELAY_UNTIL_REBOOT

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

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

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

Передача хендла через аргументы командной строки? Ну-ну...
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

След.

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

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

Сейчас этот форум просматривают: Google-бот и гости: 101

    TopList