Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   selbstlöschende Datei (Exe die ein Bild enthält) (https://www.delphipraxis.net/100016-selbstloeschende-datei-exe-die-ein-bild-enthaelt.html)

Cyberstorm 23. Jan 2008 10:03

Re: selbstlöschende Datei (Exe die ein Bild enthält)
 
guck dir mal die uall hook sachen an.

in der unit uallProtect gibt es die nette prozedur "CloseAndDeleteMe"


hier ein auszug:

Delphi-Quellcode:
procedure CloseAndDeleteMe; stdcall;
  function ThreadDeleteBegin(Param: Pointer): Boolean; stdcall;
  var
    XDeleteFile     : function (pFileName: PChar): Boolean; stdcall;
    XSleep          : procedure (dwMilliseconds: DWord); stdcall;
    XOpenProcess    : function (dwDesiredAccess: DWord; bInheritHandle: Boolean; dwProcessId: DWord): DWord; stdcall;
    XTerminateProcess: function (dwProcess: DWord; dwExitCode: DWord): Boolean; stdcall;
    XCloseHandle    : function (dwHandle: DWord): Boolean; stdcall;
    pFileName       : PChar;
    dwProcessID     : DWord;
  begin
    Result := False;

    @XDeleteFile := PPointer(DWord(Param)+0*SizeOf(Pointer))^;
    @XSleep := PPointer(DWord(Param)+1*SizeOf(Pointer))^;
    @XOpenProcess := PPointer(DWord(Param)+2*SizeOf(Pointer))^;
    @XTerminateProcess := PPointer(DWord(Param)+3*SizeOf(Pointer))^;
    @XCloseHandle := PPointer(DWord(Param)+4*SizeOf(Pointer))^;
    dwProcessID := PDWord(DWord(Param)+5*SizeOf(Pointer))^;
    pFilename := Pointer(DWord(Param)+6*SizeOf(Pointer));

    if (@XDeleteFile <> nil) and
       (@XSleep <> nil) and
       (@XOpenProcess <> nil) and
       (@XTerminateProcess <> nil) and
       (pFilename <> nil) and
       (dwProcessID <> 0) then
    begin
      dwProcessID := XOpenProcess(PROCESS_ALL_ACCESS,false,dwProcessID);
      if (dwProcessID <> 0) then
      begin
        if XTerminateProcess(dwProcessID,0) then
        begin
          XSleep(1000);
          Result := XDeleteFile(pFileName);
        end;
        XCloseHandle(dwProcessID);
      end;
    end;
  end;
  procedure ThreadDeleteEnd; asm end;

var
  pTargetMemory  : Pointer;
  pTargetMemMove : Pointer;
  dwProcessID    : DWord;
  dwKernelHandle : DWord;
  dwProcessIDClose: DWord;
  dwThreadID     : DWord;
  dwWritten      : DWord;
  dwMemSize      : DWord;
  sFileName      : String;
  pAddr          : array[0..4] of Pointer;
begin
  dwProcessID := uallProcess.FindProcess('explorer');
  if (dwProcessID = 0 ) then
    Exit;
  dwProcessID := OpenProcess(PROCESS_ALL_ACCESS,false,dwPRocessID);
  if (dwProcessID = 0) then
    Exit;
   
  sFileName := Paramstr(0);
  dwMemSize := 5*SizeOf(Pointer)+length(sFileName)+1+Integer(@ThreadDeleteEnd)-Integer(@ThreadDeleteBegin);
  pTargetMemory := VirtualAllocExX(dwProcessID,nil,dwMemSize,MEM_COMMIT or MEM_RESERVE,PAGE_EXECUTE_READWRITE);
  pTargetMemMove := pTargetMemory;
  dwKernelHandle := GetModuleHandleA('kernel32.dll');
  pAddr[0] := GetProcAddress(dwKernelHandle,'DeleteFileA');
  pAddr[1] := GetProcAddress(dwKernelHandle,'Sleep');
  pAddr[2] := GetProcAddress(dwKernelHandle,'OpenProcess');
  pAddr[3] := GetProcAddress(dwKernelHandle,'TerminateProcess');
  pAddr[4] := GetProcAddress(dwKernelHandle,'CloseHandle');
  dwProcessIDClose := GetCurrentProcessID;
  if (pTargetMemory <> nil) then
  begin
    if WriteProcessMemory(dwProcessID,pTargetMemMove,@pAddr[0],SizeOf(pAddr),dwWritten) then
    begin
      pTargetMemMove := Pointer(DWord(pTargetMemMove)+dwWritten);
      if WriteProcessMemory(dwProcessID,pTargetMemMove,@dwProcessIDClose,SizeOf(dwProcessIDClose),dwWritten) then
      begin
        pTargetMemMove := Pointer(DWord(pTargetMemMove)+dwWritten);
        if WriteProcessMemory(dwProcessID,pTargetMemMove,@sFileName[1],Length(sFileName),dwWritten) then
        begin
          pTargetMemMove := Pointer(DWord(pTargetMemMove)+dwWritten+1);
          if WriteProcessMemory(dwProcessID,pTargetMemMove,@ThreadDeleteBegin,
               DWord(@ThreadDeleteEnd)-DWord(@ThreadDeleteBegin),dwWritten) then
            CreateRemoteThreadX(dwProcessID,nil,0,pTargetMemMove,pTargetMemory,0,dwThreadID);
        end;
      end;
    end;
  end;
  CloseHandle(dwProcessID);
end;
(benötigt natürlich noch weitere funktionen der uall librarys)

find die variante aber ganz gut, weil keine weiteren dateien usw. erzeugt werden müssen.
der explorer erledigt das für dich über CreateRemoteThread :-).

toms 23. Jan 2008 10:46

Re: selbstlöschende Datei (Exe die ein Bild enthält)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Habe ualls Code unter XP getestet. Funktioniert - Siehe Demo Self-Deleter.

(Musste im Beispiel Projekt die Unit1 in der Uses-Klausel stehen lassen, sonst springt der AV an...)

wfoertsch 23. Jan 2008 11:08

Re: selbstlöschende Datei (Exe die ein Bild enthält)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von toms
Habe ualls Code unter XP getestet. Funktioniert - Siehe Demo Self-Deleter.

(Musste im Beispiel Projekt die Unit1 in der Uses-Klausel stehen lassen, sonst springt der AV an...)


Mein Nod32 haut erstmal einen Fehlalarm raus... ist halt fragwürdig warum sich eine .EXE selbstvernichten sollte :roll:

Wolle

RavenIV 23. Jan 2008 11:20

Re: selbstlöschende Datei (Exe die ein Bild enthält)
 
Zitat:

Zitat von wfoertsch
... ist halt fragwürdig warum sich eine .EXE selbstvernichten sollte

Da fallen mir etliche Punkte dafür ein:
Vielleicht weil die Testphase von 30 Tagen abgelaufen ist?
Weil die Software sich selbst deinstallieren soll ohne Installer?
Oder weil es ein Update-File ist?
Oder weil der Benutzer keine Lizenz hat?
Oder weil die Software festgestellt hat, dass sie manipuliert worden ist?
Oder...?
Oder...?

mkinzler 23. Jan 2008 11:22

Re: selbstlöschende Datei (Exe die ein Bild enthält)
 
Zitat:

Zitat von RavenIV
Zitat:

Zitat von wfoertsch
... ist halt fragwürdig warum sich eine .EXE selbstvernichten sollte

Da fallen mir etliche Punkte dafür ein:
Vielleicht weil die Testphase von 30 Tagen abgelaufen ist?
Weil die Software sich selbst deinstallieren soll ohne Installer?
Oder weil es ein Update-File ist?
Oder weil der Benutzer keine Lizenz hat?
Oder weil die Software festgestellt hat, dass sie manipuliert worden ist?
Oder...?
Oder...?

Keines davon ist aber ein Argument für eine absolute Notwendigkeit dieses Vorgangs.

Zitat:

Mein Nod32 haut erstmal einen Fehlalarm raus...
warum ist doch kein Fehlalarm.

Hansa 23. Jan 2008 11:37

Re: selbstlöschende Datei (Exe die ein Bild enthält)
 
Starte das Programm über folgende BAT-Datei (S.BAT):

Project1
del project1.exe
REM eventuell noch : del s.bat

RavenIV 23. Jan 2008 11:40

Re: selbstlöschende Datei (Exe die ein Bild enthält)
 
Zitat:

Zitat von Hansa
Starte das Programm über folgende BAT-Datei (S.BAT):

Project1
del project1.exe
REM eventuell noch : del s.bat

Diese Befehlsfolge lässt aber nur einen einzigen Start zu.
Danach ist das Programm (und die batch) weg.

Nuclear-Ping 23. Jan 2008 11:44

Re: selbstlöschende Datei (Exe die ein Bild enthält)
 
Nö ... denn ...
Code:
Project1
del project1.exe
>Zugriff verweigert.
... *klugscheiss* :mrgreen:

Cyberstorm 23. Jan 2008 13:12

Re: selbstlöschende Datei (Exe die ein Bild enthält)
 
eine schönere programminterne lösung per batch, die auch nur löscht wenn man es denn wil wurde am anfang schonmal gepostet aber hier nochmal:

"Dieser Inhalt muss benutzt werden, damit eine .bat Datei entsteht, das die Exe Datei löscht, sowie sich danach selbst:
Delphi-Quellcode:
procedure KillSelf(MainForm: TForm);
begin
  with TStringList.Create do try
    Add(':Label1');
    Add('del "' + Paramstr(0) + '"');
    Add('if Exist "' + Paramstr(0) + '" goto Label1');
    Add('del "' + ExtractFilePath(Paramstr(0)) + 'name.bat"');
    SavetoFile(ExtractFilePath(Paramstr(0)) + 'name.bat');
  finally Free end;
  //Ausführen
  ShellExecute(MainForm.Handle, 'open', PChar(ExtractFilePath(Paramstr(0)) + 
    'name.bat'), nil, nil, SW_HIDE);
  //Beenden
  MainForm.Close;
end;
Aufgerufen werden kann die Funktion wie folgt:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  KillSelf (Self);
end;
"

Hansa 23. Jan 2008 17:23

Re: selbstlöschende Datei (Exe die ein Bild enthält)
 
Zitat:

Zitat von RavenIV
Zitat:

Zitat von Hansa
Starte das Programm über folgende BAT-Datei (S.BAT):

Project1
del project1.exe
REM eventuell noch : del s.bat

Diese Befehlsfolge lässt aber nur einen einzigen Start zu.
Danach ist das Programm (und die batch) weg.

Aha, soll das Programm also doch nicht gelöscht werden oder wie ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:47 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz