diff options
-rw-r--r-- | pages/hackabike.md | 69 |
1 files changed, 35 insertions, 34 deletions
diff --git a/pages/hackabike.md b/pages/hackabike.md index ac5f669b..e215fc8d 100644 --- a/pages/hackabike.md +++ b/pages/hackabike.md | |||
@@ -1,15 +1,15 @@ | |||
1 | title: Hack a Bike | 1 | title: Hack a Bike |
2 | date: 2009-11-02 01:04:00 | 2 | date: 2009-11-02 01:04:00 |
3 | updated: 2012-02-18 21:09:17 | 3 | updated: 2012-02-19 18:24:46 |
4 | author: erdgeist | 4 | author: erdgeist |
5 | tags: deutsche bahn, hack, bike, call, avr, hackabike | 5 | tags: deutsche bahn, hack, bike, call, avr, hackabike |
6 | previewimage: /images/01.jpg | 6 | previewimage: /images/01.jpg |
7 | 7 | ||
8 | Schon immer mal nachts ohne Transportmöglichkeit in einem fremden Bezirk aufgewacht? "Mal schnell" ein Fahrrad benötigt? In Berlin und anderen Großstädten Deutschlands bietet Die Deutsche Bahn mit dem Call-A-Bike Service Abhilfe. | 8 | Schon mal nachts ohne Transportmöglichkeit in einem fremden Bezirk aufgewacht? "Mal schnell" ein Fahrrad benötigt? In Berlin und anderen Großstädten Deutschlands bietet die Deutsche Bahn mit dem Call-A-Bike-Service Abhilfe. |
9 | 9 | ||
10 | <!-- TEASER_END --> | 10 | <!-- TEASER_END --> |
11 | 11 | ||
12 | ## Kurzeinführung in das Call a Bike System {#kurzeinführung-in-das-call-a-bike-system .quote} | 12 | ## Kurzeinführung in das Call-a-Bike-System {#kurzeinführung-in-das-call-a-bike-system .quote} |
13 | 13 | ||
14 | Als Kunde ruft man die CallABike-Zentrale und gibt per DTMF-Wahl die | 14 | Als Kunde ruft man die CallABike-Zentrale und gibt per DTMF-Wahl die |
15 | vierstellige Radnummer durch. Von der Zentrale erhält man dann den | 15 | vierstellige Radnummer durch. Von der Zentrale erhält man dann den |
@@ -95,12 +95,12 @@ Es dauerte eine Weile, bis wir merkten, dass das System nach dem Booten | |||
95 | durch ein Infrarot-Signal aktiviert werden muss. Das war mehr oder | 95 | durch ein Infrarot-Signal aktiviert werden muss. Das war mehr oder |
96 | weniger Zufall. | 96 | weniger Zufall. |
97 | 97 | ||
98 | Wenn man eine normale Glühlampe benutzt, um besser sehen zu koennen, | 98 | Wenn man eine normale Glühlampe benutzt, um besser sehen zu können, |
99 | piepte die Elektronik gelegentlich scheinbar unmotiviert. Wie sich | 99 | piepte die Elektronik gelegentlich scheinbar unmotiviert. Wie sich |
100 | später herausstellte, reichte der durch die Glühlampe emittierte | 100 | später herausstellte, reichte der durch die Glühlampe emittierte |
101 | IR-Anteil aus, um den IR-Receiver zu triggern und den Bootvorgang | 101 | IR-Anteil aus, um den IR-Receiver zu triggern und den Bootvorgang |
102 | fortzusetzen. Beim Booten testet sich das System selbst, und der Empfang | 102 | fortzusetzen. Beim Booten testet sich das System selbst, und der Empfang |
103 | eines Infrarot Signals gehört eben dazu. Im Zuge fortschreitender | 103 | eines Infrarot-Signals gehört eben dazu. Im Zuge fortschreitender |
104 | Professionalisierung™ wurde in der Folgezeit die Glühlampe durch ein | 104 | Professionalisierung™ wurde in der Folgezeit die Glühlampe durch ein |
105 | Infrarot-Photon-Micro-Light ersetzt. Bei unserer weiteren Analyse des | 105 | Infrarot-Photon-Micro-Light ersetzt. Bei unserer weiteren Analyse des |
106 | Systems begannen wir damit, alle Anschlüsse des Atmel durchzumessen, um | 106 | Systems begannen wir damit, alle Anschlüsse des Atmel durchzumessen, um |
@@ -119,46 +119,47 @@ an. Zum Auslesen wurde hauptsächlich das freie | |||
119 | AVR microcontrollers which can interface to many hardware in-system | 119 | AVR microcontrollers which can interface to many hardware in-system |
120 | programmers”) benutzt. Die auf dem Atmel vorhandenen | 120 | programmers”) benutzt. Die auf dem Atmel vorhandenen |
121 | „Intellectual-Property“-Bits waren in einem undefinierten Zustand, | 121 | „Intellectual-Property“-Bits waren in einem undefinierten Zustand, |
122 | deswegen konnten wir das Flash des Atmels mit der 8KB großen Firmware | 122 | deswegen konnten wir das Flash des Atmels mit der acht KB großen |
123 | auslesen. | 123 | Firmware auslesen. |
124 | 124 | ||
125 | In den nächsten Wochen waren mehrere Hacker damit beschäftigt, den | 125 | In den nächsten Wochen waren mehrere Hacker damit beschäftigt, den |
126 | ausgelesenen Assemblercode zu verstehen und zu dokumentieren. Dazu | 126 | ausgelesenen Assemblercode zu verstehen und zu dokumentieren. Dazu |
127 | verwendeten wir AVR-Studio und [Ida | 127 | verwendeten wir AVR-Studio und [Ida |
128 | Pro](http://www.datarescue.com/idabase/). Den Scramble Code (zum | 128 | Pro](http://www.datarescue.com/idabase/). Den Scramble Code (zum |
129 | berechnen der Ausleih- und Abgabecodes) fanden wir relativ schnell, da | 129 | Berechnen der Ausleih- und Abgabecodes) fanden wir relativ schnell, da |
130 | sich dort eine Menge rotate-und-shift-Befehle befanden. Den | 130 | sich dort eine Menge rotate-und-shift-Befehle befanden. Den |
131 | Initialisierungscode erkannten wir wieder, da wir wussten, dass der | 131 | Initialisierungscode erkannten wir wieder, da wir wußten, daß sich der |
132 | Motor sich beim Einschalten zweimal herumdreht. So konnten wir das | 132 | Motor beim Einschalten zweimal herumdreht. So konnten wir das Gelernte |
133 | gelernte immer wieder an unserem Prototyp auf Richtigkeit überprüfen. | 133 | immer wieder an unserem Prototyp auf Richtigkeit überprüfen. |
134 | 134 | ||
135 | Die Ausleih- und Abgabecodes werden durch einen Scrambler generiert, der | 135 | Die Ausleih- und Abgabecodes werden durch einen Scrambler generiert, der |
136 | mit einem 16Bit-Counter des CallABikes und einem Zustandswert aufgerufen | 136 | mit einem 16-Bit-Counter des Call-a-Bikes und einem Zustandswert |
137 | wird. Ein gerader Counterwert erzeugt Ausleihcodes und ein ungerader | 137 | aufgerufen wird. Ein gerader Counterwert erzeugt Ausleihcodes und ein |
138 | erzeugt die Abgabecodes. Der Scrambler nutzt den Counter und das | 138 | ungerader erzeugt die Abgabecodes. Der Scrambler nutzt den Counter und |
139 | Zustandsbyte, um ein Offset auf ein 1024 Bit großes Feld zu errechnen. | 139 | das Zustandsbyte, um ein Offset auf ein 1024 Bit großes Feld zu |
140 | Dieses Feld ist ein für jedes CallABike eindeutiger binärer String, der | 140 | errechnen. Dieses Feld ist ein für jedes Call-a-Bike eindeutiger binärer |
141 | als der (wahrscheinlich) eindeutige Key des CallABikes bezeichnet werden | 141 | String, der als der (wahrscheinlich) eindeutige Key des Call-a-Bikes |
142 | könnte. Von diesem Offset aus werden dann 4x4 Bit genutzt, die die vier | 142 | bezeichnet werden könnte. Von diesem Offset aus werden dann 4x4 Bit |
143 | Ziffern für die Ausleih- und Abgabecodes repräsentieren. Die 16 Bit des | 143 | genutzt, welche die vier Ziffern für die Ausleih- und Abgabecodes |
144 | Counters werden aber schlecht genutzt, denn schon nach 1024 Iterationen | 144 | repräsentieren. Die 16 Bit des Counters werden aber schlecht genutzt, |
145 | wiederholen sich die Ausleih- und Abgabecodes. Das bedeutet auch, dass | 145 | denn schon nach 1024 Iterationen wiederholen sich die Ausleih- und |
146 | es nur 512 Ausleihcodes je CallABike gibt, da es nur 512 gerade Offsets | 146 | Abgabecodes. Das bedeutet auch, daß es nur 512 Ausleihcodes je |
147 | gibt die auf den Key (1024 Bit) zeigen können. CallABikes, die wir | 147 | Call-a-Bike gibt, da es nur 512 gerade Offsets gibt, die auf den Key |
148 | geöffnet haben und die wir wegen der Lockbits nicht auslesen konnten, | 148 | (1024 Bit) zeigen können. Call-a-Bikes, die wir geöffnet haben und die |
149 | haben wir mit einem Script 511 mal resetten lassen (bei einem Reset | 149 | wir wegen der Lockbits nicht auslesen konnten, haben wir mit einem |
150 | erhöht sich der Counter immer um zwei). Damit haben wir den | 150 | Script 511 mal resetten lassen (bei einem Reset erhöht sich der Counter |
151 | ursprünglichen Zustand wiederhergestellt, und das CallABike war wieder | 151 | immer um zwei). Damit haben wir den ursprünglichen Zustand |
152 | ‘in sync’ mit der Zentrale. | 152 | wiederhergestellt, und das Call-a-Bike war wieder ‘in sync’ mit der |
153 | Zentrale. | ||
153 | 154 | ||
154 | Wer sich das Display mal genauer angeschaut hat, wird festgestellt | 155 | Wer sich das Display mal genauer angeschaut hat, wird festgestellt |
155 | haben, dass der Zeichensatz ein proportionaler ist. Dazu gibt es im Code | 156 | haben, daß der Zeichensatz ein proportionaler ist. Dazu gibt es im Code |
156 | eine Tabelle, in der die Länge des Zeichens und die Position im Flash | 157 | eine Tabelle, in der die Länge des Zeichens und die Position im Flash |
157 | gespeichert sind. Ein ‘i’ und ein ‘!’ belegen nur ein Byte, wogegen z.B. | 158 | gespeichert sind. Ein ‘i’ und ein ‘!’ belegen nur ein Byte, wogegen z. |
158 | ein ‘w’ sieben Bytes belegt. Die großen Logos und das Zahleneingabefeld | 159 | B. ein ‘w’ sieben Bytes belegt. Die großen Logos und das |
159 | liegen als 400 Byte große Bitmaps vor. Die lange schwarze Linie im | 160 | Zahleneingabefeld liegen als 400 Byte große Bitmaps vor. Die lange |
160 | CallABike-Logo zeigt die Stärke der Spule im Schloss an. Das haben wir | 161 | schwarze Linie im Call-a-Bike-Logo zeigt die Stärke der Spule im Schloß |
161 | nur durch das Code-Auditing herausgefunden. | 162 | an. Das haben wir nur durch das Code-Auditing herausgefunden. |
162 | 163 | ||
163 | Unser erstes Ziel war es, den aus unserem Disassembler erhaltenen | 164 | Unser erstes Ziel war es, den aus unserem Disassembler erhaltenen |
164 | Sourcecode so anzupassen, dass nach dem Assemblieren mit dem Commandline | 165 | Sourcecode so anzupassen, dass nach dem Assemblieren mit dem Commandline |