Einzelnen Beitrag anzeigen

Benutzerbild von LoCrux
LoCrux

Registriert seit: 5. Mär 2007
Ort: Gwang-Yang-City
48 Beiträge
 
Delphi 2009 Enterprise
 
#20

Re: Programm löscht sich selber !

  Alt 28. Nov 2007, 05:33
Also,

die Loesung fuer Dich: einen Windows-Dienst erstellen, der den "NTFS Last-Access-Timestamp" fuer Dein Programm ausliest und nach gewuenscher Bedingung loescht.
How To Service (TUT von MaBuSE): hier
Muss allerdings garantier sein, das der Schluessel
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Contro l\FileSystem\NtfsDisableLastAccessUpdate=0 (DWORD)
gesetzt ist.
Nachteil: Der Dienst bleibt fuer alle Ewigkeit wenn Du ihn nicht deinstallierst.

Sollte das fuer Dich nicht in Frage kommen, kann ich nur mit einer "suicide" Routine dienen,
die allerdings das ausfuehren deines "Tools" [] bedingt.
WARNUNG: Sie funzt ist aber Quick'N'Dirty.

Die Suicide.exe

Delphi-Quellcode:
program Suicide;

{$APPTYPE CONSOLE}


uses
  SysUtils,
  TLHelp32,
  Windows;

var
  fn : PAnsiChar;
  cnt : Integer;

function KillTask(ExeFileName: string): Integer;
const
  PROCESS_TERMINATE = $0001;
var
  ContinueLoop : Boolean;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
begin
  Result := 0;
  FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
  ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);

  while Integer(ContinueLoop) <> 0 do
  begin
    if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
      UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) =
      UpperCase(ExeFileName))) then
      Result := Integer(TerminateProcess(
                        OpenProcess(PROCESS_TERMINATE,
                                    BOOL(0),
                                    FProcessEntry32.th32ProcessID),
                                    0));
     ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
  end;
  CloseHandle(FSnapshotHandle);
end;

begin
  if (ParamCount>0)
  then begin
    fn := PAnsiChar(ParamStr(1));
    if FileExists(fn)
    then begin
      if (KillTask(ExtractFileName(fn))=1)
      then begin
        cnt := 0;
        // WHY!!! Warten bis Windoof die Datei Freigegeben hat, solange halt den Versuch
        // unternehmen zu loeschen.
        // Dine exe darf nicht scheibgeschuetzt sein. Kann man aber ja noch einbauen.
        while (FileExists(fn) and (cnt<1000))
        do begin
          inc(cnt);
          DeleteFile(fn);
          Sleep(5);
        end
      end;
    end;
  end;
end.
Sollte selbsterklaerend sein.

In Deinem Tool:

Delphi-Quellcode:
uses
  ..,ShellApi,QFileCtrls,uHexFile,..; // uHexFile enthaelt die "Binary" der Suicide.exe

const
  fn : String = 'suicide.exe'; // Die Suicide.Exe
Delphi-Quellcode:
procedure CommitSuicide;
var
  FOutHandle,
  FOutLength : Integer;
  myName : String;
begin
  // Create The suicide.exe
  if not(FileExists(fn))
  then FOutHandle := FileCreate(fn)
  else FOutHandle := FileOpen(fn, fmOpenWrite);
  FileWrite(FOutHandle,HexFile,SizeOf(HexFile));
  FileClose(FOutHandle);
  // Call suicide.exe
  myName := ExtractFileName(ParamStr(0));
  ShellExecute(Handle, nil, PChar(fn) ,PChar(myName),NIL, SW_HIDE);
end;
uHexFile.pas (Auszug)

Delphi-Quellcode:
unit uHexFile;

interface

Type
  ArrOfByte = Array[0..42495] Of Byte;

Const
  HexFile : ArrOfByte = (
077,090,080,000,002,000,000,000,004,000,015,000,255,255,000,000,184,000,000,000,000,
000,000,000,064,000,026,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,
000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,001,000,
000,186,016,000,014,031,180,009,205,033,184,001,076,205,033,144,144,084,104,105,115,
032,112,114,111,103,114,097,109,032,109,117,115,116,032,098,101,032,114,117,110,032,
117,110,100,101,114,032,087,105,110,051,050,013,010,036,055,000,000,000,000,000,000,
000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,
000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,
000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,
.
.
.
000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,
000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,
000,000,000,000,000,000,000,000,000,000,000,000,000);


implementation

end.
OK. Wie gesagt. Suboptimal. Aber als Ansatz vielleicht brauchbar.
Man koennte z.B. in die Suicide.exe noch nen 'Secure Delete' Algorithmus einbauen
und das 'HexFile' komprimiert ablegen (z.B. zLib oder LZMA).


PS. Bevor Fragen aufkommen. I know 'uBinFile' waere passender. War aber zu faul.

//Edit: Service TUT eingefuegt.
Angehängte Dateien
Dateityp: pas uhexfile_148.pas (170,1 KB, 2x aufgerufen)
“C++ is an insult to the human brain.” [Niklaus Wirth]

2B OR NOT 2B (.. THAT IS FF)