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 Dateien und Registry-Einträge für eine Anwenugn simulieren (https://www.delphipraxis.net/106200-dateien-und-registry-eintraege-fuer-eine-anwenugn-simulieren.html)

tr909 7. Jan 2008 09:23


Dateien und Registry-Einträge für eine Anwenugn simulieren
 
Moin. Ich wollt mal fragen ob jemand von euch eine Möglichkeit kennt, mit der ich einem Programm "vorgauckeln" kann, das div. Dateien in einem bestimmten Ordner sowie bestimmte Regitsry-Einträge vorhanden sind. Sowas ähnlich macht glaub ich Thinstall. Damit kann man Anwendungen "virtualisiert" in einer exe-Datei "installieren" und hat dann eine portable Anwendung.

Gruß
DerAnkh

Bernhard Geyer 7. Jan 2008 09:25

Re: Dateien und Registry-Einträge für eine Anwenugn simulier
 
Beim "Vorgaukeln" würde mir Hooken der entsprechenden API-Funktionen für diesen Prozess einfallen.

himitsu 9. Jan 2008 12:22

Re: Dateien und Registry-Einträge für eine Anwenugn simulier
 
Vor einer Weile hab ich auch mal an sowas gedacht,
(nja, hatt noch nicht genügend Zeit dafür gefunden)

sozusagen eine MiniSandbox für ein Programm.

Und das Hooken API wäre da bestimmt eine gute Idee, nur welche Funktionen da alle gehookt werden sollen/müssen ist da eines der Probleme.
(OK und mit Hooks hab ich auch noch keine Erfahrungen und das müßte ich och erstmal lernen -.-'')

Im Grunde mußt du nur alle "nötigen" API's umleiten, welche auf Dateien und die Registry zugreifen.

Aufruf im Programm > dein Hook > WinAPI

im Hook mußt du dann nur noch Anhand der übergebenen Parameter entscheiden was gemacht werden soll
- Zugriff sperren (z.B. per Rückgabewert behaupten die Datei gäbe es nicht)
- selber den Zugiff ausführen (da kann man dann z.B. Pfade ändern)
- oder alles an die WinAPI weiterleiten (wenn nichts geändert werden soll)

tr909 10. Jan 2008 09:03

Re: Dateien und Registry-Einträge für eine Anwenugn simulier
 
also was ich bis jetzt gefunden habe sind folgende APIs
Code:
NtCreateFile
ZwOpenFile
ZwQueryDirectoryFile
ZwOpenKey
ZwQueryKey
ZwQueryValueKey
ZwEnumerateValueKey
ZwEnumerateKey
ZwSetValueKey
ZwCreateKey
Diese werden wohl für ein RootKit verwendet, um Dateien zu verstecken, aber ich will ja genau das Gegenteil.
Was ich vor habe ist sowas ähnliches wie eine MiniSandBox. Ich Bastel mir gerade ein eigenes "Menü" für meine PortableApps und nun wollte ich mal sehen ob es möglich ist auch Programme portabel zu machen die eigentlich installiert werden sollen.
Ich werd mir mal die Hook-Tutorials angucken und sehen wie weit ich komme.

Gruß
tr909

himitsu 10. Jan 2008 12:31

Re: Dateien und Registry-Einträge für eine Anwenugn simulier
 
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;


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:02 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 by Thomas Breitkreuz