Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi "Datei löschen" abfangen (https://www.delphipraxis.net/114062-datei-loeschen-abfangen.html)

Angel4585 19. Mai 2008 10:03


"Datei löschen" abfangen
 
Hallo,

ich möchte mir ein kleines Programm schreiben, welches das Löschen einer Datei abfängt(Drücken auf Entf, oder Rechtsklick-> Löschen) um die Datei mit meinem eigenen Programm zu shreddern.
Wie kann ich das am Besten realisieren? Ich muss doch bestimmt eine Windows Message abfangen oder?
Was muss ich noch beachten?

Danke schonmal für Tipps :)

:angel:

Luckie 19. Mai 2008 12:52

Re: "Datei löschen" abfangen
 
Du müsstes DeleteFileA und DeleteFileW (und eventuell noch andere APIs, mit denen man Dateien lschen kann) hooken.

Larsi 19. Mai 2008 13:07

Re: "Datei löschen" abfangen
 
Du könntest mit dem schredden auch über Senden an machen.

Die Muhkuh 19. Mai 2008 13:12

Re: "Datei löschen" abfangen
 
Wahrscheinlich will er es vermeiden, dass man ein paar Klicks mehr machen muss und das jegliche Löschaktion über sein Tool stattfindet.

Angel4585 19. Mai 2008 21:51

Re: "Datei löschen" abfangen
 
Zitat:

Zitat von Die Muhkuh
Wahrscheinlich will er es vermeiden, dass man ein paar Klicks mehr machen muss und das jegliche Löschaktion über sein Tool stattfindet.

Genau das ist das Ziel, ich werd mir mal die Hooks anschauen, aber ich muss dann ja einige Funktionen hooken oder?

Wird da keine WindowsMessage oder sowas gesendet die man abfangen und selbst verarbeiten kann?

Die Muhkuh 19. Mai 2008 21:55

Re: "Datei löschen" abfangen
 
Wirst ja sehen, vielleicht reichen schon die von Michael genannten.

Ansonsten durchstöber mal das MSDN.

himitsu 19. Mai 2008 22:46

Re: "Datei löschen" abfangen
 
Der Explorer selber dürft über SHFileOperation löschen.
(k.A. ob es intern dann eventuell auch nur an MoveFile/DeleteFile weitergeleitet wird)

Angel4585 21. Mai 2008 10:34

Re: "Datei löschen" abfangen
 
So mein erster Hook-Versuch(Ja ein Versuch, ich hab noch nix mit Hooks gemacht)

Den Code hab ich aus nem Beispiel das ich gefunden habe, allerdings vermute ich das dies nur für die programminternen Funktionsaufrüfe gilt.

Das Problem ist jedoch hier schon, dass die Methoden zwar aufgerufen werden, am Ende jedoch ne Zugriffsverletzung auftritt.
Kann mir das jemand erklären?
Und könnt ihr mir auch sagen wie ich das richtig amche mit so nem Hook? :angel2:

Delphi-Quellcode:
unit UHook;

interface
uses Forms, Dialogs, Classes, SysUtils, Windows;
type
  TSaveRedir = packed record
    Addr: Pointer;
    Bytes: array[0..4] of Byte;
  end;
  PSaveRedir = ^TSaveRedir;

implementation

procedure RedirectCall(FromAddr, ToAddr: Pointer; SaveRedir: PSaveRedir);
var
  OldProtect: Cardinal;
  NewCode: packed record
    JMP: Byte;
    Distance: Integer;
  end;
begin
  if not VirtualProtect(FromAddr, 5, PAGE_EXECUTE_READWRITE, OldProtect) then
    RaiseLastOSError;
  if Assigned(SaveRedir) then
  begin
    SaveRedir^.Addr := FromAddr;
    Move(FromAddr^, SaveRedir^.Bytes, 5);
  end;
  NewCode.JMP := $E9;
  NewCode.Distance := PChar(ToAddr) - PChar(FromAddr) - 5;
  Move(NewCode, FromAddr^, 5);
  if not VirtualProtect(FromAddr, 5, OldProtect, OldProtect) then
    RaiseLastOSError;
end;

procedure UndoRedirectCall(const SaveRedir: TSaveRedir);
var
  OldProtect: Cardinal;
begin
  if not VirtualProtect(SaveRedir.Addr, 5, PAGE_EXECUTE_READWRITE, OldProtect) then
    RaiseLastOSError;
  Move(SaveRedir.Bytes, SaveRedir.Addr^, 5);
  if not VirtualProtect(SaveRedir.Addr, 5, OldProtect, OldProtect) then
    RaiseLastOSError;
end;


procedure DoTest;
begin
ShowMessage('Läuft');
end;

function MyDeleteFile1(const FileName: string): Boolean;
begin
DoTest
end;

function MyDeleteFile2(lpFileName: PAnsiChar): LongBool;
begin
DoTest
end;

function MyDeleteFileA(lpFileName: PAnsiChar): LongBool;
begin
DoTest
end;

function MyDeleteFileW(lpFileName: PWideChar): LongBool;
begin
DoTest
end;


var
  S1,S2,S3, S4: TSaveRedir;

initialization
  RedirectCall(@Sysutils.DeleteFile, @MyDeleteFile1, @S1);
  RedirectCall(@Windows.DeleteFile, @MyDeleteFile2, @S2);
  RedirectCall(@Windows.DeleteFileA, @MyDeleteFileA, @S3);
  RedirectCall(@Windows.DeleteFileW, @MyDeleteFileW, @S4);

finalization
  UndoRedirectCall(S1);
  UndoRedirectCall(S2);
  UndoRedirectCall(S3);
  UndoRedirectCall(S4);
end.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:31 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