Delphi - база знаний

       

Как программе удалить саму себя?


Как программе удалить саму себя?



Первый способ:

uses 
  Windows, SysUtils; 

procedure DeleteMe; 
var 
  BatchFile: TextFile; 


  BatchFileName: string
  ProcessInfo: TProcessInformation; 
  StartUpInfo: TStartupInfo; 
begin 
  { создаём бат-файл в директории приложения }
  BatchFileName := ExtractFilePath(ParamStr(0)) + '$$336699.bat'; 

  { открываем и записываем в файл }
  AssignFile(BatchFile, BatchFileName); 
  Rewrite(BatchFile); 

  Writeln(BatchFile, ':try'); 
  Writeln(BatchFile, 'del "' + ParamStr(0) + '"'); 
  Writeln(BatchFile, 
    'if exist "' + ParamStr(0) + '"' + ' goto try'); 
  Writeln(BatchFile, 'del "' + BatchFileName + '"'); 
  CloseFile(BatchFile); 

  FillChar(StartUpInfo, SizeOf(StartUpInfo), $00); 
  StartUpInfo.dwFlags := STARTF_USESHOWWINDOW; 
  StartUpInfo.wShowWindow := SW_HIDE; 

  if CreateProcess(nil, PChar(BatchFileName), nilnil
     False, IDLE_PRIORITY_CLASSnilnil, StartUpInfo, 
     ProcessInfo) then 
  begin 
    CloseHandle(ProcessInfo.hThread); 
    CloseHandle(ProcessInfo.hProcess); 
  end

end;



А вот тот же способ, но немного модифицированный:

program delete2; 

uses 
  SysUtils, 
  windows; 

var 
   BatchFile: TextFile; 
   BatchFileName : string
   TM : Cardinal; 
   TempMem : PChar; 

begin 
    BatchFileName:=ExtractFilePath(ParamStr(0))+ '$$336699.bat'; 


   AssignFile(BatchFile, BatchFileName); 
   Rewrite(BatchFile); 

   Writeln(BatchFile,':try'); 
   Writeln(BatchFile,'del "' + ParamStr(0) + '"'); 
   Writeln(BatchFile,'if exist "' + ParamStr(0) + '" goto try'); 
   Writeln(BatchFile,'del "' + BatchFileName + '"'); 
   CloseFile(BatchFile); 

   TM:=70; 
   GetMem (TempMem,TM); 
   GetShortPathName (pchar(BatchFileName), TempMem, TM); 
   BatchFileName:=TempMem; 
   FreeMem(TempMem); 

   winexec(Pchar(BatchFileName),sw_hide); 

   halt; 

end.




Второй способ:

procedure DeleteSelf; 
var 
  module: HModule; 
  buf: array[0..MAX_PATH - 1] of char; 
  p: ULong; 
  hKrnl32: HModule; 
  pExitProcess, 
  pDeleteFile, 
  pFreeLibrary: pointer; 
begin 
  module := GetModuleHandle(nil); 
  GetModuleFileName(module, buf, SizeOf(buf)); 
  CloseHandle(THandle(4)); 
  p := ULONG(module) + 1; 
  hKrnl32 := GetModuleHandle('kernel32'); 
  pExitProcess := GetProcAddress(hKrnl32, 'ExitProcess'); 
  pDeleteFile := GetProcAddress(hKrnl32, 'DeleteFileA'); 
  pFreeLibrary := GetProcAddress(hKrnl32, 'FreeLibrary'); 
  asm 
    lea eax, buf 
    push 0 
    push 0 
    push eax 
    push pExitProcess 
    push p 
    push pDeleteFile 
    push pFreeLibrary 
    ret 
  end
end;


Взято с Исходников.ru



Содержание раздела