Er det muligt at få skriveadgang til rå enheder ved hjælp af python med windows?

Indlæg af Hanne Mølgaard Plasc

Problem



Dette er en slags opfølgning på dette spørgsmål. Jeg vil gerne vide, om du kan få adgang til rå enheder (dvs. \.PhysicalDriveN) i skriftlig tilstand, og hvis dette skulle være tilfældet, hvordan.


Ved brug af Linux kan skrivadgang let opnås ved f.eks. open("/dev/sdd", "w+") (forudsat at scriptet kører med root tilladelser). Jeg går ud fra, at Mac OS opfører lignende (med /dev/diskN som input-fil).


Når du prøver den samme kommando under Windows (med den tilsvarende sti), fejler den med følgende fejl:


IOError: [Errno 22] invalid mode ('w+') or filename: '\\.\PhysicalDrive3'


Når du forsøger at læse fra PhysicalDrive, fungerer det imidlertid (selv de korrekte data bliver læst). Skallen kører med administratorrettigheder under Windows 7.


Er der nogen anden måde at udføre denne opgave ved hjælp af python, mens scriptet stadig er så platformafhængigt som muligt?


Rediger:



Jeg kiggede lidt længere ind på, hvilke metoder python giver til filhåndtering og snuble over os.open. Åbning af PhysicalDrive ved hjælp af os.open(drive\_string, os.O\_WRONLY|os.O\_BINARY) returnerer ingen fejl. Så langt så godt. Nu har jeg enten valget til at skrive direkte til denne filbeskrivelse ved hjælp af os.write, eller brug os.fdopen for at få en filobjekt og skrive til den på den almindelige måde.
Desværre fungerer ingen af ​​disse muligheder. I det første tilfælde (os.write()) får jeg dette: [15] [16] [17]


>>> os.write(os.open("\\.\PhysicalDrive3", os.O\_WRONLY|os.O\_BINARY), "test")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OSError: [Errno 22] Invalid argument


I det andet tilfælde kan jeg oprette et filobjekt med skrive tilladelser, men selve skrivningen fejler (godt efter at have fuldbyrdet udførelsen ved hjælp af .flush()):


>>> g = os.fdopen(os.open("\\.\PhysicalDrive3", os.O\_WRONLY|os.O\_BINARY), "wb")
>>> g.write("test")
>>> g.flush()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IOError: [Errno 22] Invalid argument

Bedste reference


Som eryksun og agf påpegede i kommentarerne (men jeg forstod det ikke i starten), er løsningen ret simpel: du skal åbne enheden i rb+ -tilstanden, som åbner enheden for opdatering ( som jeg har fundet ud af det nu ..) uden at forsøge at erstatte det med en ny fil (som ikke ville fungere, fordi filen faktisk er et fysisk drev). [20]


Når du skriver, skal du altid skrive en hel sektor ad gangen (dvs. multipler på 512 byte), ellers svigter den.


Desuden kan kommandoen .seek() også hoppe kun sektorsvis. Hvis du forsøger at søge en stilling inden for en sektor (f.eks. Position 621), vil filobjektet hoppe til begyndelsen af ​​sektoren, hvor din ønskede position er (dvs. til begyndelsen af ​​den anden sektor, byte 512).

Andre referencer 1



  Eventuelt i Win 7 skal du gøre noget mere ekstremt, som f.eks. At låse lydstyrken (r) for disken på forhånd med DeviceIoControl (hVol, FSCTL\_LOCK\_VOLUME, ...)



I Win 7 behøver du ikke at gøre det; åbning og skrivning med 'rb +' mode fungerer fint.