![]() |
"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: |
Re: "Datei löschen" abfangen
Du müsstes DeleteFileA und DeleteFileW (und eventuell noch andere APIs, mit denen man Dateien lschen kann) hooken.
|
Re: "Datei löschen" abfangen
Du könntest mit dem schredden auch über Senden an machen.
|
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.
|
Re: "Datei löschen" abfangen
Zitat:
Wird da keine WindowsMessage oder sowas gesendet die man abfangen und selbst verarbeiten kann? |
Re: "Datei löschen" abfangen
Wirst ja sehen, vielleicht reichen schon die von Michael genannten.
Ansonsten durchstöber mal das ![]() |
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) |
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 16:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz