![]() |
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 |
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). |
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:
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.
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. |
Re: NTFS-Bootblock mit CreateFile auslesen?
Zitat:
(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) |
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 ![]() ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz