Problem: Wie eine Festplatte auf Byte-Ebene editieren?
-
Hallo!
Ich bin neu hier, aber ist nicht mein erstes Forum, hab also von daher sowohl die Boardsuche als auch Google verwendet, bin aber nicht fündig geworden.Ich habe folgendes Problem:
Ich möchte eine Festplatte auf Byte-Ebene manipulieren bzw. editieren. Leider habe ich aber keine Ahnung, welchen Befehl ich dafür verwenden kann, oder wo ich danach suchen kann. Der Vormittag bis jetzt ging dafür drauf, ohne was brauchbares gefunden zu haben.Das Programm soll u.a. z.B. an der Adresse 0x80000 16 Byte hinschreiben und nach weiteren 3 Bytes suchen und diese ändern.
Manuell ist das wunderbar mit einem Hex-Editor möglich (z.B. Winhex, wenn man die Version hat, die editieren kann, oder HIEW), aber ich möchte es vom Programm gemacht haben. Vielleicht gibt es auch einen Hex-Editor, der über Kommandozeile bedienbar ist, so dass man aus C mit einem "system(...)"- Befehl aufrufen kann, so dass man diesem dort per übergebenem Parameter die Adresse oder so übergibt.
Ist dies mit Standard-C++ überhaupt möglich? Oder ist es vllt nötig, Assemblercode einzubauen oder eine ganz andere Programmiersprache zu verwenden?
Danke schonmal an alle, die sich das jetzt durchgelesen haben

-
Das ist Betriebssystem abhängig. Unter Linux öffnest du einfach das Device
/dev/hdXmitfopenund wanderst mitfseekan die Stelle, die du bearbeiten willst.
-
Ah ok... Ich versuchs unter Windows (wird sicherlich nicht gehen), wird auch ein Konsolenprogramm werden, also wird es vermutlich im Endstadium unter FreeDOS laufen.
Hätt ich vllt dazusagen können.
-
nyhlz schrieb:
Ah ok... Ich versuchs unter Windows (wird sicherlich nicht gehen), wird auch ein Konsolenprogramm werden, also wird es vermutlich im Endstadium unter FreeDOS laufen.
Hätt ich vllt dazusagen können.Wenn es unter DOS laufen soll, dann wirst du um Assembler nicht drum herum kommen. Da DOS den Festplatten Zugriff nur über das Datei-System frei gibt, musst du unter DOS die Festplatte selber ansprechen. Das machst du nicht direkt, sondern hast dafür einen BIOS Interrupt. Das klappt aber dann auch nur unter DOS und du kannst das unter Windows nicht testen.
-
Windows:
unsigned char buffer[512] = { 0 }; FILE* fp = fopen( "\\\\.\\C:", "rb" ); if ( !fp ) return 0; fread( buffer, 1, 512, fp ); for ( int i = 0; i < 512; ++i ) { printf( "%02x ", buffer[i] ); if ( ( i+1 & 15 ) == 0 ) printf( "\n" ); } fclose( fp );
-
Das hätt ich jetzt mit einer VIrtual Machine getestet, sollte funktionieren, und außerdem kann ich da nichts kaputtmachen... Dass es unter Windows dann so nicht funktioniert, dachte ich mir fast, da schiebt Windows dem ganzen einen Riegel vor, zumindest an empfindlichen Stellen.
Ich richt die jetzt mal ein und schau dann mal, ob ich die ersten 512 Bytes da rausgelesen kriege.

-
nyhlz schrieb:
Manuell ist das wunderbar mit einem Hex-Editor möglich (z.B. Winhex, wenn man die Version hat, die editieren kann, oder HIEW)
Aber da machst Du das doch mit einer bestimmten Datei und nicht mit der Festplatte, oder irre ich mich da?
-
Nein, die zu bearbeitende Festplatte ist komplett formatiert und es soll dort eine Partitionsstruktur erstellt werden und diverse Bytes an bestimmte STellen geschrieben werden.
Also nichts mit Dateien

Mittlerweile hab ich ein anderes Problem: Meine Win-32-Konsolenprogramme laufen nicht unter FreeDOS. Hab es fast befürchtet, aber ich dachte mir, dass aufgrund der fehlenden GUI DOS keine Probleme hat... Hab mich geirrt.
Ich benutze Visual Studio 2008, falls das hilft.
-
Du brauchst halt einen Compiler für DOS. Mit Visual Studio kommst du da nicht weiter.
Dieser hier tuts: http://www.htsoft.com/products/compilers/PACIFICc.php
Andernfalls such mal. Die alten Turbo C++ Compiler von Borland gibt es mittlerweile kostenlos zum runter laden. Oder du schreibst direkt alles in 16Bit Assembler.
-
Mich wuerde spontan interessieren, warum du direkt den Inhalt einer Festplatte manipulieren moechtest.
-
Oj ja, hab's jetzt gesehen.Die Frage bleibt, warum du per Hand eine Patition erstellen moechtest,das ist Aufgabe des Betriebsystems.
-
Hm ich hab hier eine etwas ungenaue Anleitung, die mir sagt, dass ich die Festplatte, um sie zu partitionieren, mit einer gewissen Bytefolge an einer bestimmten Adresse beschreiben muss. Dort wird das händisch mittels eines Hex-Editors gemacht. Ansich kein Problem, ich wollts halt so, dass man unter DOS ein Programm startet, welches das dann alles macht, so dass man da nichts mehr manuell machen muss...
Hab mir mal einen TCPP besorgt... Bis jetzt klappts ganz gut...
-
So, meine Programme funktionieren jetzt unter DOS.
Ich hab allerdings immernoch ein Problem, nämlich genau das lesen und schreiben an bestimmten Sektoren...
Ein Ansatz war der, mit fopen die Festplatte als solche zu öffnen (siehe oben), ist aber eher unvorteilhaft, weil ich an bestimmte Sektoren muss, und vermutlich muss ich noch eine Ebene tiefer (Byte- und nicht Dateiebene).Also hab ich versucht, das mit Softwareinterrupts zu erledigen (int86 und int86x), sieht folgendermaßen aus:
#define DRIVE 0 // 0=A, 1=B, 2=C, etc. #define SECTOR 1 unsigned int far *out; // Zeiger auf auszugebende Daten unsigned int far *input; // Zeiger auf einzulesende Daten unsigned int output; // auszugebende Daten union REGS inreg, outreg; struct SREGS sreg; void main(void) { output=11; out=&output; inreg.h.al = DRIVE; // auf DRIVE schreiben inreg.x.cx = SECTOR; // SECTOR schreiben (Anzahl) inreg.x.dx = 1; // logischer Sektor: 1 sreg.ds = FP_SEG(out); // Segmentadresse von out feststellen inreg.x.bx = FP_OFF(out); // Offsetadresse von out feststellen outreg.x.ax = 0; int86x (0x26, &inreg, &outreg, &sreg); // lesen: inreg.h.al = DRIVE; // von DRIVE lesen inreg.x.cx = SECTOR; // SECTOR Sektoren lesen inreg.x.dx = 1; // logischer Sektor 1 sreg.ds = FP_SEG(input); inreg.x.bx = FP_OFF(input); outreg.x.ax = 0; int86x (0x25, &inreg, &outreg, &sreg); printf ("%u wurde gelesen\n", *input);Ich weiß allerdings nicht, wo das hingeschrieben wird (hab mir mit einem Hex-Editor den ersten Sektor angeschaut, steht aber nichts dort). In den Kommentaren beim Code steht auch "logischer" Sektor, nicht physikalischer. Ich hab mir diesen Code bei MS kopiert, dort steht auch kaum Dokumentation, insbesondere zu den int86-Interruptnummern (was zu übergeben ist etc.)
Ein weiterer Ansatz war, die Festplatte wieder mit einem File-Pointer zu adressieren und diese Adresse dann mit peekb weiterzuverwenden (peekb liest ein Byte an einer Adresse, zerlegt in Segment und Offset).
peekb liest allerdings, angewendet auf die Adresse im Pointer auf die Festplatte, ziemlichen Mist aus, der nicht dem entspricht, was am Anfang der Festplatte steht.
Hier der Code:unsigned char rwert; // Rueckgabewert unsigned long int i=0; unsigned long int offs; unsigned long int segm; FILE * fp; fp = fopen("\\\\.\\C:", "rb"); offs=FP_OFF(fp); segm=FP_SEG(fp); for(i=0; i<256; i++) { rwert = peekb(segm, offs+i); printf("%02x ", rwert); if ( ((i+1)%16)==0) printf("\n"); }Ich bin jetzt mit meinem Latein am Ende, hab keine Ahnung, welchen Ansatz ich wie weiter verfolgen soll....
-
Also ich glaube ja, dass dich die C-Routinen (fopen, etc.) nicht weiter bringen unter DOS. Zumindest, was den RAW-Zugriff angeht.
Suche mal unter folgenden Stichworten: Google: bios interrupt 13h
Einfache Assembler Kenntnisse vorausgesetzt. Btw. welchen C-Compiler für DOS hast du jetzt rausgesucht?Was mir noch bei deinem ersten Code aufgefallen ist, dass du den Sektor 1 beschreibst, aber du willst Sektor 0 beschreiben, oder?
-
Bisschen Assembler krieg ich hin.
Der erste Sektor ist Sektor 1, weil bei den Sektoren die Zählung erst bei 1 anfängt, anstatt bei 0, soweit ich weiß (steht in einer Art Skript von der Uni, hab das auch woanders mal gelesen).
Also "Programmierumgebung", also auch Compiler, benutz ich TCPP3.0Das Gedöns mit Interrupt 13 hört sich sehr brauchbar an, danke!
Ich hab noch einen anderen Ansatz mit Debug... wird in eine .BAT-Datei geschrieben und die wird dann ausgeführt... Mal sehen.
-
Geht bei Windows mit Bordmitteln: DOS-Box und debug.exe.
-
Dieser Thread wurde von Moderator/in evilissimo aus dem Forum C++ in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Unter Windows geht das schonmal garnicht, weil Windows alle Festplattenzugriffe dieser Art abblockt.
debug kann meines Wissens nach nur RAM byteweise editieren, außerdem hab ich das Problem, dass die Platte nicht auf eine Art formatiert ist, die DOS versteht. debug scheidet also aus.
-
Du scheinst Recht zu haben. Die Sektorzählung beginnt bei 1. Was ich seltsam finde.
-
Schau dir mal unter http://members.inode.at/anton.zechner/az/
das Programm DiskViewer an.(Menü-->Berarbeiten->Schreibschutz)