Hallo Community,
ich beschäftige mich schon seit Wochen mit dem Thema SD-Card und Arduino und finde das alles extrem spannend. Ich möchte kurz meinen aktuellen Stand beschreiben und dann zu meiner eigentlichen Frage übergeben.
Und zwar möchte ich eine eigene CID auf die Karte schreiben. Ich habe gelesen das dies mit einigen Modellen der Samsung Evo+ 32GB möglich sein soll. Normalerweise sind SD-Karten ja dagegen gesichert. Aber nicht durch Hardware, sondern durch im Flash hinterlegte Sicherheits-Bits. Manche in Korea hergestellte und besonders die älteren Karten haben aber wohl eine Backdoor drin. Hierzu sendet man bestimmte Vendor-Commands an die Karte. Dabei wird ein interenes Sicherheitsregister zurückgesetzt und man soll die 16 Byte lange CID mit einer eigenen beliebigen Bytefolge beschreiben können.
Als Hardware habe ich ein einfaches SD-Card Interface mit Pegelwandler besorgt. Der Schaltplan dazu ist überall im Netz verfügbar.
Dann begann ich mit der Programmierung. Zuerst stand die Auswahl einer geeigneten SD-Library. Die Auswahl ist riesig. Zu guter Letzt habe ich mich für die von Arduino mitgelieferte SD-Lib entschieden. Die musste ich an ein paar Stellen modifizieren, sodass ich die cardCommand() Funktion auch mit der Sd2Card-Instanz aufrufen konnte. Die Lib selbst hat sicher viel viel mehr drin als ich brauche, aber optimieren kann man später ja immer noch.
Tatsächlich hatte ich nach kurzer Zeit schon ein vollständiges CID vor Augen:
Card type: SDHC
MID: 0x1B
OID: SM
PNM: 00000
PSN: 3842268485
MDT: 9/2015
CRC: 0x34
CID: 0x1B, 0x53, 0x4D, 0x30, 0x30, 0x30, 0x30, 0x30, 0x10, 0x45, 0x5D, 0x04, 0xE5, 0x00, 0xF9, 0x69
Lesen klappt also schonmal! Die Software im Arduino sendet dazu ein CMD10 an die SD-Card, was soviel bedeutet wie "Sende mir die CID-Bytes". Diese sendet als Antwort die 16 Bytes, welche man dann noch gemäß Spezifikation auswerten muss. Voilá.
So motiviert wollte ich nun wissen ob das mit der Backdoor stimmt. Es gibt im Netz zahlreiche Implementation für diesen Hack. Diese sind meist für Andriod-Smartphone/Tables gebaut. Das Problem ist nämlich das sämtliche USB-Card-Reader dieses Kommando nicht unterstützen. Hier braucht man also eine direkte Verbindung vom uC zur SD-Card, was im Fall des Arduino ja perfekt funktioniert.
Ich habe den Backdoor-Quellcode in Arduino SD-Lib Kommandos übertragen und tatsächlich eine o.g. Samsung-Karte gefunden, welche das Hintertürchen öffnet. Als nächstes müsste man ein CMD26 senden (Write CID to card) und die neue CID senden. Und genau hier komme ich nicht mehr weiter, denn dafür enthält die SD-Lib keinerlei Unterstützung.
Hier setzt meine Frage an: Wie muss eine "writeCID()" Funktion (analog zur "readCID()" der SD-Lib) aussehen? Die SD-Lib hat nur eine writeBlock-Funktion welche aber eigentlich für Nutzdaten ist und immer 512 Bytes am Stück überträgt.