banner
Nachrichtenzentrum
Unser Versprechen ist es, kompetente Technologie und Lösungen zu liefern, die zuverlässig und effizient sind.

Logikanalysatoren: Die Geheimnisse des Raspberry Pi erschließen

Sep 02, 2023

Heute möchte ich ein Tool hervorheben, das Ihre Hacking-Fähigkeiten auf ein völlig neues Niveau bringt, und das, ohne Ihr Budget zu sprengen – tatsächlich, wenn man bedenkt, wie viel Debugging-Zeit Sie sparen können, wie viele unterhaltsame Aufgaben Sie freischalten können, und den zahlreichen Funktionen, die Sie hinzufügen können, ist dies möglicherweise eines der günstigsten Tools, die Sie bekommen werden. Ganz gleich, ob es darum geht, seltsame Probleme zu debuggen, Ihren Code zu optimieren, ein Gerät zu durchsuchen, das Sie rückentwickeln möchten, oder vielleicht zu versuchen, die Open-Source-Bibliothek einer anderen Person zu verstehen, Sie werden wahrscheinlich viel verpassen, wenn Sie keinen Logikanalysator zur Hand haben !

Es bricht mir das Herz, dass einige Hacker immer noch nicht wissen, welchen Wert ein Logikanalysator bietet. Die taktische Anwendung eines Logikanalysators hat mir immer wieder geholfen, eine völlig andere Perspektive auf etwas zu sehen, das ich gehackt habe, und genau das möchte ich heute demonstrieren.

Ein Logikanalysator verfügt über eine Reihe digitaler Eingänge und liest kontinuierlich den Status dieser digitalen Eingänge, sendet ihn an Ihren Computer oder zeigt ihn auf einem Bildschirm an – es ist wie ein reines Logikpegel-Oszilloskop. Wenn Sie einen I2C-Bus mit einer MCU haben, die einen Sensor steuert, schließen Sie einen Logikanalysator an die Takt- und Datenpins an, verkabeln Sie die Masse, starten Sie die Logikanalysator-Software auf Ihrem Computer und sehen Sie, was tatsächlich passiert.

Sind Ihnen zum Beispiel schon einmal die ID_SC- und ID_SD-Pins am GPIO-Anschluss des Raspberry Pi aufgefallen? Fragen Sie sich, wofür sie sind? Möchten Sie nicht überprüfen, was tatsächlich auf diesen Pins passiert? Lasst uns das jetzt tun!

Ich verwende einen 10-Dollar-Logikanalysator, den Sie bei Aliexpress oder Amazon bekommen können, einen Laptop und einen Raspberry Pi mit einer SD-Karte und einem Netzteil. Hier ist alles verkabelt – Sie benötigen nur drei Buchse-Buchse-Kabel, zwei Signale und eine Masse. „SD“ und „SC“ klingen wie I2C – die typische I2C-Frequenz beträgt normalerweise entweder 100 kHz oder 400 kHz. Eine gute Faustregel besteht darin, die Frequenz auf das Drei- oder Vierfache der Taktfrequenz des Datenstroms einzustellen, den Sie erfassen möchten. Daher habe ich vor, die Abtastrate meines Logikanalysators auf 2 MHz einzustellen. Wenn sich herausstellt, dass es zu langsam ist, um mit den übertragenen Daten Schritt zu halten, kann ich die Abtastrate erhöhen und die Abtastung einfach erneut durchführen.

Die Software, die ich verwende, ist Pulseview – es ist eine wunderbare grafische Benutzeroberfläche für Logikanalysatoren und kann mit einer Vielzahl von Logikanalysatoren verbunden werden. Es ist Open-Source, Linux-freundlich, hackbar und verfügt über eine gute UX, auch wenn es nicht kürzlich gepflegt wurde. Sie können es aus dem Repository Ihrer Distribution installieren oder die EXE-Datei herunterladen, wenn Sie Windows verwenden. Wenn der Logikanalysator angeschlossen ist, schließe ich ihn an meinen USB-Anschluss an, starte Pulseview, stelle die Abtastrate und die Lesedauer ein, die unendlich sein kann, deaktiviere alle Kanäle außer den beiden, die mich interessieren, drücke auf „Capture“ und schließe den Pi an an die Macht.

Nachdem ich den Pi angeschlossen habe, steigen die Logikpegel an beiden Pins an, da eine Spannung von 3,3 V anliegt – und nach ein paar Sekunden kommt es zu einem kurzen Aktivitätsschub an diesen beiden Pins. Wenn man hineinzoomt, sieht die Aktivität tatsächlich wie I2C aus – und in Pulseview ist sie ganz einfach zu entschlüsseln! Klicken Sie auf die Schaltfläche „Protokolldecoder“ in der Einstellungs-Taskleiste, geben Sie „I2C“ auf Ihrer Tastatur ein, wählen Sie den I2C-Decoder aus, doppelklicken Sie dann auf das Decoder-Tag auf der linken Seite und wählen Sie aus, welche Kanäle SCL und SDA sind – es ist leicht zu erkennen, dass SCL aussehen wird wie ein Taktsignal mit gleichen Höhen und Tiefen, während die hohen und niedrigen Intervalle bei SDA variieren; Im Bild oben ist D1 SCL und D0 SDA. Wenn wir uns die entschlüsselten I2C-Ereignisse genauer ansehen, können wir sehen, dass es sich bei dieser Aktivität um I2C-Anfragen zum Lesen von Daten von der Adresse 0x50 handelt. Auf diese Anfragen folgen NACK-Ereignisse (rote Markierung), was bedeutet, dass sie keine Antwort erhalten.

Wenn Sie sich nun mit dem HAT-Design des Raspberry Pi befasst haben, können Sie bereits vermuten, dass diese I2C-Anfragen vom Raspberry Pi-Bootloader kommen, der nach dem I2C-EEPROM sucht, das On-HAT-Geräteinformationen enthält, damit der Pi das Gerät laden kann Baum-Overlay-Daten daraus und verwenden Sie diese Daten, um jegliche Hardware auf dem angeschlossenen HAT zu konfigurieren. Sie müssen sich nicht auf die wenigen online verfügbaren Informationen zu diesem Prozess verlassen – mit einem Logikanalysator können Sie untersuchen, was tatsächlich passiert, versteckte Funktionen und Vorbehalte finden, sodass selbst proprietäre Hardware für Sie kein Hindernis mehr darstellt wie möglich.

Dies ist ein einfaches Beispiel dafür, was Sie mit einem Logikanalysator und einem Raspberry Pi mit einem 40-Pin-Header machen können. Lasst es uns auf Hochtouren bringen! Allein auf dem Pi-Board kommt I2C an verschiedenen Stellen zum Einsatz – HDMI-Displaykonfiguration, Pi-Kamerakonfiguration, ein GPIO-Expander auf dem Pi 3, der fehlende IOs auf der CPU ausgleicht – davon gibt es genug. Sie können all dies zum Spaß erkunden, aber lassen Sie uns ein tatsächliches praktisches Ziel erreichen.

Was könnte man mit all dem I2C machen? Nun, hier ist ein kleines, aber situatives Problem mit den Raspberry Pi-Kameras: Sie sind nicht Hotplug-fähig; Und eines wissen wir mit Sicherheit: Sie müssen die Grenzen Ihrer Technologie nicht immer respektieren. Möglicherweise möchten Sie Ihre Pi-Kamera beispielsweise nicht immer an einem Kabel herumhängen lassen – das ist etwas unterdurchschnittlich, es ist fair, die Kamera nur dann angeschlossen zu haben, wenn Sie tatsächlich ein Bild aufnehmen möchten. Nun können wir tatsächlich überprüfen, was auf dem I2C-Bus der Kamera passiert, und wenn das der Übeltäter ist, klingt die Hotplug-Fähigkeit genau so, wie wir es schaffen könnten – außerdem werden wir gegen die proprietäre Firmware kämpfen der Pi dabei!

Technisch gesehen erkennt die Pi-Firmware eine Pi-Kamera nur, wenn sie beim Booten angeschlossen ist – der Closed-Source-Bootloader prüft das Vorhandensein der Kamera während des Bootens, was sicherlich eine Kommunikation über I2C impliziert, vielleicht setzt er sogar einige kameraspezifische I2C-Register; Wenn Sie beim Booten keine Kamera angeschlossen haben, passiert das nicht und Sie müssen Ihren Pi neu starten, damit die Kamera funktioniert. Aber nach dem Booten können Sie die Kamera ausstecken und wieder anschließen, und es wird wieder einwandfrei funktionieren!

Angesichts dieses Rätsels vermute ich, dass es wirklich keinen Grund gibt, warum eine Pi-Kamera nicht funktionieren könnte, wenn sie früher angeschlossen wird, abgesehen von der unflexiblen On-Boot-Erkennungslogik. Der Standard-FPC der Kamera ist auch mechanisch nicht Hotplug-fähig, daher werde ich dies umgehen, indem ich den FPC so modifiziere, dass die GND-Pins zuerst Kontakt herstellen, wenn Sie ihn per Hotplug anschließen. Das Hauptproblem bleibt jedoch bestehen: Der Pi-Bootloader ist Closed-Source und wir können die Erkennungslogik nicht ändern, sodass er nur dann ausgeführt wird, wenn die Software tatsächlich versucht, auf eine Kamera zuzugreifen. Wir können es jedoch hacken, indem wir unsere eigene MCU an diesen I2C-Bus anschließen und sie als Kamera auf dem I2C-Bus präsent machen!

Hier ist die Roadmap: Wir verbinden den Logikanalysator mit dem I2C-Bus der Pi-Kamera, sehen, welche Art von Aktivität beim Hochfahren des Pi passiert, und fügen dann eine MCU hinzu, die die I2C-Pins der Kamera anzapft – ein RP2040 reicht in dieser Hinsicht gut aus Es kann als I2C-Peripheriegerät fungieren. Die Hardware, die für einen solchen Hack benötigt wird, ist minimal – eine Mikrocontroller-Platine und ein paar Überbrückungsdrähte, das ist alles.

Nachdem ich die Pullup-Widerstände des Kamera-I2C-Busses auf einem Pi Zero angelötet habe, habe ich die I2C-Kommunikation beim Booten mit angeschlossener v1-Kamera erfasst, und hier sind meine Ergebnisse. Beim Booten werden drei I2C-Adressen abgefragt – 0x10, 0x1a und 0x36, meine Kamera antwortet auf 0x36. Anscheinend wird 0x10 für den Sensor der Pi-Kamera v2 verwendet, und ich vermute, dass 0x1a die 12-MP-Kamera ist.

Bei der von mir verwendeten 5-MP-Kamera v1 wird nichts in die Register geschrieben – es scheint, dass es nur drei Transaktionen gibt, die aus den Registern des Kamerasensors lesen, wobei jede Transaktion zuerst zwei Schreibbytes sendet, was bei solchen Transaktionen normalerweise eine Registeradresse ist. Da die Registeradressen aus zwei Bytes bestehen, sehen diese Transaktionen etwas seltsam aus! Allerdings glaube ich, dass die Möglichkeit, die Kamera ohne Probleme aus- und wieder einzustecken, kein Problem darstellen sollte.

Jetzt, da ich weiß, was unter der Haube passiert, werde ich die drei Überbrückungskabel vom Logikanalysator abziehen, sie an eine kleine RP2040-Platine anschließen, die ich habe, und mich an die Softwareseite des Projekts machen. Wenn ich die Firmware zur I2C-Peripherie-Emulation in Betrieb nehmen kann, ist der Hotplug der Pi-Kamera v1 für alle meine tragbaren Gerätebauzwecke betriebsbereit! So haben wir mit einem Logikanalysator und drei Drähten eine Möglichkeit gefunden, der Raspberry Pi-Kamera Hotplug-Fähigkeit hinzuzufügen – etwas, das als unmöglich galt, bis wir beschlossen, es auszuprobieren.

Bei dieser Art von Hack ist ein Logikanalysator das beste Werkzeug für die Aufgabe, und Sie haben vielleicht bemerkt, dass einige entscheidende Teile dieses Hacks, nämlich das Aufspüren der übertragenen I2C-Daten, ohne einen Logikanalysator nicht durchführbar sind.

Es gibt Ihnen auch Einblicke in die Funktionsweise proprietärer Dinge – sowohl im HAT-EEPROM-Erkennungsbeispiel als auch im Kameraerkennungsbeispiel können wir sehen, dass jede fehlgeschlagene Transaktion dreimal wiederholt wird, und Sie würden nicht falsch liegen, wenn Sie vermuten, dass es sich um den Raspberry Pi-Bootloader handelt Der Code verfügt über einen I2C-Transaktions-Wrapper, der I2C-Transaktionen wiederholt, falls eine Transaktion fälschlicherweise fehlschlägt – eine durch und durch gute Praxis!

Denken Sie über die Anschaffung eines Logikanalysators nach? Die Analysegeräte sind für das, was sie sind, großartig und reichen für die meisten Aufgaben aus. Auf typischen Online-Marktplätzen kosten sie etwa 10 US-Dollar – mehr als genug für alle Dinge, die Sie untersuchen möchten. Sie können auch einen Pi Pico als Logikanalysator verwenden – allerdings werden Sie feststellen, dass Sie Pulseview und die Software unter der Haube wahrscheinlich selbst kompilieren müssen, um dies zu unterstützen. Dies ist machbar, aber weniger einfach als die Verwendung eines FX2-basierten Analysatoren mit serienmäßiger Pulseview-Unterstützung.