Entwickler-Ecke
Windows API - Zugriff auf eine datei blocken
ReDoX - Mi 24.05.06 15:18
Titel: Zugriff auf eine datei blocken
Hi,
ich wollte mal fragen wie ich den Zugriff auf eine Datei blocken kann, also so das ich sie weder oeffnen kann, noch loeschen, noch unbennenen, usw kann.
Ich habe das ganze schon mal mit einem Hook auf NtCreateFile versucht, aber ich es zeigt keine Wirkung, die Hook Procedure wird zwar aufgerufen, aber ich schaffe es nicht den Accesess umzuleiten oder zu blocken.
Die Deklaration von NtCreateFile habe ich aus einem Beispiel der uall collection.
Ich hoffe jemand kann mir sagen wie ich das ganze anstelln kann oder vieleicht sogar ein beispiel posten,
danke und ciao
Delete - Mi 24.05.06 17:35
Öffne die Datei exklusiv, dann kann man nicht auf sie zugreifen, weder öffnen, noch kopieren. Aber mit entsprechenden Tools lässt sich diese Sperre auch umgehen und lösen. Warum willst du das machen? Daten die man nicht einsehen soll, würde ich so auf keinen Fall versuchen zu schützen. Hlate sie verschlüsselt im RAM oder verschlüssel zu mindest die Daten in der Datei, dann kann auch niemand etwas damit anfangen, wenn er Zugriff auf die Datei bekommen sollte.
ReDoX - Mi 24.05.06 17:47
Danke fuer die Antwort, aber es geht mir eigentlich um das Prinzip und um dem Lernzweck.
Ich habe jetzt auch NtOpenFile gehookt, die Funktion wird zwar gehookt, aber ich kann danach manche daten nicht mehr oeffnen, weil ich immer folgende Fehlermeldung bekomme :
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| --------------------------- F:\temp\delphi\bla\Project1.exe --------------------------- F:\temp\delphi\bla\Project1.exe
Falscher Parameter.
--------------------------- OK --------------------------- |
Andere Datein lassen sich Problemlos aufrufen und ausfuehren. Durch die Fehlermeldung kann man ja sehen das die Funktion im stande ist den Accsess auf eine Datei zu blocken, nur moechte ich die datei angeben koennen die geblockt werden soll.
Ich veraendere nichts an den Parametern, ich rufe lediglich das Callback der gehookten funktion auf.
Wenn ihr Source oder mehr Infos braucht bitte posten, damit ich sie euch geben kann.
//Edit: Habe eine sehr interessante Entdeckung gemacht, ich habe vergessen die Variablen auszukommentieren, wenn ich dies tut funktioniert der Code ,soll heißen der Fehler kommt nicht mehr und alles laeuft normal.
Sobald ich etwas im Source mache (Variablen deklarieren etc) bekomme ich die Fehlermeldung.
Kann es sein das NtOpenFile ungueltig wird, wenn ja gibt es eine Moeglichkeit dies zu verhindern?
BenBE - Mi 24.05.06 21:01
Bitte poste dafür einmal den Source deiner Hooking-Funktion, den Aufruf der Hook-Initialisierung und die Deklaration (incl. Aufrufkonvention) deiner Hook-Funktion. Hab da einen Verdacht ...
uall@ogc - Mi 24.05.06 21:42
Ja poste bitte mal den Source. Ich kann dir dann sicher weiterhelfen.
ReDoX - Mi 24.05.06 22:59
Hier erstmal die Deklaration der Typen :
Und hier meine Funktionen :
Und noch den eigentlich hook:
So, vieleicht hat ja jetzt jemand eine Idee ^^
uall@ogc - Mi 24.05.06 23:10
huhu
Du könntest mla folgendes probieren:
1) mal direkt die Next-Funktion aufrufen, ohne etwas mit den Parametern zu machen (d.h. keine variuablen usw benutzen)
2) InitUnicodeString: procedure(pUS: PUnicodeString; pName: PWideChar); stdcall; benutzen um einen eigenen String zu erstellen, anstatt der berechnung mit *2 usw. das ist ein Export der ntdll und wird auch in Treibern normal benutzt.
aufruf z.b.
Delphi-Quelltext
1: 2: 3: 4:
| var str : TUnicodeString; begin InitUnicodeString(@str,'\Device\PhysicalMemory'); |
3) beiden Funktionen (NtCreateFile) einfach einen Rückgabewert geben (:DWord)
OpenFile hab ich jetzt net geschaut ob der Header stimmt
ReDoX - Mi 24.05.06 23:30
Hi
1) Geht ohne Probleme
2) Habe ich noch ned getstete (weil 3tens ging)
3) Also, wenn ich den beiden Procedure zu Functions mache gehts :) ,aber wie kann ich jetzt den Zugriff blocken?
So wies oben im source steht gehts ned und result auf 0 setzt bringt auch nix.
Und noch eine Frage am Rande: Woher weisst du das mit dem Rueckgabetyp? Ich kann bei
http://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/NT%20Objects/File/NtCreateFile.html keinen Rueckgabetypen finden.
//Edit: Zu 3) Wenn ich das result auf 0 setzt, kann ich die datei nicht mehr kopieren/loeschen/umbenennen oeffnen geht aber noch immer zumindest bei txt files, bei exe file geht starten auch nicht mehr.
uall@ogc - Do 25.05.06 12:46
Eigentlich haben alle Nt APIs einen Rückgabewert. 0 ist dabei NT_SUCCESS und bedeutet das die Funktion erfolgreich ausgeführt wurde. Solltest du also 0 zurückgeben aber die original API nicht aufrufen, dann denkt das Programm es hat einen gültigen Handle bekommen und macht einfach damit weiter (nicht gut). Gib stattdessen einfach mal 0xC0000022 zurück (STATUS_ACCESS_DENIED) oder eben einen Status der dir gefällt und setz auch auf jedem Fall das Handle auf 0.
STATUS_OBJECT_NAME_NOT_FOUND = 0xC0000034 [wenn Datei nicht vorhanden soll aber mit OPEN_EXISTING geöffnet werden]
STATUS_OBJECT_NAME_INVALID = 0xC0000033 [wenn Dateiname ungültig ist, z.b. "CA:\blub.txt"]
http://www.wildpackets.com/elements/misc/SMB_NT_Status_Codes.txt
da stehen noch mehrere
Du kanst ja testweise CreateFile aufrufen und bei NtCreateFile einen Breakpoint machen, und dann nach dem sysenter / int 0x2E schaun was in EAX steht (Rückgabewert)
Zu InitUnicodeString: Es sollte eigntlich benutzt werden, Windows macht das auch so und ist die bessere Variante gegenüber selbst ein UniCode Objekt zu erstellen.
Wie ich drauf gekommen bin? Da nunmal in EAX nach einem NtCreateFile ein ERROR_CODE steht 0 für SUCCESS 0xC........ für STATUS_ERROR kann man davon ausgehen, dass NtCreateFile einen Rückgabe wert hat. Ich habe aber auch den Header gefunden und benutzt den du gepostest hast. Aber anscheinend ist der falsch, oder ich interpretier den falsch. :)
BenBE - Do 25.05.06 12:51
Ganz einfach: Die API nutzt den Rückgabewert, um das File-Handle mitzuteilen. Ist der Wert 0 oder Invalid Handle Value, ist ein Fehler aufgetreten.
Willst Du einfach nur den Zugriff auf eine Datei sperren, brauchst Du also eigentlich nur den Filename abfragen, Result auf 0 setzten und mit SetLastError z.B. auf 5 setzen (Access Denid).
Weiterhin solltest Du unbedingt mit InitUnicodeString arbeiten, da die WinAPI dies intern auch macht und ich auf Anhieb nicht sagen kann, ob weitere Speicher-Abhängigkeiten geprüft werden (zwecks Ablage im Adressbereich des Kernels). Die Alloziierung durch Delphi erfolgt auf dem Heap, der mit dem MM von Windows reichlich wenig gemeinsam hat ...
Achso: Auch bei Unicode-Strings ist der Pointer AFAIR auf das erste Datenbyte des Strings gesetzt, nicht auf das erste Byte des Records.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!