AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Direktes lesen auf dem physischen Datenträger
Thema durchsuchen
Ansicht
Themen-Optionen

Direktes lesen auf dem physischen Datenträger

Ein Thema von Delphi-Delphin · begonnen am 10. Jun 2018 · letzter Beitrag vom 20. Jun 2018
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#11

AW: Direktes lesen auf dem physischen Datenträger

  Alt 18. Jun 2018, 14:22
Bei Writeln(Format('Size %d',[VarToInt(FWbemObject.Size)]));// Uint64 kommt es zu einem Überlauf, da die Funktion selbst nur einen 32 Bit Integer verwendet.
Es freut mich wenn es das macht was Du wolltest, Danke für Fehler-Report!
Delphi-Quellcode:
function VarToInt64(const AVariant: Variant): Int64;
begin Result := StrToInt64Def(Trim(VarToStr(AVariant)), 0); end;
    Writeln(Format('Size %d Byte = %f GB',[VarToInt64(FWbemObject.Size),VarToInt64(FWbemObject.Size)/(1000*1000*1000)]));// Uint64 Habe es mit Delphi so abgeändert, vielen Dank!

edit
Delphi-Quellcode:
program GetWMI_DiskDriveInfo;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  ActiveX,
  ComObj,
  Variants;

function VarToInt(const AVariant: Variant): integer;
begin Result := StrToIntDef(Trim(VarToStr(AVariant)), 0); end;

function VarToInt64(const AVariant: Variant): Int64;
begin Result := StrToInt64Def(Trim(VarToStr(AVariant)), 0); end;

procedure GetWin32_DiskDriveInfo;
const
  WbemUser ='';
  WbemPassword ='';
  WbemComputer ='localhost';
  wbemFlagForwardOnly = $00000020;
var
  FSWbemLocator : OLEVariant;
  FWMIService : OLEVariant;
  FWbemObjectSet: OLEVariant;
  FWbemObject : OLEVariant;
  oEnum : IEnumvariant;
  iValue : LongWord;
begin;
  FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
  FWMIService := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword);
  FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_DiskDrive','WQL',wbemFlagForwardOnly);
  oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
  while oEnum.Next(1, FWbemObject, iValue) = 0 do
  begin
    Writeln(Format('Availability %d',[VarToInt(FWbemObject.Availability)]));// Uint16
    Writeln(Format('BytesPerSector %d',[VarToInt(FWbemObject.BytesPerSector)]));// Uint32
// Writeln(Format('Capabilities %d',[VarToInt(FWbemObject.Capabilities)]));// Array of Uint16
// Writeln(Format('CapabilityDescriptions %s',[VarToStr(FWbemObject.CapabilityDescriptions)]));// Array of VarToStr
    Writeln(Format('Caption %s',[VarToStr(FWbemObject.Caption)]));// VarToStr
    Writeln(Format('CompressionMethod %s',[VarToStr(FWbemObject.CompressionMethod)]));// String
    Writeln(Format('ConfigManagerErrorCode %d',[VarToInt(FWbemObject.ConfigManagerErrorCode)]));// Uint32
    Writeln(Format('ConfigManagerUserConfig %s',[VarToStr(FWbemObject.ConfigManagerUserConfig)]));// Boolean
    Writeln(Format('CreationClassName %s',[VarToStr(FWbemObject.CreationClassName)]));// String
    Writeln(Format('DefaultBlockSize %d',[VarToInt64(FWbemObject.DefaultBlockSize)]));// Uint64
    Writeln(Format('Description %s',[VarToStr(FWbemObject.Description)]));// String
    Writeln(Format('DeviceID %s',[VarToStr(FWbemObject.DeviceID)]));// String
    Writeln(Format('ErrorCleared %s',[VarToStr(FWbemObject.ErrorCleared)]));// Boolean
    Writeln(Format('ErrorDescription %s',[VarToStr(FWbemObject.ErrorDescription)]));// String
    Writeln(Format('ErrorMethodology %s',[VarToStr(FWbemObject.ErrorMethodology)]));// String
    Writeln(Format('FirmwareRevision %s',[VarToStr(FWbemObject.FirmwareRevision)]));// String
    Writeln(Format('Index %d',[VarToInt(FWbemObject.Index)]));// Uint32
    Writeln(Format('InstallDate %s',[VarToStr(FWbemObject.InstallDate)]));// Datetime
    Writeln(Format('InterfaceType %s',[VarToStr(FWbemObject.InterfaceType)]));// String
    Writeln(Format('LastErrorCode %d',[VarToInt(FWbemObject.LastErrorCode)]));// Uint32
    Writeln(Format('Manufacturer %s',[VarToStr(FWbemObject.Manufacturer)]));// String
    Writeln(Format('MaxBlockSize %d',[VarToInt64(FWbemObject.MaxBlockSize)]));// Uint64
    Writeln(Format('MaxMediaSize %d',[VarToInt64(FWbemObject.MaxMediaSize)]));// Uint64
    Writeln(Format('MediaLoaded %s',[VarToStr(FWbemObject.MediaLoaded)]));// Boolean
    Writeln(Format('MediaType %s',[VarToStr(FWbemObject.MediaType)]));// String
    Writeln(Format('MinBlockSize %d',[VarToInt64(FWbemObject.MinBlockSize)]));// Uint64
    Writeln(Format('Model %s',[VarToStr(FWbemObject.Model)]));// String
    Writeln(Format('Name %s',[VarToStr(FWbemObject.Name)]));// String
    Writeln(Format('NeedsCleaning %s',[VarToStr(FWbemObject.NeedsCleaning)]));// Boolean
    Writeln(Format('NumberOfMediaSupported %d',[VarToInt(FWbemObject.NumberOfMediaSupported)]));// Uint32
    Writeln(Format('Partitions %d',[VarToInt(FWbemObject.Partitions)]));// Uint32
    Writeln(Format('PNPDeviceID %s',[VarToStr(FWbemObject.PNPDeviceID)]));// String
    Writeln(Format('PowerManagementCapabilities %d',[VarToInt(FWbemObject.PowerManagementCapabilities)]));// Array of Uint16
    Writeln(Format('PowerManagementSupported %s',[VarToStr(FWbemObject.PowerManagementSupported)]));// Boolean
    Writeln(Format('SCSIBus %d',[VarToInt(FWbemObject.SCSIBus)]));// Uint32
    Writeln(Format('SCSILogicalUnit %d',[VarToInt(FWbemObject.SCSILogicalUnit)]));// Uint16
    Writeln(Format('SCSIPort %d',[VarToInt(FWbemObject.SCSIPort)]));// Uint16
    Writeln(Format('SCSITargetId %d',[VarToInt(FWbemObject.SCSITargetId)]));// Uint16
    Writeln(Format('SectorsPerTrack %d',[VarToInt(FWbemObject.SectorsPerTrack)]));// Uint32
    Writeln(Format('SerialNumber %s',[TRIM(VarToStr(FWbemObject.SerialNumber))]));// String
    Writeln(Format('Signature %d',[VarToInt(FWbemObject.Signature)]));// Uint32
// Writeln(Format('Size %d',[VarToInt(FWbemObject.Size)]));// Uint64
    Writeln(Format('Size %d Byte = %f GB',[VarToInt64(FWbemObject.Size),VarToInt64(FWbemObject.Size)/(1000*1000*1000)]));// Uint64
    Writeln(Format('Status %s',[VarToStr(FWbemObject.Status)]));// String
    Writeln(Format('StatusInfo %d',[VarToInt(FWbemObject.StatusInfo)]));// Uint16
    Writeln(Format('SystemCreationClassName %s',[VarToStr(FWbemObject.SystemCreationClassName)]));// String
    Writeln(Format('SystemName %s',[VarToStr(FWbemObject.SystemName)]));// String
    Writeln(Format('TotalCylinders %d',[VarToInt64(FWbemObject.TotalCylinders)]));// Uint64
    Writeln(Format('TotalHeads %d',[VarToInt(FWbemObject.TotalHeads)]));// Uint32
    Writeln(Format('TotalSectors %d',[VarToInt64(FWbemObject.TotalSectors)]));// Uint64
    Writeln(Format('TotalTracks %d',[VarToInt64(FWbemObject.TotalTracks)]));// Uint64
    Writeln(Format('TracksPerCylinder %d',[VarToInt(FWbemObject.TracksPerCylinder)]));// Uint32
    Writeln('----------------------------------------------------------------------------');
    FWbemObject:=Unassigned;
  end;
end;


begin
 try
    CoInitialize(nil);
    try
      GetWin32_DiskDriveInfo;
    finally
      CoUninitialize;
    end;
 except
    on E:EOleException do
        Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode]));
    on E:Exception do
        Writeln(E.Classname, ':', E.Message);
 end;
 Writeln('Press Enter to exit');
 Readln;
end.
Nun haben alle Int64 Typen ihren Ansprechpartner
Gruß vom KodeZwerg

Geändert von KodeZwerg (18. Jun 2018 um 14:58 Uhr)
  Mit Zitat antworten Zitat
Delphi-Delphin

Registriert seit: 23. Feb 2010
10 Beiträge
 
FreePascal / Lazarus
 
#12

AW: Direktes lesen auf dem physischen Datenträger

  Alt 19. Jun 2018, 17:10
Leider fehlt mir gerade noch die Zuordnung von logischen Laufwerksbuchstaben der Partitionen zu den physischen Drives, um dann auf den jeweiligen Bootsektor der Partition zugreifen zu können.
Also z.B. "C:\" -> "\\.\PhysicalDrive1: Partition 1"

Hier mal ein Screenshot von OSForensics:
drive.jpg
Künstliche Intelligenz ist gar nichts - verglichen mit natürlicher Dummheit

Geändert von Delphi-Delphin (19. Jun 2018 um 17:13 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#13

AW: Direktes lesen auf dem physischen Datenträger

  Alt 19. Jun 2018, 17:28
Hier stellte ich Source Code zur Verfügung der vielleicht das macht was Du möchtest, DriveLetter einer Drive# zuordnen.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Delphi-Delphin

Registriert seit: 23. Feb 2010
10 Beiträge
 
FreePascal / Lazarus
 
#14

AW: Direktes lesen auf dem physischen Datenträger

  Alt 19. Jun 2018, 22:54
Das Programm ist jetzt so weit, das die Infos zur Partition angezeigt werden und nach der Auswahl der erste Sektor ausgelesen wird.
Siehe Screenshot.

mbr_auslesen.png

Allerdings funktioniert das Offset bei ReadFile nicht richtig, bzw. ich konnte nicht wirklich finden, womit der Record von ^Overlapped befüllt werden muss.

Delphi-Quellcode:
type TSECTOR= Array[0..511] of Byte;

const SectorSize = 512;

var Sector: TSector;
  nBytesRead ,
  fHandle : Cardinal;
theOverlapped: Overlapped;

//funktioniert:
Result := ReadFile(fHandle, Sector[0], SectorSize, nBytesRead, nil);

//funktioniert nicht:
theOverlapped.OffsetHigh:=0;
theOverlapped.Offset:=Offset*SectorSize;

Result := ReadFile(fHandle, Sector[0], SectorSize, nBytesRead, @theOverlapped);
Komplette Funktion:
Delphi-Quellcode:
Function GetSector (const PhysDrive: String; const Offset: DWord; out Sector: TSector): Boolean;
const SectorSize = 512;
var
  nBytesRead ,
  fHandle : Cardinal;
  theOverlapped: Overlapped;
begin
  fHandle := CreateFile(
    PChar(PhysDrive), //PChar('\\.\PHYSICALDRIVE'+IntToStr(DiskNumber)),
    GENERIC_READ, FILE_SHARE_WRITE,
    nil,
    OPEN_EXISTING,
    0,
    0);
  if fHandle = INVALID_HANDLE_VALUE then
  begin
    Result := False;
    ShowMessage('CreateFile - Fehler: Invalid Handle' +#13#10#13#10+
                'Hinweis: liegen Admin-Rechte vor?');
    exit;
  end;

  Result := ReadFile(fHandle, Sector[0], SectorSize, nBytesRead, nil);
  if nBytesRead-1 <> High(Sector) then Result := False;
  if not Result then
  begin
    ShowMessage('ReadFile - Fehler' +#13#10#13#10+
                'Es sollten '+IntToStr(High(Sector))+ ' bytes gelesen werden' +#13#10+
                'aber nur '+ IntToStr(nBytesRead-1) +' bytes waren lesbar!');
  end;
  CloseHandle(fHandle);
end;
https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx
Künstliche Intelligenz ist gar nichts - verglichen mit natürlicher Dummheit

Geändert von Delphi-Delphin (19. Jun 2018 um 23:15 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#15

AW: Direktes lesen auf dem physischen Datenträger

  Alt 20. Jun 2018, 00:09
Es freut mich das Du meinen Code irgendwie für Deine Zwecke Sinnvoll einsetzen kannst.
Nun seh ich ja hinter was Du her bist, ich versuche die Tage mal ein Sample zu erstellen mit erweiterten Funktionen, MBR GPT RAW support wird dann auch dabei sein.
Overlapped, damit kann ich jetzt noch nichts anfangen, vielleicht wenn ich das Sample bastel zeigt mir MSDN was Du meinst.
Die "GetMBR" funktion werde ich ein wenig aufpolieren das man auch über Offset Angaben einen weiteren Block nachladen kann, so wie es aussieht scheint ja mein Code sich mit Lazarus gut zu verstehen.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Delphi-Delphin

Registriert seit: 23. Feb 2010
10 Beiträge
 
FreePascal / Lazarus
 
#16

AW: Direktes lesen auf dem physischen Datenträger

  Alt 20. Jun 2018, 01:27
Cool, dass du dich auch gerade mit so etwas beschäftigst.

Ich hab gerade ne Funktion geschrieben mit denen ich dann die bestimmten Sectoren in eine Datei schreiben kann.
Funktioniert auch mit einem Header für eine Signatur zum Carven und Zusatzinformationen (Timestamp, Größe usw.), nachdem ich gerade entdeckt habe, dass es variable Records gibt. Der Padded den Header auch gleich auf 512 Byte auf, weil der TSectors 512 ein Array aus 512 Byte ist. Das erleichtert dann später natürlich das Auslesen im Hexeditor.


Bei Lazarus gibt es hauptsächlich Probleme bei Code aus den neuen Delphi-Versionen die mehr OOP nutzen. Dort werden ein paar Typen verwendet, die Lazarus nicht kennt und die man auch nicht einfach durch casten o.ä. ersetzen kann.
Da Delphi bei XE2 selbst den FPC für iOS nutzte, der aber bei XE3 wegen zu großen Änderungen rausflog, sollte also der Code bis Delphi XE2 auch mit Lazarus ganz gut funktionieren.
https://de.wikipedia.org/wiki/Embarc...dename_Pulsar)
Künstliche Intelligenz ist gar nichts - verglichen mit natürlicher Dummheit

Geändert von Delphi-Delphin (20. Jun 2018 um 01:40 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#17

AW: Direktes lesen auf dem physischen Datenträger

  Alt 20. Jun 2018, 09:34
Cool, dass du dich auch gerade mit so etwas beschäftigst.
Nur um ein wenig zu helfen
Overlapped, habe da mal nachgelesen bei MSDN, vergiss es, asynchroner Zugriff um 512 Byte zu lesen ist mehr als Überflüssig und Deine Structure ist falsch, es muss eine seperate Structure sein die vorher genull wird, über den Offset könnte man dann hin und her wandeln, aber bedenke was wir hier machen, wir greifen lesend auf die Festplatte zu, das bedeutet, Zugtriffe sollten/müßten so kurz und gering wie möglich sein da Festplatten die Angewohnheit haben immer mal was Schreiben zu wollen.
(File)Seek/(File)Position o.ä. werde ich benutzen um tiefere Blöcke auszulesen zu können, das solltest Du auch tun.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
hans65

Registriert seit: 1. Feb 2007
Ort: Sachsen
26 Beiträge
 
Delphi 12 Athens
 
#18

AW: Direktes lesen auf dem physischen Datenträger

  Alt 20. Jun 2018, 09:37
Schau mal unter https://sourceforge.net/projects/diskimage/ nach DiskImage0.9F-src.zip. Ist zwar für Delphi, aber vielleicht hilft es.

Auszug aus DiskImage.pdf:
Features
* Low-level access to your harddisk and other block devices
* Backup and restore entire partitions or drives
* Hex viewer, hex editor
* MD5 sum / SHA1 sum
* Operations also allowed on file
* Graphical display allows visualizing and locating ascii data, binary data and empty space
* Search for ascii or hex strings.
* Native windows application, no need to boot or reboot.
* Displays partition table
* Save as .zip
* Extract and write floppy images
* Extract read-only media
* Backup/restore entire drives or partitions
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#19

AW: Direktes lesen auf dem physischen Datenträger

  Alt 20. Jun 2018, 09:57
hans65, Du ersparst mir ein Sample zu basteln, Schade und gleichzeitig Danke.
Das Thema hat sich ja damit erledigt, Frage an TE: oder gibt es noch Punkte die Fehlen?

edit
Ich habe mal das DiskImage getestet, also so tief würde ich nicht vordringen, da kann man sich ja sogar einzelne Dateien rauspicken und lesen/per Offset verfolgen wo Fragmente verteilt sind, das ist echt mächtig, hat zwar hier und da ein paar Ungereimtheiten so das man, warum auch immer, keinen Zugriff auf die Hex-Ansicht einzelner Platten bekommt, dadurch das Source vorhanden ist kann man das mit Sicherheit fixen.
Gruß vom KodeZwerg

Geändert von KodeZwerg (20. Jun 2018 um 10:21 Uhr)
  Mit Zitat antworten Zitat
Delphi-Delphin

Registriert seit: 23. Feb 2010
10 Beiträge
 
FreePascal / Lazarus
 
#20

AW: Direktes lesen auf dem physischen Datenträger

  Alt 20. Jun 2018, 23:02
Das FileSeek() also einfach auf den Handle von CreateFile() anwenden?
https://www.freepascal.org/docs-html.../fileseek.html

Das Projekt DiskImage ist schon zu umfangreich. Hab mir den Code jetzt noch nicht angeschaut, ob der mit Lazarus laufen würde.
Künstliche Intelligenz ist gar nichts - verglichen mit natürlicher Dummheit
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 16:27 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