Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   MBR auslesen (https://www.delphipraxis.net/125104-mbr-auslesen.html)

Cyf 30. Nov 2008 21:14


MBR auslesen
 
Ich hab zu dem Thema schon ein bisschen gesucht, aber keine wirkliche Lösung gefunden, außer das HxD wohl direkt Festplattensektoren auslesen kann (aber ich wills ja selbst machen :lol: )
Hat jemand eine Idee wie sich der MBR auslesen lässt? Und nein, das hat nicht wirklich praktische Gründe, ich will ihn mir einfach nur mal anschauen :-D

DeddyH 1. Dez 2008 09:06

Re: MBR auslesen
 
Willst Du das aus Delphi heraus machen oder einfach nur mal nen MBR sehen?

turboPASCAL 1. Dez 2008 10:03

Re: MBR auslesen
 
Ist relativ einfach.

Delphi-Quellcode:
  fHandle := CreateFile(
    PChar('.PHYSICALDRIVE0'), // ...PHYSICALDRIVE0 <--<< first Harddisk ( Primary Master )
    GENERIC_READ,            // ...read only
    FILE_SHARE_WRITE,        // ...Wichtig, nicht das es Probleme gibt
    nil,
    OPEN_EXISTING,           // ...ist klar warum
    0,
    0);

  if fHandle = INVALID_HANDLE_VALUE then
  begin
    ShowMessage('CreateFile - Error: Invalid Handle');
    exit;
  end;

  Success := ReadFile(fHandle,
    Buffer,
    512,                     // ....read the first 512 Byte (MBR)
    nBytesRead,
    nil);

  CloseHandle(fHandle);      // ...Schnell wieder dem MBR zu-machen ;-)

  // --- nun sollte man den MBR im Array "Buffer" haben ---
Fertig.

Anmerkung:
  • Ungetested!
  • Unter Vista braucht man Anminrechte bzw das Programm benötigt diese.
  • Anwendung auf eigene Gefahr.

DeddyH 1. Dez 2008 10:36

Re: MBR auslesen
 
Ich hätte das jetzt mit Linux und dd gemacht ;)

turboPASCAL 1. Dez 2008 11:46

Re: MBR auslesen
 
Zitat:

Zitat von DeddyH
Ich hätte das jetzt mit Linux und dd gemacht ;)

Gut, man kann auch mit der Kuh um's Dorf laufen. :mrgreen:
Was ist ein "dd" ?

Luckie 1. Dez 2008 13:13

Re: MBR auslesen
 
dd ist ein Linux Programm im Images von Partitionen und Festplatten zu erzeugen. Steht wohl für DiskDouble oder so was. Komischerweise wird dd oftmals von Virenscanner als Malware eingestuft.

DeddyH 1. Dez 2008 13:21

Re: MBR auslesen
 
[OT] dd steht für Copy & Convert. Da aber das Kürzel cc bereits für den C-Compiler reserviert war, hat man einfach den nächsten Buchstaben genommen. [/OT]

Luckie 1. Dez 2008 13:31

Re: MBR auslesen
 
Hmpf, dann eben so.

Übrigens brauht man auch unter XP für den direkten physischen Zugriff auf Laufwerke Administratorenrechte.

DGL-luke 1. Dez 2008 13:32

Re: MBR auslesen
 
och, gibt auch die interpretation "dump device" or "data destroy"...

divBy0 1. Dez 2008 15:38

Re: MBR auslesen
 
Der Code von turboPASCAL funktioniert bei mir leider nicht. Bekomme immer als Rückgabewert immer INVALID_HANDLE_VALUE.

Hat das vielleicht noch jemand ausprobiert?

DeddyH 1. Dez 2008 15:41

Re: MBR auslesen
 
Administratorrechte hast Du?

[edit] Probiert - geht bei mir auch nicht (XP SP 3) [/edit]

divBy0 1. Dez 2008 15:51

Re: MBR auslesen
 
Ja, Adminrechte hab ich. XP pro SP2

bassman 1. Dez 2008 16:01

Re: MBR auslesen
 
So gehts bei mir

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  nBytesRead ,
  fHandle   : Cardinal;
  Buffer    : Array of Byte;
  Success   : Boolean;
begin
fHandle := CreateFile(
    PChar('\\.\PHYSICALDRIVE0'), // ...PHYSICALDRIVE0 <--<< first Harddisk ( Primary Master )
    GENERIC_READ,               // ...read only
    FILE_SHARE_WRITE,           // ...Wichtig, nicht das es Probleme gibt
    nil,
    OPEN_EXISTING,              // ...ist klar warum
    0,
    0);

  if fHandle = INVALID_HANDLE_VALUE then
  begin
    ShowMessage('CreateFile - Error: Invalid Handle');
    exit;
  end;

  SetLength(Buffer,512);

   // ....read the first 512 Byte (MBR)
  if not ReadFile(fHandle, Buffer[0], 512, nBytesRead, nil) then
  begin
    ShowMessage('ReadFile - Error');
  end;

  CloseHandle(fHandle);      // ...Schnell wieder den MBR zu-machen ;-)

  // --- nun sollte man den MBR im Array "Buffer" haben ---
end;
Gruss, Jörn

DeddyH 1. Dez 2008 16:04

Re: MBR auslesen
 
Jo, bei mir auch (was so ein paar läppische Backslashes nicht ausmachen können :mrgreen:).

turboPASCAL 1. Dez 2008 16:19

Re: MBR auslesen
 
Entschuldigung, die habe ich unterschlagen. ( Absichtlich ?! :gruebel: :stupid: )

Cyf 1. Dez 2008 18:34

Re: MBR auslesen
 
Huch erst nichts und auf einmal so viel hier drin. :P
Bin zwischenzeitlich zum selben Ergebnis gekommen, kam aber noch nicht dazu, das zu posten (Schule und so...). :wink:
Das ganze lässt sich noch mit SetFilePointer errweitern um beliebige Sektoren auszulesen und mit WriteFile und GENERIC_WRITE Rechten lässt sich auch schreiben, auch dazu sind Adminrechte von nöten.
Dabei sollte allerdings - insbesondere im MBR (erster Sektor) und den folgenden Sektoren - vorsichtig sein, da hier falsche Änderungen sehr schnell dazu führen können, dass sich das System nicht mehr booten lässt.

Delphi-Quellcode:
type
  TMBR = array[0..511] of Byte;

var
  Mbr: TMBR;
  i: Word;
  Errorcode: Cardinal;

function ReadMBR(var Buffer: TMBR): Boolean;
var
  hDevice: THandle; //Handle der Festplatte
  NumberOfBytesRead: DWORD;
begin
  //Handle anforern
  hDevice:= CreateFile(LPCTSTR('\\.\PHYSICALDRIVE0'),
    GENERIC_READ, //Schreib-/Leserechte: nur Lesen
    FILE_SHARE_READ or FILE_SHARE_WRITE, //Lese- und Schreibrechte teilen
    PSecurityAttributes(nil), //lpSecurityAttributes
    OPEN_EXISTING, //nur öffnen wen nschon vorhanen (Standard bei allem außer Dateien)
    0, //dwFlagsAndAttributes,
    THandle(0)); //hTemplateFile: NULL

  if (hDevice = INVALID_HANDLE_VALUE) then
  begin
    Result:= false; //Fehler
    Exit;
  end;

  //auslesen, bei Fehler ggf. GetLastError; Fehler wenn <> 0
  Result:= ReadFile(hDevice, {@}Buffer, 512, {@}NumberOfBytesRead, nil);

  //NumberOfBytesRead enthält die gelesenen Bytes.

  //Handle freigeben
  CloseHandle(hDevice);
end;

begin
  if(ReadMBR(Mbr)) then
  begin
    for i:= 0 to High(Mbr) do
    begin
      Write(Format('%.2x', [Mbr[i]]));
      //16 Werte pro Zeile
      if(((i+1) mod 16) <> 0) then
        Write(' ')
      else
        Writeln;
    end;
  end
  else
  begin
    Write('Errorcode: ');
    Errorcode:= GetLastError;
    Writeln(Errorcode);
    case Errorcode of
      5: Writeln('Access is denied.');
      else Writeln('Unknown error.');
    end;
  end;
  Readln;
end.
Danke an alle die MBR-Sache hat sich für mich damit erledigt. :thumb: :dp:
(Ich schau mir nur grade historische Linux-Kernel an und wollte den MBR mal bei einem funktionierenden System betrachten, komme aber im Moment noch nicht so wirklich drauf wie die Funktionsweise der Loader so funktioniert :gruebel: Mag dran liegen das sie in Asm sind und mir zum Thema (also Kernel nicht Asm grundsätzlich) noch insgesamt zuviel Hintergrundwissen fehlt.)

himitsu 2. Dez 2008 08:34

Re: MBR auslesen
 
Zitat:

Zitat von Cyf
Dabei sollte allerdings - insbesondere im MBR (erster Sektor) und den folgenden Sektoren - vorsichtig sein, da hier falsche Änderungen sehr schnell dazu führen können, dass sich das System nicht mehr booten lässt.

Abgesehn davon isses eh schlecht da einfach so drin rumzuschreiben, denn zusätzlich umgeht man gleich mal die Windowscache und andere Stellen, wo Werte von Windows zwischengespeichert werden ... vorallem beim MBR, den Bootsektoren, den FATs/PartitionsBitmaps und dem Dateisystem(MFT/Verzeichnisstrukturen) ... also einfach so rumschreiben und das ohne Windows bescheidzusagen ist nicht gut/klug.

Cyf 2. Dez 2008 16:28

Re: MBR auslesen
 
Naja es gibt sicherlich auch Ausnahmefälle wo sowas sinnvoll sein kann, Tools zum partitionieren oder zum resizen von Partitionen, wenn Windows damit grundsätlich Propleme hätte könnte man sowas ja zum Beispiel ja nicht ohne windows-eigene Programme lösen oder Bootmanager verwenden, dennoch sollte man wissen was man macht (und sowas besser in einer VM testen).

lbccaleb 2. Dez 2008 16:39

Re: MBR auslesen
 
Zitat:

Zitat von Cyf
..wenn Windows damit grundsätlich Propleme hätte könnte man sowas ja zum Beispiel ja nicht ohne windows-eigene Programme lösen oder Bootmanager verwenden..

[OT]
Naja, aber aus der Zeit von Win 3.1 sind wir raus. :stupid:
[/OT]

mr_emre_d 29. Mär 2009 18:25

Re: MBR auslesen
 
PChar('\\.\PHYSICALDRIVE0') :
Wie bekomme ich raus, was für andere Geräte am System angeschlossen sind ?

MfG

Cyf 29. Mär 2009 19:19

Re: MBR auslesen
 
Zitat:

Zitat von mr_emre_d
PChar('\\.\PHYSICALDRIVE0') :
Wie bekomme ich raus, was für andere Geräte am System angeschlossen sind ?

MfG

http://stackoverflow.com/questions/3.../327791#327791
MSDN Volume Management Functions

khh 29. Mär 2009 19:21

Re: MBR auslesen
 
unter unix brauchts dafür kein tool.
das normale fdisk kann das auch


Gruss Kh

mr_emre_d 30. Mär 2009 18:12

Re: MBR auslesen
 
Zitat:

Zitat von khh
unter unix brauchts dafür kein tool -> ..fdisk kann das auch

Ist das nicht ein wenig paradox ? fdisk <> tool ? :gruebel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:02 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 by Thomas Breitkreuz