Im Rahmen unserer “Fridolin Online”-Artikelserie gibt es diesmal einen Bericht über das Hacken der Firmware einer Canon Kamera.
Die Canon PowerShot A480-Digitalkamera ist im Frühjahr 2009 auf den Markt gekommen und wurde schon im Vorhinein eher im unteren Preisbereich angesiedelt. Dies ist durch die nicht unbedingt weltbewegende Hardwareausstattung, Verarbeitung und Funktionalität auch gut begründbar. Das “Feature”, welches jedoch zum Kauf angeregt hat, war die Existenz des CHDK-Projektes.
CHDK (kurz für “Canon Hack Development Kit”) ist ein inoffizielles Firmware-Addon für mittlerweile über 50 Canon-Digitalkameras, welches unter der freien GPL-Lizenz steht. CHDK ergänzt die Funktionalität der unterstützten Kameras um Möglichkeiten wie Scripting, die Fernsteuerung der Kamera über den USB Anschluss, eine Uhr, eine Temperaturanzeige und eine genauere Akku-Anzeige in Prozent. Außerdem wird das Einstellen diverser Parameter, wie Belichtungszeit, Blende und Fokus über die Grenzen der herkömmlichen Firmware hinaus ermöglicht. Für Leute, die auf ihrer Digitalkamera schon immer einen Kalender oder Spiele wie “Reversi”, “Sokoban” oder “4 Gewinnt” vermisst haben, ist CHDK mit Sicherheit auch einen Blick wert.
Da jedoch zum Zeitpunkt des Kaufs die A480 nicht unterstützt war, wandelten sich die Erwartungen an die Kamera ein wenig. Der Wunsch nach Scripting und minutenlangen Belichtungszeiten rückte in die Ferne, viel wichtiger wurde es, CHDK darauf zum Laufen zu bringen, also zu portieren.
Das Portieren von CHDK besteht aus mehreren Schritten. Da CHDK keine eigenständige Firmware ist, sondern sich in die bestehende Firmware zur Laufzeit “einhängt”, ist sie nicht nur vom Kamera-Modell, sondern auch von der Firmwareversion abhängig. Daher muss im ersten Schritt die Firmwareversion ermittelt und zu Analysezwecken beschafft werden.
In weiteren Schritten folgt dann die eigentliche Analyse der Firmware, durch die Speicheradressen von wichtigen Funktionen, ebenso wie notwendige Startsequenzen bekannt werden. Diese Adressen und Startsequenzen werden verwendet, um den firmwareabhängigen Teil von CHDK zu schreiben. Dabei müssen bestimmte Kameramerkmale, wie Knöpfe, Regler und LEDs berücksichtigt werden.
In diesem Artikel beschränke ich mich auf den ersten Schritt, das Ermitteln der Firmwareversion und die Extraktion der Firmware aus der Kamera.
Um die Firmwareversion einer mit CHDK kompatiblen Kamera herauszufinden, muss eine Datei mit dem Namen „ver.req“ bzw. „vers.req“ im Root- Verzeichnis der Kameraspeicherkarte, in meinem Fall eine stinknormale 2GB SD-Karte, erstellt werden. Die Existenz dieser Datei ermöglicht es, durch eine Tastenkombination detaillierte Information zur Firmwareversion/Kamera abzurufen (A480: “FUNC/SET” + „Mistkübel/Timer“- Taste). Zum Beispiel kann man auch herausfinden, wie viele Fotos schon geschossen wurden.
In meinem Fall, diente dieser Test jedoch eher dazu, um zu sehen ob die Standard-Firmwareextraktionsmethoden überhaupt eine Chance haben. Normalerweise braucht man die Firmwareversion nur dann ermitteln, wenn man ein fertiges CHDK installieren möchte und nicht weiß, welche Version man hat.
Mit der Sicherheit, dass Canon bei der A480 das Firmwarerad nicht neu erfunden hat, bestand die nächste Herausforderung darin, ein kleines Programm auf der Kamera zum Laufen zu bringen. Da die A480, wie die meisten anderen Kameras, einen ARM-Prozessor hat, war es nicht sehr schwer, ausführbaren Code dafür zu kompilieren.
Das eigentliche Problem war, dass man im Allgemeinen nicht wissen kann, ob ein Programm überhaupt läuft, wenn es keine Ausgaben tätigt, insbesondere nicht, wenn es nicht ganz klar ist, wo man den ausführbaren Code hinstellen muss, damit ihn die Kamera über die Speicherkarte “aufnimmt”.
In so einem Fall ist die Standardlösung der CHDK-Leute, nach LEDs zu “suchen”. Das Programm schreibt einen bestimmten Speicherbereich mit dem “Licht auf!”-Wert (0x46) voll. Wenn eine LED zu leuchten beginnt, zum Beispiel die AF-LED oder eine der Status-LEDs, dann läuft das Programm.
Programme kann man entweder über eine “Debug”-Speicherkarte einspielen, deren Boot-Sektor einen bestimmten String enthält, oder über eine speziell verschlüsselte und signierte Firmware-Update-Datei. Bei der A480 trug die zweite Option Früchte, denn nach vielen Versuchen, leuchtete dann endlich der Blitz auf.
Nachdem ich also festgestellt habe, dass man Code ausführen konnte, musste ich nur mehr Firmware extrahieren. Aber wie bekommt man 4MB aus einem Gerät heraus, bei dem man nur den Blitz ansteuern kann?
Obwohl die Firmware aus dem Speicher lesbar war, konnte keine Funktionssignatur gefunden werden, mit der man die Firmware auf die Speicherkarte schreiben konnte. Anstatt nach einer solche Funktion zu suchen, wurde die etwas “anspruchsvollere” Option gewählt, die Firmware über Blinksignale auszugeben. Der Blitz war dafür eher ungeeignet, da er nach dem Auslösen eine zu lange Aufladedauer hatte. Also suchte ich mir eine LED und gab die Firmware Bit für Bit als Abfolge von Blinksignalen mit 500 Bytes pro Sekunde aus.
Wie findet man eine LED-Adresse?
Eine LED-Adresse findet man am schnellsten mittels binärer Suche. Die Anfangsmenge von etwa 100 000 Adressen teilt man in zwei Bereiche und lässt alle Adressen im unteren Bereich “aufleuchten”. Leuchtet die LED, so befindet sich ihre Adresse im unteren Bereich, sonst im Oberen. Dies wiederholt man mit dem eingeschränkten Adressbereich, bis nur eine Adresse übrig bleibt.
Die LED in Viertel-Millisekundentakt ein- oder auszuschalten war relativ einfach. Das Signal musste jedoch auch am Computer empfangen werden. Dazu fiel die Wahl auf einen Fototransistor, verbunden via Audiokabel mit dem Mikrofoneingang des Computers, was mich etwa 2€ kostete. Der dazugehörige Demodulator wurde in Python geschrieben und verwendete die freie GStreamer-Audio-Library um die Signale zu lesen. Die Bytes, die ja mittlerweile Audiosignale waren, da sie über den Mikrofoneingang eingespielt wurden, konnten mit diesem Demodulator umgewandelt und auf die Festplatte geschrieben werden.
Zur Sicherheit wurden auch Checksums mit übertragen und erstaunlicherweise klappte die Checksum-Überprüfung in allen Fällen. Nun hatte ich eine Kopie der Firmware!
Seit März gibt es, dank der Community, auch für die A480 eine Beta-Version von CHDK.