Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi NTFS-Bootblock mit CreateFile auslesen? (https://www.delphipraxis.net/110885-ntfs-bootblock-mit-createfile-auslesen.html)

richard_boderich 26. Mär 2008 10:21


NTFS-Bootblock mit CreateFile auslesen?
 
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

OldGrumpy 26. Mär 2008 21:45

Re: NTFS-Bootblock mit CreateFile auslesen?
 
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).

wido 27. Mär 2008 10:33

Re: NTFS-Bootblock mit CreateFile auslesen?
 
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.

himitsu 24. Apr 2008 15:29

Re: NTFS-Bootblock mit CreateFile auslesen?
 
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)

himitsu 6. Mai 2008 13:25

Re: NTFS-Bootblock mit CreateFile auslesen?
 
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 :shock:
http://msdn.microsoft.com/en-us/libr...82(VS.85).aspx


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:14 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