Autor |
Beitrag |
Backslash
      
Beiträge: 202
WIN XP
Delphi 5 Ent, Delphi 2005 Prof
|
Verfasst: Sa 29.10.05 16:33
Hallo an alle,
ich habe jetzt ziemlich viel bei google über das Dateisystem NTFS herausgefunden und wie man den Bootsektor, etc. ausliest. Das funktioniert auch alles mit Delphi.
Mein Problem ist jetzt allerdings, dass die MFT-Struktur ziemlich komplex ist. Dagegen war die Implementierung von FAT12/16/32 ein Kinderspiel.
Mich würde unter anderem interessieren, wie man die MFT unter NT, 2000 oder XP ausliest. Die Records dafür hab ich schon ins Programm implementiert. Wenn ich das Betriebssystem kenne, weiß ich wie ich unterscheiden muss. Nur die MFT-Struktur macht mir deshalb Sorgen, weil sehr viele Werte eine dynamische Länge haben, wie zum Beispiel die SID. Wie kann ich beispielsweise eine SID mit dynamischer Länge in einen dafür vorgesehenen Record einlesen?
Das solls erstmal gewesen sein. Ich danke euch im Vorraus dafür, dass ihr dieses Posting hoffentlich lesen werdet
Gruß
Backslash Moderiert von raziel: Topic aus Sonstiges verschoben am Sa 29.10.2005 um 18:17
|
|
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: Sa 29.10.05 22:52
Naja, indem Du einfach die Länge ermittelst und dann im Record einen Pointer (z.B. PChar) mit entsprechend viel Platz reservierst 
_________________ 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.
|
|
Backslash 
      
Beiträge: 202
WIN XP
Delphi 5 Ent, Delphi 2005 Prof
|
Verfasst: Mo 31.10.05 08:46
Die Idee hatte ich auch zuerst. Tja, das kommt davon, wenn man sich noch nicht mit NTFS beschäftigt hat was bei dir offenbar auch der Fall ist  . Bei einer SID kann man nicht "einfach" die Länge ermitteln. Das ist eine dynamische Struktur aus mehreren Segmenten. Ein Segment gibt beispielsweise den Benutzertyp, wie Admin, Netzwerkadmin, etc. an. Ein anderes Segment identifiziert den Rechner. Es ist ganz schön kompliziert, die Länge für eine SID rauszukriegen, da sie im NTFS-Dateisystem nirgendwo gespeichert wird. Man muss die SID sozusagen zerpflücken. Jedoch hab ich noch keinen Plan, wie ich das gescheit anstellen soll.
Da ich bisher noch nicht soviele Rückmeldungen hatte, muss ich wohl oder übel weiter mein Bestes probieren. Vielleicht krieg ich das Problem selbst in den Griff. Achja, mir ist aufgefallen dass der Clusteroffset für die MFT auch nicht zu stimmen scheint. Irgendwie liest das Programm an dem MFT-Cluster immer was falsches aus. Ob da wie beim FAT noch die reserved-sectors aufaddiert werden müssen, weiß ich nicht weils nirgendwo genau beschrieben steht.
Danke trotzdem. Ich werd mal versuchen, ob ich das selbst gelöst bekomme. 
|
|
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: Mo 31.10.05 12:10
Bei NTFS kommst Du direkt auf den richtigen Sektor. Du musst allerdings beachten, dass die erste Spur meist ungenutzt ist. D.h. dass Du eine gewisse Anzahl an Sektoren (siehe Bootsektor der Partition) überspringen musst. Beachte auch: Cluster <> Sektoren ...
Bei mir startet die MFT in Cluster 4, d.h. an der logischen Adresse $00004000 (unschwer zu erkennen: Clustergröße 4K \ 8 Sektoren).
Ansonsten geb mir mal kurz per PN bescheid, evtl. kann ich Dir ein wenig weiterhelfen. Den Source im Ganzen über's Forum abzuhandeln bringt IMHO wenig.
_________________ 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.
|
|
Backslash 
      
Beiträge: 202
WIN XP
Delphi 5 Ent, Delphi 2005 Prof
|
Verfasst: Mo 31.10.05 15:07
Danke für den Tipp mit der Clustergröße. Das war mir nur leider schon bekannt. Im Bootsektor stehen ja unter anderen die SectorsPerCluster drinnen. Wenn ich diesen Wert mit dem Clusteroffset multipliziere und an diesen Sektor springe, liest mir das Programm nicht die erste Datei des MFT ein.
Welche Sektoren muss ich zusätzlich noch aufaddieren, um zur korrekten Sektorposition des MFT zu kommen? Ich hab das jetzt mal unter einer 500 MB-großen NTFS-Testpartition getestet. Da ist ein Cluster genauso groß wie ein Sektor (512 Bytes). Und siehe da, jetzt stimmt der Wert in Clusterpos plötzlich. Woher kommt das?
PS: Ich bin gerade dabei die MFT Eintrag für Eintrag aufzudröseln. Wenn du mir den Tipp lieger per PM geben möchtest, wie ich an die richtige Position des MFT komme (eigentlich reicht ja schon die Formel), dann würd ich mich auch freuen. Hauptsache das funzt  Was mir derzeit noch Probleme macht, ist bei der MFT zwischen den vielen Records und NTFS-Typen zu unterscheiden.
Auf dieser Seite hab ich mir die Infos geholt
linux-ntfs.sourceforge.net/ntfs
Vielleicht gibts ja was einfacheres. Danke für die Hilfe.
Gruß
Backslash
|
|
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: Mo 31.10.05 17:05
Vielleicht hilft Dir auch noch folgende Seite etwas weiter ...
_________________ 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.
|
|
Backslash 
      
Beiträge: 202
WIN XP
Delphi 5 Ent, Delphi 2005 Prof
|
Verfasst: Mo 31.10.05 17:27
danke für die Info. Die Site hab ich als erstes angewählt und im Übrigen ist sie leider sehr unvollständig. Ich würde gern ganz allgemein anhand des Startclusters aus dem Bootsektor die Sektorposition des MFT berechnen. Nur die Formel wäre interessant! Beim FAT muss ich z.B. die reserved sectors aufaddieren. Naja, die Formel bräuchte ich erstmal. den Rest schuster ich mir gerade selbst zusammen.
|
|
raziel
      
Beiträge: 2453
Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
|
Verfasst: Mo 31.10.05 18:03
BenBE hat folgendes geschrieben: | Ansonsten geb mir mal kurz per PN bescheid, evtl. kann ich Dir ein wenig weiterhelfen. Den Source im Ganzen über's Forum abzuhandeln bringt IMHO wenig. |
Bitte alles - sofern legal natürlich - direkt übers Forum, es gibt sicher noch mehr Leute (ja, ich auch  ), die das interessiert.
raziel
//edit: Hastige Tippfehler eliminiert.
_________________ JSXGraph
Zuletzt bearbeitet von raziel am Mo 31.10.05 18:08, insgesamt 1-mal bearbeitet
|
|
Backslash 
      
Beiträge: 202
WIN XP
Delphi 5 Ent, Delphi 2005 Prof
|
Verfasst: Mo 31.10.05 18:07
1. NTFS ist ein streng gehütetes Geheimnis von Microsoft
2. wenn ich mir jetzt die Arbeit mache und das erarbeite dann hat das den Zweck, dass ich darauß Profit erschließen will
3. Aber ein paar Infos bekommt ihr schon 
|
|
Backslash 
      
Beiträge: 202
WIN XP
Delphi 5 Ent, Delphi 2005 Prof
|
Verfasst: Mo 31.10.05 18:27
Also schön, ein paar Infos kann ich mal preisgeben. Wie wollt ihr mir auch sonst helfen.
Eigentlich wollte ichs nicht posten, da ich mir die Arbeit für die 1200 Zeilen NTFS nicht umsonst gemacht haben will *g*. Was solls?
Hier mal die Records für den Bootsektor (war ne menge Arbeit, das Zeugs zu übersetzen)
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48:
| type PBPB_NTFS = ^TBPB_NTFS; TBPB_NTFS = packed record BPB_BytesPerSector : WORD; BPB_SectorsPerCluster : byte; BPB_ReservedSectors : WORD; BPB_NULL1 : array[0..2] of Byte; BPB_NotUsed1 : WORD; BPB_Media : byte; BPB_NULL2 : WORD; BPB_SectorsPerTrack : WORD; BPB_NumberOfHeads : WORD; BPB_HiddenSectors : DWORD; BPB_NotUsed2 : DWORD; end;
type PBPB_NTFS_EXT = ^TBPB_NTFS_EXT; TBPB_NTFS_EXT = packed record BPB_NotUsed1 : DWORD; BPB_TotalSectors : Int64; BPB_MFT_ClusNumber : Int64; BPB_MFTMirr_ClusNumber : Int64; BPB_ClusPerFileRecSeg : DWORD; BPB_ClusPerIndexBlock : DWORD; BPB_VolSerial : Int64; BPB_Checksum : DWORD; end;
type PBS_NTFS = ^TBS_NTFS; TBS_NTFS = packed record BS_jmpBoot : array [0..2] of byte; BS_OEMID : Int64; BS_BPB : TBPB_NTFS; BS_BPB_EXT : TBPB_NTFS_EXT; BS_BootstrapCode : array[0..425] of Byte; BS_Signature : WORD; end; |
Und so möchte ich den MFT-Sektor berechnen. Also es sei angenommen, ich habe den TBS_NTFS-Record eingelesen:
Delphi-Quelltext 1: 2: 3:
| FMFTSector := FNTFS_BS.BS_BPB_EXT.BPB_MFT_ClusNumber * FNTFS_BS.BS_BPB.BPB_SectorsPerCluster; |
Ich meine, beim FAT war das ja nicht so schwer. Da musste man auf die Sektoren noch die reserved-sectors draufaddieren, da ja der Bootsektor mit dazuzählt. Ich benutze übrigens winhex und ähnliche Editoren, mit dem man auch Laufwerke öffnen kann. Das Offset für den MFTSector stimmt auch bei Partitionen, deren Clustergröße = Sektorgröße ist, aber nicht wenn die Clustergröße größer ist, dann ist das Offset falsch.
|
|
Backslash 
      
Beiträge: 202
WIN XP
Delphi 5 Ent, Delphi 2005 Prof
|
Verfasst: Mo 31.10.05 19:28
Nachtrag: Falls ihr jetzt denkt, ich wolle NTFS nachprogrammieren  Das will ich nicht. Für meine Zwecke reichen etwa 10 Prozent des Systems aus. Ich muss keine Logdaten, Reparsepoints, etc. einlesen können. Es geht mir rein um die Verzeichnisstruktur von NTFS. Dazu muss ich den Bootsektor, die MFT und schließlich die Indexrecords der Dateien und Verzeichnisse lesen können. Mehr brauch ich eigentlich gar nicht. Die Bereiche in die ich mich vorwage, kann man legal auch in der Microsoft-Seite einsehen.
Guckst du hier: www.microsoft.com/te...49-03245d68d8e4.mspx
|
|
Pepe
      
Beiträge: 107
Win 98, Win 2000 Prof., Win XP Prof.
Delphi 2005 Prof.
|
Verfasst: Mo 31.10.05 19:37
msdn.microsoft.com/l...thz/security/sid.asp
<-- evtl helfen dir ja die funktionen zur verarbeitung von sid's weiter!?
|
|
UC-Chewie
      
Beiträge: 531
WinXP
D5 Ent
|
Verfasst: Mo 31.10.05 20:02
Du könntest dir ja auch mal das entsprechende Linux-Kernelmodul ankucken. Lesen ist dort ja bereits seit langem implementiert.
_________________ Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
|
|
digi_c
      
Beiträge: 1905
W98, XP
D7 PE, Lazarus, WinAVR
|
Verfasst: Di 01.11.05 11:01
Ich will ja nicht zu neugierig sein aber was zum Geier bruacht lowlevel NTFS Zugriff?
Schon interessant was einige mit Delphi anstellen ^^
|
|
Backslash 
      
Beiträge: 202
WIN XP
Delphi 5 Ent, Delphi 2005 Prof
|
Verfasst: Di 01.11.05 14:45
ich brauche lowlevel-zugriff, weil ich ein Datenrettungsprogramm gern vollenden will. Alle FAT-Typen sind schon drinnen. Jetzt fehlt noch NTFS
Vielen Danke für den Link mit der SID. Da ist ja ne schöne Funktion mit dem vielversprechenden Namen GetLengthSID drinnen. Geil
Danke Das wird mir hoffentlich weiter helfen. Ich kann mir gut vorstellen, dass einige andere das Thema auch interessant finden. Achja, den Linux-Code hab ich mir mal angeschaut und obwohl ich C++ im Studium hatte, sieht der Code doch eher aus, als hätte ihn jemand mit nem Zufallsgenerator geschrieben  Scherz beiseite. Da blick ich nicht wirklich durch.
Gruß
backslash
|
|
digi_c
      
Beiträge: 1905
W98, XP
D7 PE, Lazarus, WinAVR
|
Verfasst: Di 01.11.05 17:31
Wow feine Sache, wenn ich mich auch nicht entsinnen könnte das mir soetwas je geholfen hätte  die HDDs waren dann einfach nur tot...
|
|
Backslash 
      
Beiträge: 202
WIN XP
Delphi 5 Ent, Delphi 2005 Prof
|
Verfasst: Di 01.11.05 17:55
bei folgender Seite blicke ich allerdings noch nicht ganz durch: www.ntfs.com/disk-scan.htm
Ich kann zwar jetzt bei jedem Eintrag den "standard File Record Header" auslesen, jedoch ist der record "Standard Information Attribute" bei mir nicht an Offset 48 des Records, sondern an Offset 80 für den ersten Eintrag im MFT. Leider steht aber Offset 48 im "standard file record header". Ehrlichgesagt weiß ich nicht wie ich herausfinden kann, welche Records der MFT beinhaltet und an welchen Offsets diese stehen.
Diese Seite ist zwar nicht schlecht, aber verstehen tu ich auch nicht, wie die an die Offsets kommen: linux-ntfs.sourcefor...s/files/attrdef.html
Habt ihr eine Idee?
|
|
Backslash 
      
Beiträge: 202
WIN XP
Delphi 5 Ent, Delphi 2005 Prof
|
Verfasst: Mi 02.11.05 13:52
Nachtag:
Leider ist jede Homepage für sich genommen zwar gut beschrieben, jedoch werden überall nur Teilinformationen über die MFT preisgegeben. Mir ist gestern abend aufgefallen, dass jedes Attribut des MFT noch einen zusätzlichen "Attribute-Header" hat, mit dem man erkennen kann, was für ein Attribut nun folgt und wie lang es zum Beispiel ist. So kann ich nun die MFT komplett entschlüsseln. Natürlich gibt es noch zu beachten, dass er bei Windows NT, 2000 und XP unterschiedlich aussieht. Das binde ich gerade ein.
Danke nochmal für den Link mit der SID. Ich denke, ich werde die MFT nun komplett entschlüsseln und mit der Datenrettung beginnen können. Es war fast wie beim FAT. Man muss sich eben aus vielen Homepages mit Teilinformationen die Dateisystemstruktur zusammensetzen. Beim FAT gabs allerdings eine umfangreiche Beschreibung von Microsoft als PDF, hier nicht.
Ich denke, ich werd das NTFS-Puzzle bald vollendet haben. Danke nochmal für die Hilfe. Natürlich werd ich mich nicht einfach so verabschieden. Um eine Hilfestellung für die Leute zu geben, die das gleiche Problem wie ich haben, werd ich hier mal grob posten, wie ein MFT-Eintrag aufgebaut sein könnte:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| MFT-Eintrag: - File Record Header (enthält z.B. den "FILE"-Erkennungsstring) - Attribute 1 (besteht aus dem Attribut-Header und dem Attributrecord) -> Attributeheader (length, etc.) -> Attributerecord - Attribute 2 (besteht aus dem Attribut-Header und dem Attributrecord) -> Attributeheader (length, etc.) -> Attributerecord - $FFFFFFFF (Abschlussmarker, dass der MFT Record hier zu Ende ist) |
Das Attribut 1 könnte beispielsweise der STANDARD_INFORMATION_HEADER sein, der Informationen über die Datei enthält. Jeder Header hat eine eindeutige ID, bzw. einen Typ, wie man auf folgender Seite nachlesen kann linux-ntfs.sourcefor...ttributes/index.html Die Tabellenspalte "Type" darf nicht mit dem Offset verwechselt werden. Es ist hier jedem möglichen Attribut-Record ein Erkennungstyp zugeordnet worden, um die Reihenfolge festzulegen.
Abschließend möchte ich noch sagen, dass ein MFT-Eintrag nicht aus allen dieser Records bestehen kann. Das wird von NTFS dynamisch festgelegt.
So, danke für die Hilfe nochmal. Ich denke, mit dem Wissen werd ich nun sehr gut weiter kommen.
Viele Grüße
Backslash
NACHTRAG: Falls sich hier noch jemand für Datenrettung interessiert. Es gibt auch Dateien, die nur teilweise befüllt sind. Um die nicht beschriebenen Abschnitte einzusparen, "faltet" NFTS diese Dateien zusammen, um Speicherplatz zu sparen. Solche Dateien heißen "Sparse Files". Diese Dateien werden jedoch erst ab NTFS5 unterstützt 
|
|
Muetze1
      
Beiträge: 346
|
Verfasst: Do 03.11.05 12:22
Noch ein Nachtrag: Wenn einer die Strukturen der MFT etc zu NTFS von 2000 haben will und ein paar Erklärungen dazu, dem empfehle ich Anhang D des Buches "Windows NT/2000 Native API Reference" von Gary Nebbett. ISBN 1-57870-199-6
_________________ 49 63 68 68 61 62 65 6B 65 69 6E 65 41 68 6E 75 6E 67 21
|
|
Backslash 
      
Beiträge: 202
WIN XP
Delphi 5 Ent, Delphi 2005 Prof
|
Verfasst: Do 03.11.05 12:51
mist, das hätte ich vorher wissen müssen  Jetzt hab ich die Header Zeile für Zeile selbst eingefügt. Bisher brauchen die allein schon fast 1000 lines of code.
Danke für den Buchhinweis 
|
|
|