viele Rootkits machen halt "nur" Ersteres (Zugriff sperren)
also Funktion abfangen und wenn einer der "gewünschten" Datei-/Schlüssel-/Wertnamen verlangt wird, dann einfach behaupten die/der/den Datei/Schlüssel/Wert gäbe es nicht
und ansonsten wird der Aufruf an die
WinAPI weitergeleitet.
Du mußt genau das Gegenteil machen:
Datei-/Schlüssel-/Wertname prüfen und wenn erforderlich der
WinAPI einen anderen Namen übergeben
oder selber ein passendes Ergebnis (Result) zurückgeben.
z.B. wenn du alles was in C:\Verzeichnis1\... drin ist in X:\Verzeichnis2\ speichern willst, dann brauchst du nur alle Datei-/Verzeichnisnamen welche das Programm verlangt überprüfen und wenn der Name mit C:\Verzeichnis1\ anfängt, dann dieses durch X:\Verzeichnis2\ ersetzen und den neuen Namen an die
WinAPI weitergeben.
So als einfaches Beispiel (ohne Behandlung von Groß-Kleinschreibung, langen/kurzen Dateinamen, unterschiedlichen Mountadressen und was es sonst noch gibt...)
Delphi-Quellcode:
APIDirExists := @DirExists; // billiger Hook-Ersatz
DirExists := @DirExistsHook;
Function DirExistsHook(Dir: String): Typ;
Begin
// einfach nur ein bestimmtes Verzeichnis umleiten
If Copy(Dir, 1, 16) = 'C:\Verzeichnis1\' Then
Dir := 'X:\Verzeichnis2\' + Copy(Dir, 17, Length(Dir);
Result := APIDirExists(Dir);
End;
Delphi-Quellcode:
APIDirExists := @DirExists; // billiger Hook-Ersatz
DirExists := @DirExistsHook;
Function DirExistsHook(Dir: String): Typ;
Begin
// umleiten
If Copy(Dir, 1, 16) = 'C:\Verzeichnis1\' Then Begin
Dir := 'X:\Verzeichnis2\' + Copy(Dir, 17, Length(Dir);
Result := APIDirExists(Dir);
// sperren/verstecken
End Else If Copy(Dir, 1, 16) = 'D:\Verzeichnis3\' Then Begin
Result := False;
// so tun als gäbe es das Verzeichnis
End Else If Copy(Dir, 1, 16) = 'D:\Verzeichnis4\' Then Begin
Result := True;
// unverändert behandeln lassen
End Else
Result := APIDirExists(Dir);
End;