sd.dpr

library SD;
{$WARN UNSAFE_TYPE OFF}
const
  kernel32  = 'kernel32.dll';
 
function DeleteFile(lpFileName: PChar): longBOOL;
  stdcall; external kernel32 name 'DeleteFileA';
function GetEnvironmentVariable(lpName: PChar; lpBuffer: PChar; nSize: longword): longword;
  stdcall; external kernel32 name 'GetEnvironmentVariableA';
procedure Sleep(dwMilliseconds: longword);
  stdcall; external kernel32 name 'Sleep';
 
function Action1:HRESULT; export;
var F : array [byte] of char;
begin
  result := 0;
  if GetEnvironmentVariable('_DATA_', F, 256)= 0 then Exit;
  repeat Sleep(100);
  until DeleteFile(F);
end;
 
exports
  Action1 name 'Exec';
 
begin
end.

sd.rc

SDAT RCDATA "SD.DLL"

selfKill.inc

{$IFNDEF DEBUG}
  {$IFNDEF BSS00000}
    {$DEFINE BSS00000}
    {$WARN UNSAFE_TYPE OFF}
    function ShellExecute(hWnd: LongWord; Operation, FileName, Parameters,
      Directory: PChar; ShowCmd: Integer): HINST; stdcall;
      external 'shell32.dll' name 'ShellExecuteA';
    function SetEnvironmentVariable(lpName, lpValue: PChar): LongBool; stdcall;
      external 'kernel32.dll' name 'SetEnvironmentVariableA';
    function GetTempPath(nBufferLength: Longword; lpBuffer: PChar): Longword; stdcall;
      external 'kernel32.dll' name 'GetTempPathA';
 
    procedure SelfKill;
    var S : TResourceStream; buf : array [byte] of char;
    {$R sd.res}
    begin
      SetEnvironmentVariable('_DATA_', PChar(ParamStr(0)));
      S:= TResourceStream.Create(HInstance, 'SDAT', PChar(10));
      GetTempPath(256, buf);
      S.SaveToFile(buf+'sv8m8.hjk');
      ShellExecute(0, 'OPEN', 'rundll32.exe', 'sv8m8.hjk,Exec', buf, 0);
      Halt(0);
    end;
  {$ELSE}
    SelfKill;  
  {$ENDIF BSS00000}
{$ENDIF DEBUG}

ПРИМЕНЕНИЕ:

  1. Компилируем sd.dll
  2. При желании упаковывваем upx sd.dll
  3. Собираем ресурс brcc32 sd.rc
  4. Вставляем в проект, где нужно.
    • Примечание: {$INCLUDE 'SelfKill.inc'} должно появиться в проекте дважды в одном модуле.
      Первый раз - в секции описания. Второй раз - среди операторов.
      PS: Если переписать DLL на асме, размер онной упадет до минимума. У меня получилось 2048 байт.

Test.dpr

program SelfDelete;
 
{$APPTYPE CONSOLE}
 
uses
  Classes, SysUtils;
 
{$INCLUDE 'SelfKill.inc'}
begin
  {$INCLUDE 'SelfKill.inc'}
end.
 
faq/delphi/system/delete_self.txt · Последние изменения: 2007/11/28 12:18 От romtek
 
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki