Как сделать чтобы запущеный exe сам себя удалил?
Шитц Виталий
Как сделать чтобы запущеный exe сам себя удалил? Можно
сгегерировать BAT-файл и выполнить его, а можно и по другому:
Этот код требует, чтобы была определена переменная
окружения COMSPEC, работает на всех ОС Windows.
После вызова функции нужно немедленно выходить из
программы, иначе не сработает.
Автор Tony Varnas.
BOOL SelfDelete()
{
TCHAR szFile[MAX_PATH],
szCmd[MAX_PATH];
if((GetModuleFileName(0,szFile,MAX_PATH)!=0)
&&
(GetShortPathName(szFile,szFile,MAX_PATH)!=0))
{
lstrcpy(szCmd,"/c del
");
lstrcat(szCmd,szFile);
lstrcat(szCmd," >>
NUL");
if((GetEnvironmentVariable("ComSpec",szFile,MAX_PATH)!=0)
&&
((INT)ShellExecute(0,0,szFile,szCmd,0,SW_HIDE)>32))
return TRUE;
}
return FALSE;
}
Следующий код работает только под NT, автор Gary
Nebbett:
include
int main(int argc, char *argv[])
{
char buf[MAX_PATH];
HMODULE module;
module = GetModuleHandle(0);
GetModuleFileName(module, buf,
MAX_PATH);
CloseHandle((HANDLE)4);
__asm
{
lea eax, buf
push 0
push 0
push eax
push ExitProcess
push module
push DeleteFile
push UnmapViewOfFile
ret
}
return 0;
}
Ну а это – вариант предыдущего, но под Win9x, автор
Tony Varnas.
int main(int argc, char *argv[])
{
char buf[MAX_PATH];
HMODULE module;
module = GetModuleHandle(0);
GetModuleFileName(module, buf,
MAX_PATH);
__asm
{
lea eax, buf
push 0
push 0
push eax
push ExitProcess
push module
push DeleteFile
push FreeLibrary
ret
}
return 0;
}
Ну и два последних в одной функции:
void SelfDelete()
{
char buf[MAX_PATH];
HMODULE module;
DWORD fnFreeOrUnmap;
module = GetModuleHandle(0);
GetModuleFileName(module, buf,
MAX_PATH);
// На случай Win9x
if(0x80000000 &
GetVersion())
{
fnFreeOrUnmap = FreeLibrary;
}
// для ядра WinNT
else
{
fnFreeOrUnmap =
UnmapViewOfFile;
CloseHandle((HANDLE)4);
}
__asm
{
lea eax, buf
push 0
push 0
push eax
push ExitProcess
push module
push DeleteFile
push fnFreeOrUnmap
ret
}
}
Список литературы
Для подготовки данной работы были использованы
материалы с сайта http://www.rsdn.ru/