AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi NTFS-Bootblock mit CreateFile auslesen?
Thema durchsuchen
Ansicht
Themen-Optionen

NTFS-Bootblock mit CreateFile auslesen?

Offene Frage von "richard_boderich"
Ein Thema von richard_boderich · begonnen am 26. Mär 2008 · letzter Beitrag vom 6. Mai 2008
Antwort Antwort
Benutzerbild von richard_boderich
richard_boderich

Registriert seit: 21. Jun 2004
Ort: Berlin
1.067 Beiträge
 
Delphi 7 Architect
 
#1

NTFS-Bootblock mit CreateFile auslesen?

  Alt 26. Mär 2008, 11:21
Moin

Ich möchte unter den NTFS den Bootblock binär auslesen. Das soll ja mit CreateFile und PhysicalDrive0 gehen.

In der MSDN gab es mal ein Beispiel dafür
wie man Cylinder 0 sector 0 spur 0 ausliest, jedoch finde ich es nicht mehr. Hatt jemand den entsprechenden Link noch bzw. kann mir jemand Hilfestellung geben? Ich möchte nur lesend zugreifen!!! Besonders interessiert mich die Positionierung mit Setfilepointer. Was muss ich dabei beachten?
Ich möchte auf keinen Fall einen Datenverlust riskieren.

Gruß Richard
mfG Richard

Cimmams schrieb "das einzige was an ArmA gut ist, ist die Grafik bis 100m und der Rest ist so unreal wie unsere Demokratie."
  Mit Zitat antworten Zitat
Benutzerbild von OldGrumpy
OldGrumpy

Registriert seit: 28. Sep 2006
Ort: Sandhausen
941 Beiträge
 
Delphi 2006 Professional
 
#2

Re: NTFS-Bootblock mit CreateFile auslesen?

  Alt 26. Mär 2008, 22:45
Im Prinzip brauchst Du nur Adminrechte und den richtigen Devicenamen für den CreateFile-Aufruf. Bei USB-Devices ist zusätzlich noch darauf zu achten, dass der Puffer in den gelesen wird, page-aligned ist. Das erledigt man am einfachsten indem man sich den Speicher mittels VirtualAlloc() anfordert. Freigeben später dann mit VirtualFree() (beides in der MSDN zu finden). Ich hatte irgendwann mal einen kleinen Dumper für meinen USB-Stick geschrieben, der macht im Prinzip genau das. Ich schau mal ob ich den Code noch finde...

CreateFile sollte man mit den Parametern für nur-lese-Zugriff und komplettes Sharing ausstatten, sonst schlägt der Aufruf aller Wahrscheinlichkeit nach fehl (weil auf der Platte im Betrieb halt etliche Files für exklusiven Zugriff geöffnet sind).
"Tja ja, das Ausrufezeichen... Der virtuelle Spoiler des 21. Jahrhunderts, der Breitreifen für die Datenautobahn, die k3wle Sonnenbrille fürs Usenet. " (Henning Richter)
  Mit Zitat antworten Zitat
wido

Registriert seit: 2. Jan 2006
122 Beiträge
 
#3

Re: NTFS-Bootblock mit CreateFile auslesen?

  Alt 27. Mär 2008, 11:33
Ich hab das mal kurz für dich ausprogrammiert. Über meinen Stil kann man sich streiten, aber denke mal Du wirst alles sehen können, was relevant ist für Dich:

Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

uses
  windows;

// Liest den ersten Sektor von DeviceName in den Speicherbereich, auf den buffer
// zeigt. Sektoren sind dabei immer 512 Bytes groß!
function ReadFirstSector(DeviceName : widestring; buffer : pointer) : boolean;
var
  dh : THandle; // Device Handle
  tmp : dword; // Temporäre Variable
begin
  result := false;
  dh := CreateFileW(PWideChar(DeviceName), GENERIC_READ, FILE_SHARE_READ or
                    FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);

  // Device konnte nicht geöffnet werden -> Abbruch
  if dh = INVALID_HANDLE_VALUE
    then exit;

  // Sektor lesen
  result := (ReadFile(dh, buffer^, 512, tmp, nil)) and (tmp = 512);
  CloseHandle(dh);
end;

var
  buffer : pointer;
  f : file;
begin
  getmem(buffer, 512);
  writeln('-> Lese Sektor: ', ReadFirstSector('\\.\PHYSICALDRIVE0', buffer));
  assignfile(f, 'sektor.dmp');
  rewrite(f, 1);
  blockwrite(f, buffer^, 512);
  closefile(f);
  freemem(buffer);
  writeln('-> Der gelesene Sektor wurde nach sektor.dmp gesichert.');
  readln;
end.
Im Endeffekt läuft es in der Tat darauf hinaus, daß du das Plattendevice (\\.\PHYSICALDRIVE0, \\.\PHYSICALDRIVE1 ...) mit CreateFile öffnest und einfach den ersten Sektor (= 512 Bytes) liest.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

Re: NTFS-Bootblock mit CreateFile auslesen?

  Alt 24. Apr 2008, 16:29
Zitat:
Ich möchte auf keinen Fall einen Datenverlust riskieren.
solange du ließt, sollte es nicht dazu kommen.
(SetFilePointer setzt nur einen programminternen "Zeiger").

Cylinder/Sector/Spur wird hierbei auch nicht benötigt ... wird eh alles als ein zusammenhängender Datenstrom angesehn ... also erster Sector liegt immer an Position 0.


OldGrumpy's Hinweisen und wido's Code würde ich auch nix entgegensetzen.
(vorallem die Adminrechte ... ohne geht es unter XP und Vista garnicht)
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

Re: NTFS-Bootblock mit CreateFile auslesen?

  Alt 6. Mai 2008, 14:25
Hat zufällig schonmal jemand versucht unter Windows Vista oder Windows Server 2008 einen direkten Zugiff auf eine Festplatte zu bekommen?

Grund: Auf der Suche nach MD5 und Co. bin ich zufällig in der Security-Ecke über MSDN-Library durchsuchenFveEnableRawAccessW gestolpert
http://msdn.microsoft.com/en-us/libr...82(VS.85).aspx
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:13 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz