Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Beatrix - SelfDeleting.c

SelfDeleting.c

Caricato da: Piero Tofy
Scarica il programma completo

  1. /*
  2.  * Thanks to Giuseppe Caulo <giusc@softzone.it>
  3.  * and thanks to http://www.catch22.net/tuts/selfdel.asp
  4.  *
  5.  */
  6.  
  7. #include "SelfDeleting.h"
  8.  
  9. void remote_thread(SELFDEL *remote)
  10. {
  11.         // Attende che il processo padre termini
  12.         remote->fnWaitForSingleObject(remote->hParent, INFINITE);
  13.         remote->fnCloseHandle(remote->hParent);
  14.  
  15.         // prova a cancellare il file eseguibile
  16.         while(!remote->fnDeleteFile(remote->szFileName))
  17.         {
  18.                 // fallito - prova dinuovo fra poco
  19.                 remote->fnSleep(1000);
  20.         }
  21.         // finito! Possiamo uscire in modo pulito
  22.         remote->fnExitProcess(0);
  23. }
  24. void end_remote_thread(void) {}
  25.  
  26. BOOL SelfDelete(void)
  27. {
  28.     STARTUPINFO         si = { sizeof(si) };
  29.     PROCESS_INFORMATION pi;
  30.  
  31.     CONTEXT             context;
  32.     DWORD               oldProt;
  33.     SELFDEL             local;
  34.     DWORD               entrypoint;
  35.        
  36.         size_t                          func_siz;
  37.  
  38.     TCHAR               szExe[MAX_PATH] = _T("explorer.exe");
  39.  
  40.     //
  41.     //  Avvia l'eseguibile sospeso
  42.     //
  43.     if(CreateProcess(0, szExe, 0, 0, 0, CREATE_SUSPENDED|IDLE_PRIORITY_CLASS, 0, 0, &si, &pi))
  44.     {
  45.                 //Assegna un indirizzo alle funzioni da eseguire nel thread remoto
  46.         local.fnWaitForSingleObject     = (FARPROC)WaitForSingleObject;
  47.         local.fnCloseHandle             = (FARPROC)CloseHandle;
  48.         local.fnDeleteFile              = (FARPROC)DeleteFile;
  49.         local.fnSleep                   = (FARPROC)Sleep;
  50.         local.fnExitProcess             = (FARPROC)ExitProcess;
  51.         local.fnGetLastError            = (FARPROC)GetLastError;
  52.  
  53.         // Da' al processo remoto una copia dell'handle del nostro processo
  54.         DuplicateHandle(GetCurrentProcess(), GetCurrentProcess(),
  55.             pi.hProcess, &local.hParent, 0, FALSE, 0);
  56.  
  57.         GetModuleFileName(0, local.szFileName, MAX_PATH);
  58.  
  59.         //Copia il codice binario contenente le istruzioni da eseguire
  60.                 func_siz = ((DWORD)end_remote_thread-(DWORD)remote_thread);
  61.                 ZeroMemory(local.opCodes, 1024);
  62.                 CopyMemory((void *)local.opCodes, FUNC_ADDR(remote_thread), func_siz);
  63.                
  64.  
  65.         //
  66.         // Alloca dello spazio nello stack del processo e ci piazza dentro
  67.         // la nostra struttura SELFDEL. Dopodiché imposta il puntatore alle
  68.                 // istruzioni alla locazione desiderata e infine avvia il processo
  69.         //
  70.         context.ContextFlags = CONTEXT_INTEGER|CONTEXT_CONTROL;
  71.         GetThreadContext(pi.hThread, &context);
  72.  
  73.         // Alloca lo spazio nello stack correttamente allineato
  74.         entrypoint = (context.Esp - sizeof(SELFDEL)) & ~0x1F;
  75.  
  76.         //
  77.         // Inserisce il puntatore alla struttura alla fine dello stack
  78.         // in modo che diventi il primo argomento del thread remoto
  79.         //
  80.         local.Arg0 = (SELFDEL *)entrypoint;
  81.  
  82.         context.Esp = entrypoint - 4;   // crea un finto indirizzo di ritorno
  83.         context.Eip = entrypoint + 4;   // offset del codice all'interno della struttura
  84.  
  85.         // Copia il nostro codice+dati nell'entry-point dell'eseguibile
  86.         VirtualProtectEx(pi.hProcess,   (PVOID)entrypoint, sizeof(local), PAGE_EXECUTE_READWRITE, &oldProt);
  87.         WriteProcessMemory(pi.hProcess, (PVOID)entrypoint, &local, sizeof(local), 0);
  88.  
  89.         FlushInstructionCache(pi.hProcess, (PVOID)entrypoint, sizeof(local));
  90.  
  91.         SetThreadContext(pi.hThread, &context);
  92.  
  93.         // Consente al processo di essere eseguito
  94.         ResumeThread(pi.hThread);
  95.         CloseHandle(pi.hThread);
  96.         CloseHandle(pi.hProcess);
  97.  
  98.         return TRUE;
  99.     }
  100.  
  101.     return FALSE;
  102. }