Archiv verlassen und diese Seite im Standarddesign anzeigen : Firmware (.hex) eines E Scooter BLDCs reversen und verstehen?
Hallo Leute,
Ich war damit schon überall im Internet, und habe jetzt bei Discord den Hinweis bekommen es hier dich mal zu versuchen. Ich habe eine Firmware
eines E Scooters und will einige Kennwerte dieser ändern. Leider ist die Firmware für mich und für alle die sich bisher daran versucht haben
ein Buch mit 7 Siegeln, das keiner so wirklich versteht. Daher wollte ich hier fragen ob denn einer weis wie man sowas (Disassembly, Decompilat) liest und versteht?
balanceistischen
30.05.2020, 03:02
Hast Du Unterlagen, Schaltpläne usw. von Deinen E-Scooter?
Hast Du Unterlagen, Schaltpläne usw. von Deinen E-Scooter?
Hallo,
Ich habe ein weiteres PCB von einem Baugleichen Controller wie dem der im Scooter verbaut ist, natürlich kenne ich das komplette Pinout von dem Controller (Welche Kabel welche Signale leiten, und wo sie hingehen und wofür sie sind). Anhand von dem unbestückten Board könnte man das Platinenlayout
und damit die Schaltung reversen. Soll ich die Firmware mal hier hochladen, hätte diese auch Decompilliert vorliegen, als Decompiler wurde IDA 7.0 und der HEX Rays decompiler genutzt, der verwendete Mikrocontroller ist ein STM32F103C8T6. Ich verstehe leider nicht, wie die Firmware funktioniert, die ist äußerst komplex. Interesse wäre seitens mir da, zu lernen wie man sowas reversed, aber bei Mikrocontroller.net (Da hab ich vorher gefragt) wird man immer schon angeschumpfen wenn man blöd fragt, die scheinen das nicht so zu mögen.
Ist vielleicht kein Zufall, bei den Hoverboards kamen ebenfalls STM32F103 zum Einsatz, so oder so empfehle ich https://github.com/NiklasFauth/hoverboard-firmware-hack als Einstieg.
Daher wollte ich hier fragen ob denn einer weis wie man sowas (Disassembly, Decompilat) liest und versteht?
Da es sich hierbei ja dann um Assembler handelt ist das nicht so ganz einfach.
Die Sprungmarken sind nicht vernünftig benannt, Komentarzeilen ohnehin nicht drin.
Vermutlich werden auch die Register mit Ihren Adressen und nicht mit den Namen angesprochen.
Du brauchst auch eine IDE für genau den verwendeten Controller - Gut, die hast Du ja.
Ich denke das die Firmware in einer Hochsprache geschrieben und dann Assembliert wurde.
Manchmal hilft es auch das Assembler File mit einem Simulator auszutesten.
Da sieht man dann wenigstens welche Programmteile wann angesprochen werden.
Oftmals ist es einfacher selber einen komplett neuen Quelltext z.B. in C zu schreiben, bevor man eine vorhandene .hex Datei zerfieselt.
Das schwierigste hierbei dürfte die "saubere" Ansteuerung der Brushlessmotors sein.
Macht man da was falsch kann man schnell Rauchzeichen erhalten.
Aber evtl. findet man dazu auch eine Application Note beim Controller Hersteller, oder eine gute Library.
Ich denke das die Firmware in einer Hochsprache geschrieben und dann Assembliert wurde.
....
Oftmals ist es einfacher selber einen komplett neuen Quelltext z.B. in C zu schreiben, bevor man eine vorhandene .hex Datei zerfieselt.
Oder anders formuliert, wer das selber locker programmieren kann, versteht möglicherweise den disasemblierten Code, den ein anderer geschrieben hat.
Am Ende läuft es darauf hinaus, aus der Form einer Pfütze herzuleiten, wie der Eisblock mal ausgesehen, aus dem sie entstanden ist.
MfG Klebwax
Der Code ist nicht disassembliert sondern decompilliert, dürfte also deutlich besser sein als ein Disassembly. Genau da liegt auch das Problem,
ich kann fast alles, nur Programmieren gehört leider nicht dazu, dass das für so ein Vorhaben ziemlich blöd ist nicht programmieren zu können weiß ich auch.
Ich würde ja das Programm wenn ichs könnte neu schreiben oder jemanden fragen der das kann, aber erstens interessiert mich wie die originale Firmware da drin funktioniert (Die ist schon ziemlich gut) und zweitens dürfte es wahrscheinlich mehr aufwand sein eine Firmware von jemandem schreiben zu lassen (Wie geschrieben ich kann leider nicht wirklich programmieren) die genauso viel kann wie die die jetzt drauf ist, anstatt die jetztige so weit zu zerlegen dass man entsprechend Kennwerte ändern kann. Hier mal ein Auszug aus dem Decompilat, versche mich auch gerade dran die Memory MAP das Prozessors in IDA einzugeben, vielleicht wirds dann verständlicher, das hier ist eine Funktion:
int __fastcall sub_800714C(int result, _DWORD *a2, unsigned int a3)
{
char v3; // t1
bool v4; // cf
unsigned int i; // r2
int v6; // r3
int v7; // r4
int v8; // r5
int v9; // r12
bool v10; // nf
int v11; // r3
int v12; // r12
int v13; // t1
__int16 v14; // t1
int v15; // r3
int v16; // r12
_DWORD *v17; // r0
if ( a3 )
{
if ( (_DWORD)a2 << 30 )
{
while ( 1 )
{
--a3;
v3 = *(_BYTE *)a2;
a2 = (_DWORD *)((char *)a2 + 1);
*(_BYTE *)result++ = v3;
if ( !a3 )
break;
if ( !((_DWORD)a2 << 30) )
goto LABEL_5;
}
}
else
{
LABEL_5:
if ( result << 30 )
{
v4 = a3 >= 8;
for ( i = a3 - 8; v4; result = (int)(v17 + 1) )
{
v15 = *a2;
v16 = a2[1];
a2 += 2;
v4 = i >= 8;
i -= 8;
*(_DWORD *)result = v15;
v17 = (_DWORD *)(result + 4);
*v17 = v16;
}
v10 = ((i << 29) & 0x80000000) != 0;
}
else
{
v4 = a3 >= 0x10;
for ( i = a3 - 16; v4; result += 16 )
{
v6 = *a2;
v7 = a2[1];
v8 = a2[2];
v9 = a2[3];
a2 += 4;
v4 = i >= 0x10;
i -= 16;
*(_DWORD *)result = v6;
*(_DWORD *)(result + 4) = v7;
*(_DWORD *)(result + 8) = v8;
*(_DWORD *)(result + 12) = v9;
}
v10 = ((i << 29) & 0x80000000) != 0;
if ( __CFSHL__(i, 29) )
{
v11 = *a2;
v12 = a2[1];
a2 += 2;
*(_DWORD *)result = v11;
*(_DWORD *)(result + 4) = v12;
result += 8;
}
}
if ( v10 )
{
v13 = *a2;
++a2;
*(_DWORD *)result = v13;
result += 4;
}
if ( __CFSHL__(i, 31) )
{
v14 = *(_WORD *)a2;
a2 = (_DWORD *)((char *)a2 + 2);
*(_WORD *)result = v14;
result += 2;
}
if ( ((i << 31) & 0x80000000) != 0 )
*(_BYTE *)result = *(_BYTE *)a2;
}
}
return result;
}
Ein Depp wie ich versteht natürlich noch nicht mal die Befehle in sich, da brauche ich leider noch nicht mal versuchen, das ganze Programm zu verstehen...
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.