Autor Beitrag
Backslash
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 202

WIN XP
Delphi 5 Ent, Delphi 2005 Prof
BeitragVerfasst: 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 user profile iconraziel: Topic aus Sonstiges verschoben am Sa 29.10.2005 um 18:17
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 202

WIN XP
Delphi 5 Ent, Delphi 2005 Prof
BeitragVerfasst: 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. :wink:
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 202

WIN XP
Delphi 5 Ent, Delphi 2005 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 202

WIN XP
Delphi 5 Ent, Delphi 2005 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2453

Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
BeitragVerfasst: Mo 31.10.05 18:03 
user profile iconBenBE 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 :mrgreen:), 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 202

WIN XP
Delphi 5 Ent, Delphi 2005 Prof
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 202

WIN XP
Delphi 5 Ent, Delphi 2005 Prof
BeitragVerfasst: 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)


ausblenden volle Höhe Delphi-Quelltext
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:
// -----------------------------------------------------------------------------
// Record des BIOS Parameter Blocks (NTFS)
// -----------------------------------------------------------------------------
type
  PBPB_NTFS = ^TBPB_NTFS;  //BPB-Struktur
  TBPB_NTFS = packed record
    BPB_BytesPerSector     : WORD;  // Bytes pro Sektor
    BPB_SectorsPerCluster  : byte;  // Number of sectors per allocation unit
    BPB_ReservedSectors    : WORD;  // Number of reserved sectors in reserved region of volume starting at the first sector of volume
    BPB_NULL1              : array[0..2of Byte; // immer 0
    BPB_NotUsed1           : WORD;  // nicht von NTFS benutzt (ist 0)
    BPB_Media              : byte;  // SIEHE: Media Descriptor
    BPB_NULL2              : WORD;  // immmer Null
    BPB_SectorsPerTrack    : WORD;  // Sectors per track for interrupt 0x13
    BPB_NumberOfHeads      : WORD;  // Anzahl Köpfe
    BPB_HiddenSectors      : DWORD; // Count of hidden sectors on the FAT volume
    BPB_NotUsed2           : DWORD; // nicht benutzt (ist 0)
  end;

// -----------------------------------------------------------------------------
// Erweiterung des BIOS Parameter Blocks (NTFS)
// -----------------------------------------------------------------------------
type
  PBPB_NTFS_EXT = ^TBPB_NTFS_EXT;
  TBPB_NTFS_EXT = packed record
    BPB_NotUsed1           : DWORD; // nicht benutzt (ist 0)
    BPB_TotalSectors       : Int64; // Total count of sectors on the volume
    BPB_MFT_ClusNumber     : Int64; // logische Clusternummer für die Datei MFT
    BPB_MFTMirr_ClusNumber : Int64; // logische Clusternummer für die Datei MFTMirr
    BPB_ClusPerFileRecSeg  : DWORD; // Cluster pro Filerecord Segment
    BPB_ClusPerIndexBlock  : DWORD; // Cluster pro Indexblock
    BPB_VolSerial          : Int64; // Seriennummer des Laufwerks
    BPB_Checksum           : DWORD; // CRC32-Checksumme
  end;

// -----------------------------------------------------------------------------
// Bootsektor layout für NTFS
// -----------------------------------------------------------------------------
type
  PBS_NTFS = ^TBS_NTFS;
  TBS_NTFS = packed record
    BS_jmpBoot       : array [0..2of byte; // Jump instruction boot code
    BS_OEMID         : Int64;
    BS_BPB           : TBPB_NTFS;     // BIOS Parameter Block für NTFS
    BS_BPB_EXT       : TBPB_NTFS_EXT; // BPB Erweiterung
    BS_BootstrapCode : array[0..425of Byte;
    BS_Signature     : WORD;          // $AA55 -> Bootsignatur
  end;


Und so möchte ich den MFT-Sektor berechnen. Also es sei angenommen, ich habe den TBS_NTFS-Record eingelesen:

ausblenden Delphi-Quelltext
1:
2:
3:
  // MFT-Sektor berechnen
  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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 202

WIN XP
Delphi 5 Ent, Delphi 2005 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 107

Win 98, Win 2000 Prof., Win XP Prof.
Delphi 2005 Prof.
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 531

WinXP
D5 Ent
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1905

W98, XP
D7 PE, Lazarus, WinAVR
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 202

WIN XP
Delphi 5 Ent, Delphi 2005 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1905

W98, XP
D7 PE, Lazarus, WinAVR
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 202

WIN XP
Delphi 5 Ent, Delphi 2005 Prof
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 202

WIN XP
Delphi 5 Ent, Delphi 2005 Prof
BeitragVerfasst: 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:


ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 346



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 202

WIN XP
Delphi 5 Ent, Delphi 2005 Prof
BeitragVerfasst: Do 03.11.05 12:51 
mist, das hätte ich vorher wissen müssen :x 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 :o