Delphi-PRAXiS

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)

schoenwetterflieger 21. Sep 2007 06:52


selbstlöschende Datei (Exe die ein Bild enthält)
 
Sers!!

Ich versuche ein Selbstlöschendes Bild zu kreieren, ich weis aber nicht genau wie...

Ich habe einen ansatz:

Eine exe (Die das bild enthält) erzeugt eine bat oder com datei die den inhalt hat die exe zu löschen....
dann wird die bat ausgeführt ( die nen internen timer hat) und löscht die exe


kann mir einer sows schreiben, da meine kenntnisse etwas eingerostet sind..


mfg schoenwetterflieger :idea:

mkinzler 21. Sep 2007 06:56

Re: selbstlöschende Datei (Exe die ein Bild enthält)
 
Hilft aber nur, wenn innerhalb des Timerintervalls die Exe auch geschlossen wird.

s-off 21. Sep 2007 06:57

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

da liegst Du richtig, das Vorgehen wird bspw. hier beschrieben.

Edit: bzgl. der Anmerkung von mkinzler - dieses Verfahren nutzt keinen Timer - die Löschversuche an die Exe werden in einer Schleife durchlaufen, solange bis sie erfolgreich sind. Dann wird die Batch-Datei gelöscht.

schoenwetterflieger 21. Sep 2007 07:02

Re: selbstlöschende Datei (Exe die ein Bild enthält)
 
mmhh.. also am besten so, das die exe erst gelöscht wird wenn sie geschlossen wird, oder die exe erstellt eine .jpg und com oder bat datei. die bat oder com löscht nach einiger zeit die jpg und exe...

s-off 21. Sep 2007 07:20

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

Zitat von schoenwetterflieger
mmhh.. also am besten so, das die exe erst gelöscht wird wenn sie geschlossen wird

Vorher wird es kaum möglich sein :gruebel:

moonwhaler 21. Sep 2007 08:30

Re: selbstlöschende Datei (Exe die ein Bild enthält)
 
Das ist ja lustig. Ich hab gerade gestern etwas wiedergefunden, was als vergessen galt. "Lösch Dich Selber" ist der Titel des Monsters. Der Code ist allerdings ungetestet!! :!:

Delphi-Quellcode:
// A procedure in assembler that deletes the main executable file - while
// running. Neat.
procedure DeleteSelf;
{
  Note, this version will only work, as long as the functions are imported through
  the import table. This is true for any Win32 app and Kernel32.dll!
  Anyway, if you introduce symbol names, that conflict with the function names,
  this code is likely to break!
}
var
  szModuleName: array[0..MAX_PATH - 1] of Char;
  pExitProcess,
    pDeleteFile,
    pFreeLibrary,
    pUnmapViewOfFile: Pointer;
  hModule: THandle;
asm
(*** Get real address of ExitProcess ***)
{ Dereference the function addresses from the jump table
  I'll briefly explain on this first function ('ExitProcess')
  Load effective address. EAX points to code like FF 25 XX XX XX XX -> jmp ds:XXXXXXXX }
    lea eax, [ExitProcess]
{ Ignore the jump instruction (i.e. FF 25) }
    mov eax, [eax+2]
{ EAX holds now the XX XX XX XX from above metacode, i.e. a pointer to the 'real'
  address }
    mov eax, [eax]
{ EAX now holds the 'real' address of the function ExitProcess within our realm }
    mov pExitProcess, eax
{ The following code works accordingly ...}
(*** Get real address of DeleteFileA ***)
    lea eax, [DeleteFileA]
    mov eax, [eax+2]
    mov eax, [eax]
    mov pDeleteFile, eax
(*** Get real address of FreeLibrary ***)
    lea eax, [FreeLibrary]
    mov eax, [eax+2]
    mov eax, [eax]
    mov pFreeLibrary, eax
(*** Get real address of UnmapViewOfFile ***)
    lea eax, [UnmapViewOfFile]
    mov eax, [eax+2]
    mov eax, [eax]
    mov pUnmapViewOfFile, eax
(*** Now the "main code" ***)
    push 0
    call GetModuleHandleA
    mov hModule, eax
(*** Got module handle of this instance ***)
    push MAX_PATH
    lea eax, szModuleName
    push eax
    push hModule
    call GetModuleFileNameA
(*** szModuleName now holds the file name of our instance's module ***)
    call GetVersion
(*** Checking for Windows 9x / Windows NT platform ***)
    test eax, $80000000
    jz @@NTplatform
//@@9xplatform:
    lea eax, szModuleName
    push system.ExitCode
    push 0
    push eax
    push pExitProcess
    push hModule
    push pDeleteFile
    push pFreeLibrary
    ret
@@NTplatform:
    push 4
    call CloseHandle;
    lea eax, szModuleName
    push system.ExitCode
    push 0
    push eax
    push pExitProcess
    push hModule
    push pDeleteFile
    push pUnmapViewOfFile
    ret
end;

schoenwetterflieger 21. Sep 2007 08:50

Re: selbstlöschende Datei (Exe die ein Bild enthält)
 
den qelltext kappier ich nicht...hat keiner so nen prog vllt rumliege welches ich nur noch für mich bissel umbauen kann??

Luckie 21. Sep 2007 08:53

Re: selbstlöschende Datei (Exe die ein Bild enthält)
 
Was willst du noch? Du hast zwei Copy and Past Lösungen bekommen. Die eine entspricht deinem Prinzip und ist mit rudimentären Delphi-Kenntnissen zu verstehen, die andere erfordert eben fortgeschrittene Assembler-Kenntnisse und tiefgreifendes Wissen über das Betriebssystem, um sie zu verstehen.

DP-Maintenance 21. Sep 2007 10:00

DP-Maintenance
 
Dieses Thema wurde von "SirThornberry" von "Freeware" nach "Programmieren allgemein" verschoben.

SirThornberry 21. Sep 2007 10:01

Re: selbstlöschende Datei (Exe die ein Bild enthält)
 
warum willst du das, das Programm sich selbst löscht? Vielleicht gibt es ja eine bessere Lösung um das zu erreichen was du vor hast.

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 ?

RavenIV 24. Jan 2008 07:41

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

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

Vielleicht möchte man ja steuern können, ob gelöscht wird oder nicht.

himitsu 25. Jan 2008 15:36

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

Zitat von RavenIV
Vielleicht weil die Testphase von 30 Tagen abgelaufen ist?

dennoch nicht gut zu löschen.
Abgesehn, daß dich sogar jemand verklagen könnte, weil du wiederrechtlich Daten gelöscht hast.
Zitat:

Zitat von RavenIV
Weil die Software sich selbst deinstallieren soll ohne Installer?Oder weil es ein Update-File ist?

OK, aber dafür gibt's auch andere Möglichkeiten
Zitat:

Zitat von RavenIV
Oder weil der Benutzer keine Lizenz hat?
Oder weil die Software festgestellt hat, dass sie manipuliert worden ist?

ja klar, ein winziger Fehler auf'm Datenträger oder in der Registry,
dein Programm findet vorübergehend meine Lizenz nicht
oder es ist ein winziges bissl defekt
und löscht sich
> Ergebnis: 'ne Klage, Schadenersatz und ich will mein Geld zurück.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:01 Uhr.

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