USB Speicher Bit für Bit überschreiben



  • Hey Leute,
    ich bin ein blutiger Anfänger in C und bin auch
    neu hier also bitte ich um Nachsicht wenn diese
    Frage "dumm" ist.

    Also zu meiner Frage:
    Wie ist es möglich den Speicher eines USBs Bit
    für Bit zu überschreiben?
    Muss ich dazu eine Datei erstellen die voll mit
    1en und 0en ist oder gibt es eine Möglichkeit
    direkt auf den Speicher zuzugreifen und ihn
    sozusagen zu manipulieren.

    mfg
    Raavgo


  • Mod

    Aus Sicht eines C-Programms existieren nur Dateien. Genauere Ansteuerung von speziellen Geräten musst du mit Betriebssystemfunktionen machen (welches Betriebssystem?). Wichtige Gegenfrage: Warum möchtest du das tun? Das klingt als wolltest du etwas programmieren, was es bereits tausendfach und in besser gibt.



  • Raavgo schrieb:

    Wie ist es möglich den Speicher eines USBs Bit
    für Bit zu überschreiben?

    Die kleinste Einheit in C ist "char". Das besteht aus mehrern Bits. Um Bits zu manipulieren musst du also zuerst ein Datenwort lesen, dann die Bits ändern und dann zurückschreiben.
    Pseudocode:

    // Bit 5 setzen
    byte = readbyte()
    byte |= (1<<5)
    writebyte (byte)

    // Bit 5 löschen
    byte = readbyte()
    byte &= ~(1<<5)
    writebyte (byte)

    Die mittleren Zeilen sind C-Syntax.



  • SeppJ schrieb:

    Aus Sicht eines C-Programms existieren nur Dateien. Genauere Ansteuerung von speziellen Geräten musst du mit Betriebssystemfunktionen machen (welches Betriebssystem?). Wichtige Gegenfrage: Warum möchtest du das tun? Das klingt als wolltest du etwas programmieren, was es bereits tausendfach und in besser gibt.

    Es stimmt schon das es das tausendfach gibt und wahrscheinlich auch 100 mal besser als meins aber ich möchte verstehen wie sowas zu bewerkstelligen ist. Ich bin mir sicher das es den Hamilton Algorithmus auch 1000 mal gibt dennoch kommt kein C Programmierer darum herum wenn das "Bit schubsen" verstehen möchte. Meine OS sind Backtrack5(Basierend auf Ubuntu 10.4) und Win7. Hab aber auf meiner Virtual Maschine auch Win 8 und Ubuntu 12.10.

    Also geht das direkte ansprechen nicht mit C?


  • Mod

    Raavgo schrieb:

    Also geht das direkte ansprechen nicht mit C?

    Kommt drauf an, was du mit "direkt" meinst. Weiterhin ist mir unklar, was du überhaupt lernen möchtest. Unter Linux würdest du einfach die entsprechende Gerätedatei öffnen und reinschreiben oder, wenn es richtig low-levelig werden soll, ioctl benutzen. Das erste ist nicht sonderlich spannend und für das zweite … nun, wenn du solche Fragen stellen musst, dann ist das zweiter eher nichts für dich. Unter Windows wird es ähnliche Möglichkeiten geben, sie heißen bloß anders.



  • Unter der Annahme, dass du sowas wie USB-Massenspeicher meinst:

    int main(int argc, char **argv)
    {
    	int c;
    	FILE *f = fopen(argv[1] ? argv[1] : "/dev/stdout", "w");
    	assert(f);
    
    	for (c=0; fputc(c, f) != EOF; c^=1);
    
    	fclose(f);
    	return 0;
    }
    

    Das Programm schreibt abwechselnd 0- und 1-Bytes (nicht Bits) in die als Argument gegebene Datei (oder nach Stdout). Aufruf dann z.b. als

    ./a.out /dev/sdc
    

    oder unter welcher Gerätedatei auch immer dein USB-Stick verfügbar ist. Die Assertion könntest du selbstverständlich noch durch anständiges Errorhandling ersetzen. Außerdem solltest du als erstes überprüfen ob der Code überhaupt richtig ist und tut was du willst.


Anmelden zum Antworten