diff --git a/_posts/blog/2026-04-15-firmware-updater-fix.markdown b/_posts/blog/2026-04-15-firmware-updater-fix.markdown index 293719b..1acab09 100644 --- a/_posts/blog/2026-04-15-firmware-updater-fix.markdown +++ b/_posts/blog/2026-04-15-firmware-updater-fix.markdown @@ -1,26 +1,26 @@ --- layout: post -title: "Fixen eines Firmware-Updaters" +title: Fixen eines Firmware-Updaters date: 2026-04-15 17:35:00 -post_author: Jan / bitbyteshark +post_author: Jan/bitbyteshark --- Wer einem alten Laptop aus dem Keller noch einmal neues Leben einhauchen will, findet dabei nur selten eine Batterie in gutem Zustand vor. So ist es uns ergangen, als wir einen Dell XPS17 L702x mit Windows 7 (etwa aus dem Jahr 2010) wiederverwenden wollten. Für einen frischen Start wird zuerst kurz™ die neuste Firmware aufgespielt. Dafür stellt uns Dell den Firmware-Updater `L702X_A19.exe` für Windows von 2020 auf ihrer Website bereit. Doch ganz so leicht sollte es nicht sein. ## Fehlermeldung -![Das Bild zeigt eine Fehlermelung: Das Firmwareupdate wird nur ausgeführt, wenn die batterie über 10% geladen ist.](/media/2026-04-15/error.jpg) -*Fehlermeldung verhinder Update. Chaospott [CC-BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)* +![Das Bild zeigt eine Fehlermelung: Das Firmwareupdate wird nur ausgeführt, wenn die Batterie über 10% geladen ist.](/media/2026-04-15/error.jpg) +*Fehlermeldung verhindert Update. Chaospott [CC-BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)* -Dank diesem eingebauten Schutzmechanismus lässt sich die Firmware nur mit eingestecktem Netzteil und eingesteckter Batterie ausführen, die außerdem auch noch zu mehr als 10% geladen sein muss. Der seit Jahren tiefenentladene Akku lässt jedoch nur noch eine maximale Ladung von 2% zu. Auch ein online beschriebener Bypass mit der Flag `/forceit` lässt hier leider kein Update zu. +Dank diesem eingebauten Schutzmechanismus lässt sich die Firmware nur mit eingestecktem Netzteil und eingesteckter Batterie ausführen, die außerdem auch noch zu mehr als 10% geladen sein muss. Der seit Jahren tiefentladene Akku lässt jedoch nur noch eine maximale Ladung von 2% zu. Auch ein online beschriebener Bypass mit der Flag `/forceit` lässt hier leider kein Update zu. Selbstverständlich will man dem Gerät hier trotzdem seinen Willen aufzwingen. Dazu reichten die Problemlösungsstrategien im Club von Firmware-Update via `fwupd`, über Patch der .exe-Datei mit Ghidra, bis hin zum Jumpstart des alten Akkus. Da ein Update via `fwupd` für dieses Gerät nicht verfügbar ist, haben wir uns dafür entschieden, den Umgang mit Ghidra zu lernen und etwas zu frickeln. ## Strategie -Die Idee ist, die Prüfung des Batteriezustandes im Programm zu finden und das Ergebnis zu invertieren oder die Prüfung im Ganzen zu überspringen. Ghidra zeigt uns die zu Grunde liegenden Assembly-Instruktionen der kompilierten Datei und erzeugt dazu dekompilierten C-Programmcode, der eine einfachere Interpretation ermöglicht. +Die Idee ist, die Prüfung des Batteriezustandes im Programm zu finden und das Ergebnis zu invertieren oder die Prüfung im Ganzen zu überspringen. Ghidra zeigt uns die zugrunde liegenden Assembly-Instruktionen der kompilierten Datei und erzeugt dazu dekompilierten C-Programmcode, der eine einfachere Interpretation ermöglicht. -Mit der Suche des Texts der Fehlermeldung ließ sich der Code-Abschnitt des Pop-Up-Fensters finden, der für den Klick auf OK mutmaßlich auch den Retry der Batterie-Prüfung auslöst. Da im Executable keine der ursprünglichen Funktionsbezeichnungen mehr erhalten bleiben, stochert man dabei etwas im Dunkeln und erschließt sich den Kontext nach und nach. +Mit der Suche des Texts der Fehlermeldung ließ sich der Code-Abschnitt des Pop-up-Fensters finden, der für den Klick auf OK mutmaßlich auch den Retry der Batterie-Prüfung auslöst. Da im Executable keine der ursprünglichen Funktionsbezeichnungen mehr erhalten sind, stochert man dabei etwas im Dunkeln und erschließt sich den Kontext nach und nach. ## Umsetzung @@ -28,16 +28,16 @@ In mehreren Versuchen haben wir den Rückgabewert der Batterieprüfung ausgetaus Mehr Erfolg hatten wir schließlich mit einem switch-case-Statement, mit dem die verschiedenen Fehler-cases und auch der Erfolgs-case verarbeitet werden. Dort konnten wir den Initialwert so überschreiben, dass immer der Erfolgs-case ausgelöst wird. -Die konkrete Änderung wird im Assembly umgesetzt und muss der gleichen Größe der ursprünglichen Anweisungen entsprechen. In userem Fall sieht die Anweisung vor der Änderung so aus: +Die konkrete Änderung wird im Assembly umgesetzt und muss der gleichen Größe der ursprünglichen Anweisungen entsprechen. In unserem Fall sieht die Anweisung vor der Änderung so aus: -```text +```asm 004031ac 8b 85 04 MOV EAX,dword ptr [EBP + int_for_case_switching] f3 ff ff ``` -Nach der Änderung mit konstantem Wert 7 so: +Nach der Änderung mit konstantem Wert 7, so: -```text +```asm 004031ac c7 c0 07 MOV EAX,0x7 00 00 00 ``` @@ -46,14 +46,14 @@ Nach Einbau der Änderung lässt sich eine .exe exportieren und wir konnten so d ## Zum Nachmachen -Dell stellt das Executable "Dell XPS L702X System BIOS" für das Firmware-Upgrade auf die Verison A19 von 2020 online bereit. Um sicherzugehen, dass es sich um die identische Datei handelt, sollte die MD5-Checksum abgeglichen werden: +Dell stellt das Executable "Dell XPS L702X System BIOS" für das Firmware-Upgrade auf die Version A19 von 2020 online bereit. Um sicherzugehen, dass es sich um die identische Datei handelt, sollte die MD5-Checksum abgeglichen werden: -``` sh +```sh md5sum L702X_A19.exe e2c30fa6285242a6a56f9b5371ddb2fc ``` -Die geänderten 6 byte können direkt auf die Datei angewendet werden: +Die geänderten 6 Byte können direkt auf die Datei angewendet werden: ```sh cp L702X_A19.exe L702X_A19_patched.exe