Сообщений 6    Оценка 39        Оценить  
Система Orphus

Как сделать чтобы запущеный exe сам себя удалил?

Автор: Шитц Виталий
Источник: RSDN Magazine #4-2004
Опубликовано: 28.10.2004
Исправлено: 10.12.2016

Q. Как сделать чтобы запущеный exe сам себя удалил?

A. Можно сгегерировать 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 <windows.h>

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);

    // На случай Win9xif(0x80000000 & GetVersion())
    {
        fnFreeOrUnmap = FreeLibrary;
    }
    // для ядра WinNTelse    
    {
       fnFreeOrUnmap = UnmapViewOfFile; 
       CloseHandle((HANDLE)4);
    }

    __asm 
    {
      lea     eax, buf
      push    0
      push    0
      push    eax
      push    ExitProcess
      push    module
      push    DeleteFile
      push    fnFreeOrUnmap
      ret
    }
}


Эта статья опубликована в журнале RSDN Magazine #4-2004. Информацию о журнале можно найти здесь
    Сообщений 6    Оценка 39        Оценить