Reverse Engineering elektrisches Gesims AM82TV

Ich habe ein paar elektrische Akko-Gardinenstangen - AM82TV. Dieses Modell hebt sich von seinen Brüdern durch die umfassendsten Verwaltungsschnittstellen ab. Die Vorhänge können per Funk gesteuert werden, es gibt „trockene Kontakte“, phasenweise (durch Kurzschließen der Steuerleitungen zum Netzwerk). Es gibt eine RS485-Schnittstelle - dies ist, wenn Sie die Vorhänge mit dem „Smart Home“ verbinden möchten. Sie können die Vorhänge auch öffnen / schließen, indem Sie sie einfach mit der Hand in die gewünschte Richtung ziehen. "Out of the Box" fehlt vielleicht nur die webbasierte Oberfläche, na ja, und MQTT.

Ich hatte lange Zeit elektrische Gardinenstangen, die zuverlässig funktionierten, aber von Zeit zu Zeit tauchte der Wunsch auf, sie zu zerlegen - aus Neugier, zu sehen, was sich darin befindet und ob es möglich ist, einen ESP8266 (oder ESP32) einzubauen, um die fehlenden hinzuzufügen. Sie können natürlich alles von außen verbinden, aber es ist besser, wenn das Erscheinungsbild gleich bleibt und alles innen verborgen ist.

Reparieren Sie nicht, was nicht kaputt ist - hier geht es nicht um mich. Zuerst habe ich versucht, schlechte Ideen von mir zu vertreiben, aber mit der Zeit verstärkte sich der Juckreiz und jetzt kam der Moment, in dem es bereits unmöglich war, dagegen anzukämpfen. Ich nahm den Motor von der Traufe und zerlegte ihn. Die Erstinspektion sollte Antworten auf zwei Fragen geben: Ist Platz für den ESP8266 und kann das eingebaute Netzteil verwendet werden? Alles wurde einfach geregelt. Es reicht aus, einige Schrauben von den Enden des Motors zu lösen. Das einzige ist, dass die Schlitze der Schrauben nicht mit einem Schraubendreher hergestellt werden, sondern mit einem Torx-Inbusschlüssel. Danach können Sie den Inhalt extrahieren - einen Kollektormotor in einem Gehäuse mit einem Getriebe und einem Motorwellensensor, einem 24-Volt-Netzteil und einer Steuerplatine.

Es gibt einen Platz für ESP, das Netzteil ist für einen leistungsstarken Motor ausgelegt und bemerkt keine kleine zusätzliche Last. Ich begann über die Steuerplatine nachzudenken und Gedanken über ESP traten in den Hintergrund - der atmega168-Mikrocontroller war das Herzstück der Platine. Wenn es auf der Platine keine Kontakte für die Installation des ISP-Steckers (In-Circuit-Programmierschnittstelle des Mikrocontrollers) gäbe, würde mich das nicht aufhalten, aber sie waren da. Damit du mich richtig verstehst, bin ich überhaupt kein Fan von avr. Ich habe keinen Programmierer und keine einzige Codezeile für atmega-Mikrocontroller geschrieben. Ich brauchte dringend einen Programmierer, um zu versuchen, die Firmware zu lesen, aber es war abends und es gab momentan keine Möglichkeit, etwas im Laden zu kaufen. Um nicht bis zum Morgen zu warten, habe ich den Gromov-Programmierer zusammengebaut. Dann löte er den ISP-Stecker auf die Steuerplatine, schloss den Programmierer an und versuchte, die Firmware zu lesen - und sie wurde gezählt.

Es ist unmöglich zu versuchen, etwas in der Firmware des Mikrocontrollers zu verstehen, ohne den Schaltplan zu verstehen. Daher habe ich auf einer Leiterplatte die Schaltung wiederhergestellt. Ich muss nicht oft Diagramme zeichnen. Um nicht die Elemente zu zeichnen, die sich auf der Tafel befinden, sondern nicht in der Standardbibliothek, habe ich in easyeda ein Diagramm gezeichnet. Ja, es stellt sich nicht nach GOST heraus (aber der Mikrocontroller ist wie in der Dokumentation gezeichnet, was praktisch ist). Ein Fragment reicht zum Verständnis aus:



Im Folgenden sind die meisten Bilder anklickbar.

Wenn Sie möchten, können Sie sich mit dem vollständigen Schema vertraut machen.

Danach war ich bereit, die Firmware zu recherchieren. Die einfache Übersetzung von Maschinencodes in Assembler-Mnemonik reicht für die Analyse nicht aus. Sie müssen den Status der Register und des Speichers an jedem Punkt im Programm anzeigen. Leider ist das Debuggen auf dem Mikrocontroller selbst mit atmega168 nicht möglich, aber Sie können die Firmware in den Simulator laden. Es ist nicht sehr praktisch, wenn Sie das echte Eisen der Mikrocontroller-Umreifung "fühlen" möchten, aber lassen Sie uns mit dem auskommen, was wir haben. Ich habe Atmel Studio 7 nicht installiert. Ich entschied, dass ein kompakteres AVR Studio 4 ausreichen würde. Im Prinzip reicht ein Studio für die Analyse aus, aber es ist möglich, einige der Routinevorgänge auf andere Software zu übertragen. Im März wurde das Reverse Engineering- Tool Ghidra veröffentlicht. Ich brauchte einen Grund, eine praktische Aufgabe, um ihn kennenzulernen. Dies ist nur eine Gelegenheit. Jedes Tool einzeln - AVR Studio 4 und Ghidra Ich habe ein bisschen Buggy bekommen. AVR Studio mit mehreren verschachtelten Unterprogrammübergängen zeigt möglicherweise plötzlich nicht mehr die richtigen Übergangsadressen in Befehlen an (die Adresse wurde Null). Ghidra verirrte sich manchmal in seiner Indexanalyse. Die gleichzeitige Verwendung beider Tools ermöglichte es jedoch, die Ursache dieser Kuriositäten schnell zu identifizieren.

Ziellos in die Firmware zu graben ist nicht allzu interessant. Es ist besser, wenn es eine bestimmte Aufgabe gibt. Neugierig kann die Analyse des Austauschprotokolls für RS485 und des Kontrollprotokolls über Funk sein. Ich beschloss, mich mit dem Funkprotokoll zu befassen.

Es war einmal, ich hatte bereits ein von einer Funkfernbedienung übertragenes Signal aufgenommen und analysiert.

Der Funkkanal ist einseitig. Der Motor kann nur ein Signal empfangen und bestätigt den Empfang eines Befehls nicht. Es ist unmöglich, den Zustand des elektrischen Gesimses über Funk abzufragen. Auf der physischen Ebene gibt es nur einen Funksignalempfänger. Im Motor befindet sich kein Sender. Das Signal wird von der Funkfernbedienung mit einer Frequenz von 433,92 MHz übertragen. Codiert durch Amplitudenmanipulation. Der Befehl besteht aus einem speziellen Formularstartbit, Adresse + Kanal und dem Befehl selbst. Grafisch kann das gesamte Signal wie folgt dargestellt werden:



Ein Kanal kann als Teil einer Adresse betrachtet werden. Wenn Sie einen Befehl auf Kanal Null senden, wird er von allen Geräten mit einer bestimmten Adresse, jedoch mit unterschiedlichen Kanälen ausgeführt. Es ist praktisch, wenn Sie den Befehl sofort auf die Gruppe der elektrischen Gardinenstangen übertragen müssen.

Lesen Sie mehr über das Funkprotokoll .

Als ich analysierte, wie die Fernbedienung Befehle überträgt, kannte ich bereits die Codes der vier Teams. Nicht zu viel im Vergleich zu den Möglichkeiten, den elektrischen Vorhang über RS485 zu steuern. Ich wollte sicherstellen, dass alle Teams identifiziert wurden und dass es keine „Ostereier“ oder Serviceteams gab.

Der Analyseansatz ist einfach. Der Schaltplan zeigt, welche Ports des Mikrocontrollers mit physischen Geräten verbunden sind. Die Firmware-Datei wird in Ghidra analysiert. Dies ist praktisch - viele Routineoperationen werden automatisch ausgeführt. Nach der Analyse der Funktionsweise eines bestimmten Codes oder Unterprogramms erhält es einen aussagekräftigen Namen. Außerdem Code-Schnipsel und Screenshots, die ich von Ghidra mitbringen werde. Wenn Sie langweilig sind, führen Sie den Code im Simulator aus. In besonders komplizierten Situationen müssen Sie Bilder zeichnen.

Um sicherzustellen, dass die Namen der atmega168-Peripherieregister bei der Demontage korrekt angezeigt werden, habe ich die Datei avr8.pspec korrigiert. Auf eine gute Weise wäre es notwendig, eine Datei mit einem anderen Namen zu erstellen, aber ich brauchte diese Datei nicht in ihrer ursprünglichen Form und korrigierte diejenige, die war.
Die Firmware beginnt mit Interruptvektoren. Der erste ist der Übergangsvektor zum Programmanfang. Es sieht so aus:



Die meisten Interrupts werden nicht verwendet. Wenn aus irgendeinem Grund eine solche Unterbrechung auftritt, wird sofort ein Rückgabebefehl ausgeführt. Zusätzlich zur Verarbeitung von Interrupts zum Zurücksetzen werden auch Unterbrechungen zum Überlaufen des Timers 0, zum Abschluss des Empfangs und zur Bereitschaft zum Senden des nächsten Datenbytes an USART verarbeitet. Der RS485-Austausch ist für uns derzeit nicht von Interesse, aber der Timer-Überlauf muss überprüft werden.

Bevor der Timer-Interrupt aktiviert wird, muss natürlich der Timer selbst konfiguriert werden. Ich habe nicht begonnen, im zerlegten Code nach dem Ort zu suchen, an dem die Initialisierung stattfindet. Im Simulator habe ich einen Haltepunkt an der Adresse 0x1fc gesetzt - dies ist die Adresse, die im Interrupt-Handler aufgezeichnet wurde. Ich startete das Programm, bekam einen Spike und schaute mir nur an, was in die Register geschrieben wurde. Lockauswahl für timr0 ist auf clk / 8 eingestellt. Mit Quarz auf einer 8-MHz-Platine erreichen Impulse mit einer Frequenz von 1 MHz den Timer.

Start des Interrupt-Handlers:



Diagramm der Funktionen des Birdwatch Interrupt Handlers
Bild

Der Timer läuft alle 107 μs über. Der Interrupt-Handler verarbeitet unter anderem das Signal vom Ausgang des Funksignalempfängers. Wenn das Signal den Test erfolgreich besteht, werden die empfangenen Daten bei 0x4af in den Puffer geschrieben. Die Puffergröße beträgt 6 Bytes. Dies ist ein Byte mehr als erforderlich, um vier Bytes der Adresse + des Kanals und des Befehlsbytes zu empfangen. Vielleicht war das sechste Byte des Funkprotokolls für die Prüfsumme vorgesehen, aber verkümmert. Manchmal passiert es. Möglicherweise für Daten gedacht, die einige der Befehle ergänzen. Im Steuerprotokoll für das elektrische Gesims RS485 gibt es einen Befehl zum teilweisen Schließen der Vorhänge. In diesem Fall wird ein zusätzliches Byte mit Daten zum Abschlussgrad in Prozent übertragen. Ein ähnliches Team könnte im Funkprotokoll existieren. Das Hauptprogramm wird durch Setzen eines Flags über die Datenbereitschaft informiert - eine Einheit wird an die Adresse 0x4bd geschrieben.

Damit ist die Analyse der Unterbrechungen abgeschlossen und das Hauptprogramm wird fortgesetzt.

Das Funktionsdiagramm beim Navigieren zur Adresse 0x1304 ist kurz und einfach:

Bild

Wir müssen in der "Hauptsache". Wir haben die Unterbrechungen bereits analysiert und verstanden, dass dieser Traum lethargisch sein wird, wenn wir aus irgendeinem Grund plötzlich von der Hauptleitung zurückkehren und in „go_to_sleep“ geraten - der elektrische Vorhang hört auf, etwas Nützliches zu tun. Wahrscheinlich wurde beim Schreiben der Firmware eine vorgefertigte Vorlage verwendet, und Artefakte blieben danach zurück.

Im Wesentlichen müssen wir den Ort finden, an dem auf den 0x4af-Puffer zugegriffen wird. Sie müssen nicht lange suchen. Buchstäblich nach einigen Befehlen wird eine Unterroutine aufgerufen, die mit der Adresse 0x11b3 beginnt und in die dieser Puffer kopiert und verarbeitet wird.

Diagramm der Funktionen der Prozedur rf_signal_buffer_processing (0x11b3):



Dies ist genau der Ort, den wir brauchen, aber es sieht ein bisschen kompliziert aus. Um zu verstehen, begann ich Bilder zu zeichnen. So etwas wie ein Flussdiagramm.

Das erste, was hier passiert, ist, dass die Daten aus dem 0x4af-Puffer in die neue Adresse 0x49f kopiert werden und das 0x4bd-Flag zurückgesetzt wird:



Der folgende Ausschnitt ist der interessanteste:



Tatsächlich ist dies die gesamte Überprüfung des über Funk empfangenen Befehls. Dies ist zwar nicht offensichtlich, aber eine weitere Analyse ergab, dass der Übergang zu den nächsten Zweigen die Verarbeitung der folgenden Funkbefehle ist, wenn der Befehl 0xcc zuvor empfangen wurde - Umschalten in den Einstellungsmodus. Ich war an den neuen Codes der Teams selbst interessiert. Gibt es außer den Befehlscodes 0x11, 0x33, 0x55 und 0xcc noch etwas?

Weder hier noch weiter konnte ich die Verarbeitung des letzten - sechsten Bytes des Befehls finden. In der Abbildung ist es rot durchgestrichen. Alle Teams bestehen also aus fünf Bytes. Zumindest in der Firmware des AM82TV.

Das erste, was wir sehen, ist die Überprüfung des fünften Bytes des Puffers - des Codes des Befehls selbst. Hier gab es anscheinend neue Befehlscodes - 0xad und 0xda. Ein Befehl aus dem Puffer besteht den Test erfolgreich, wenn das Adressfeld mit einer der bereits in eeprom aufgezeichneten Adressen übereinstimmt oder wenn der Befehlscode 0xad oder 0xda und das Adressfeld == 0xaaaaaaa ist.

Verbleibende Bilder








Bild

Nun, wir werden davon ausgehen, dass wir den nächsten Test erfolgreich bestanden haben. Jetzt befindet sich der Befehlscode bei 0x4bf. Wir müssen herausfinden, wie der Inhalt dieses Bytes verarbeitet wird. Es gibt verschiedene Möglichkeiten, dies zu tun. Am einfachsten ist eine Textsuche nach zerlegtem Code in Ghidra. Es bleibt abzuwarten, wo genau der Inhalt dieses Bytes gelesen wird. Dies ist keine garantierte Methode, um alle Anrufe zu finden, aber in diesem speziellen Fall funktioniert es. Als erstes sehen wir einen Byte-Messwert in der Prozedur ab 0x1262:

Bild

Der Zugang dazu erfolgt von einem einzigen Ort aus - einem Team unter 0x5e0.

Funktionsgraph:

Bild

Schade, aber alle Befehlscodes mit Ausnahme der bereits bekannten: 0x11, 0x33, 0x55 und 0xcc werden in diesem Verfahren verworfen. Sogar die Codes 0xad und 0xda wurden im vorherigen Schritt gefunden. Zumindest habe ich es nicht geschafft, neue Codes für Funkbefehle in der Firmware des elektrischen Gesimses AM82TV zu finden.

Trotzdem gibt es Zugriff auf die Firmware, sie kann zerlegt werden, sehen, wie bestimmte Funktionen implementiert sind und etwas für sich selbst ändern. Oder sogar etwas hinzufügen.

Die Firmware und die für atmega168 geänderte Datei avr8.pspec werden auf GitHub veröffentlicht .

Source: https://habr.com/ru/post/de464657/


All Articles