| Autor |
Beitrag |
ReDoX
Hält's aus hier
Beiträge: 14
WinXP & Linux [VM]
Delphi 7 Professional
|
Verfasst: Mi 24.05.06 15:18
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
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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 
Hält's aus hier
Beiträge: 14
WinXP & Linux [VM]
Delphi 7 Professional
|
Verfasst: 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
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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 ...
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
uall@ogc
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Mi 24.05.06 21:42
Ja poste bitte mal den Source. Ich kann dir dann sicher weiterhelfen.
_________________ wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
|
|
ReDoX 
Hält's aus hier
Beiträge: 14
WinXP & Linux [VM]
Delphi 7 Professional
|
Verfasst: Mi 24.05.06 22:59
Hier erstmal die Deklaration der Typen :
Delphi-Quelltext
Und hier meine Funktionen :
Delphi-Quelltext
Und noch den eigentlich hook:
Delphi-Quelltext
So, vieleicht hat ja jetzt jemand eine Idee ^^
Zuletzt bearbeitet von ReDoX am Fr 26.05.06 14:11, insgesamt 1-mal bearbeitet
|
|
uall@ogc
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: 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
_________________ wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
|
|
ReDoX 
Hält's aus hier
Beiträge: 14
WinXP & Linux [VM]
Delphi 7 Professional
|
Verfasst: 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 undocumented.ntinter...le/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
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: 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"]
www.wildpackets.com/..._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. 
_________________ wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
|