comparison doc/Compal-unlock @ 0:e7502631a0f9

initial import from freecalypso-sw rev 1033:5ab737ac3ad7
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 11 Jun 2016 00:13:35 +0000
parents
children 21eec7569eb8
comparison
equal deleted inserted replaced
-1:000000000000 0:e7502631a0f9
1 Using FreeCalypso tools to unlock Motorola C1xx phones
2 ======================================================
3
4 The ultimate goal of the FreeCalypso project is to produce our own complete GSM
5 dumbphone firmware which We the People fully own, control and compile from
6 source ourselves, running at first on some selected pre-existing hardware
7 targets, and then ultimately on our own Free Dumb Phone hardware. While that
8 goal is still far past the visible horizon, what can we do in the meantime to
9 make our current forced use of existing proprietary dumbphone firmwares a
10 little more tolerable? This article presents one such hack: using FreeCalypso
11 loadtools to dump the flash content of Compal phones for analysis, including
12 TIFFS, and to replace one existing proprietary fw version with another, e.g.,
13 to remove carrier branding and the associated SIM restriction.
14
15 Serial access
16
17 Mot C1xx (Compal) phones have a 2.5 mm headset jack that dual-functions as a
18 debug/programming serial port. In hardware terms, there is an electrically
19 controlled switch (MUX) inside that switches the external jack between the
20 analog headset signals and the digital serial ones; this switch is controlled
21 by a GPIO signal from the Calypso. The hardware power-up state of this switch
22 is serial; Mot/Compal's standard fw switches it to headset upon boot, but the
23 serial setting persists long enough to use it to break into the bootloader.
24
25 Bootloader
26
27 The Calypso DBB (digital baseband) chip used in these phones has an on-chip
28 boot ROM, but it also has a hardware pin that enables or disables this boot
29 ROM, and unfortunately these phones have it disabled. If the boot ROM were
30 enabled in hardware, it would provide an unstoppable and unbrickable way to
31 take control of the device through the externally-accessible serial port like
32 we have on Openmoko and Pirelli phones, but unfortunately the hardware we have
33 available is not wired that way.
34
35 However, Mot/Compal's standard firmware on these phones includes a bootloader,
36 a part that executes before any of the rest of the fw image is allowed to
37 execute or is made use of in any way, and this Compal-specific bootloader has a
38 provision for interrupting the boot process and diverting it to an externally-
39 supplied piece of code loaded over the serial line. Older fw versions have
40 this feature enabled unconditionally, but some of the newer versions have a
41 malfeature whereby the serial boot interrupt and code download possibility may
42 be disabled. Some C1xx phones out in the wild, particularly all North American
43 C139s with TracFone branding and some of the Cingular-branded ones as well,
44 have such maliciously-locked firmware in them.
45
46 Fortunately though, these maliciously-locked firmwares (or at least all versions
47 we've encountered so far) have been found to have another hole through which we
48 can break in, as described in the TFC139-breakin article. We can exploit this
49 hole in the firmware to gain code execution access to the Calypso, and then use
50 the latter to reprogram the flash, replacing the ultra-malicious firmware with
51 some other version that, although still proprietary, is a little less evil.
52
53 Making first contact
54 ====================
55
56 If you have a C1xx phone which you are seeking to free, your first step should
57 be to try breaking in with fc-loadtool, using the Compal bootloader method.
58 With the phone powered off, but containing a charged battery (SIM present or
59 absent, doesn't matter), proceed as follows:
60
61 1. Connect the serial or USB-serial cable between your PC or other host and the
62 target phone's headset jack.
63
64 2. On the host end, run fc-loadtool like this:
65
66 C11x/123: fc-loadtool -h compal /dev/ttyXXX
67 C139/140: fc-loadtool -h compal -c 1003 /dev/ttyXXX
68 C155/156: fc-loadtool -h c155 /dev/ttyXXX
69
70 3. Press the power button on the phone. A momentary press is sufficient and
71 recommended: the hardware powers up and causes the boot code to run exactly
72 the same whether the power button is pressed momentarily or held down.
73
74 Normal phone power-up requires the button to be held down because the
75 standard firmware does a check fairly late in the boot process to see if the
76 power button is still held down, and commands the hardware (the ABB) to
77 power off if it is not - it is a standard feature to prevent phones from
78 turning themselves on inadvertently from accidental momentary presses of
79 that button. But if the goal is to cause the boot code to run, but not to
80 boot the regular fw all the way, a momentary press is ideal.
81
82 If your phone has a bootloader without the malicious lock in it, the above
83 procedure should result in fc-loadtool gaining full access to the target and
84 landing you at a loadtool> prompt. You can dump the flash content and analyse
85 it, etc. If you would like to change to a different fw version (to remove the
86 SIM lock / carrier branding or for any other reason), see the corresponding
87 later section of this article.
88
89 Alternative method
90 ==================
91
92 If the above procedure fails to gain access to the Calypso because the boot
93 code in the phone never offers a serial download opportunity, the alternate
94 break-in method should be tried, going through the full running firmware
95 instead of just the bootloader part thereof. Proceed as follows:
96
97 1. Remove the SIM (if there was one to begin with) and put the charged battery
98 back in. Charge the battery if necessary, using the standard charging
99 function of the existing fw.
100
101 2. Power the phone up for normal boot: hold the power button down like a
102 regular user would, without fc-loadtool or other serial break-in tools.
103 The fw will boot up, notice the lack of a SIM, and the display will read
104 "SIM card absent" or something to that effect, depending on the fw version.
105
106 3. Key in this magic sequence: **16379#. A hidden "Trace Switch" menu should
107 appear, with the choices being "Trace On" and "Earphone". Select "Trace On".
108 The electrically controlled hardware switch mentioned earlier in this article
109 should now be set back to the UART, bringing the latter out to the headset
110 jack. Because Mot/Compal's firmware is based on TI's reference architecture,
111 the interface presented by the running fw on this serial port is TI's RVTMUX,
112 albeit at 57600 baud instead of TI's default of 115200.
113
114 4. Connect the headset jack serial cable if it wasn't already connected, and
115 run this FreeCalypso utility:
116
117 tfc139 /dev/ttyXXX
118
119 (The name tfc139 is historical; the current version is expected to work with
120 all Mot C1xx firmwares.)
121
122 Compal's TI-based firmware implements some of TI's Test Mode commands, and one
123 of these commands is a raw memory write. It also implements some of TI's GPF
124 "system primitive" commands, including the MEMCHECK command that causes the
125 firmware to report some info on all running GPF tasks, including the location
126 of each task's stack. Our tfc139 utility will try to break into the phone
127 (gain code execution access) by querying the target fw for the location of the
128 L1A task's stack, and then using Test Mode memory write commands to write a
129 piece of shellcode into an unused RAM location and to make this code execute by
130 overwriting a function return address on the stack of the L1A task that
131 processes these Test Mode commands.
132
133 If the stack smashing hack succeeds, the shellcode injected by tfc139 will send
134 a message out the serial port indicating this success, and then re-enable the
135 Calypso boot ROM and jump to it. Once the boot ROM code gains control, it will
136 wait forever for a serial code download following its standard protocol. If
137 tfc139 gets the success indication from the target, it will announce this
138 success and direct you to run:
139
140 fc-loadtool -h compal -c none /dev/ttyXXX
141
142 Do as it says. The -c none option tells fc-loadtool to skip compalstage and
143 proceed directly to feeding loadagent to the Calypso boot ROM. You should now
144 be in full control of the phone via fc-loadtool.
145
146 There is one additional quirk worth mentioning. It appears that Mot/Compal's
147 main fw keeps resetting the RTC alarm registers in the Calypso DBB as it runs,
148 always keeping the alarm time in the near future relative to the current time.
149 When one breaks into this firmware with tfc139 and takes over the control of
150 the device with fc-loadtool, this alarm time will almost certainly be reached,
151 and the RTC alarm will go off. This alarm has no effect on loadtool operation
152 (i.e., it cannot reset the CPU or otherwise wrestle control away from loadtool,
153 so it doesn't add any bricking risk), but it has one quite surprising effect
154 upon exit, i.e., when you are done with your loadtool session and give it the
155 exit command.
156
157 Loadtool's configured default exit action for this target is to send a power-off
158 command to the Iota ABB, leaving the device cleanly powered off. However, if
159 the RTC alarm has gone off previously during the session, the ABB will instantly
160 power the phone back on, and put it through a new boot cycle. The firmware
161 handles this special form of boot rather oddly: it proceeds to the same end
162 state it would have reached via a normal power button hold-down boot (powered
163 on with the "Insert SIM" message on the LCD), but it reaches this state almost
164 instantly, without going through the power-on LCD logo and buzz phase. Odd,
165 but harmless. This explanation has been included to save other hackers the
166 hours of bewildered head-scratching I spent chasing this quirk down.
167
168 Dumping and reloading flash
169 ===========================
170
171 Once you break in with fc-loadtool (either through the bootloader or through
172 tfc139), the first step you should do is make a dump (backup) of the flash:
173
174 loadtool> flash dump2bin flashdump.bin
175
176 Before you do any flash write (erase or program) operations, please realise
177 that these phones are brickable. Because the Calypso boot ROM is disabled at
178 the board level (Calypso DBB's nIBOOT configuration input is tied high directly
179 underneath the BGA package!), when the phone powers up, the ARM7 core starts
180 executing instructions directly out of the flash, from address 0. Therefore,
181 flash sector 0 must contain good working boot code (one that allows serial code
182 download access for recovery) at all times. If you erase this sector or fill
183 it with some garbage (anything other than good working boot code) and then power
184 the phone off or otherwise lose control of it, the phone will be unrecoverably
185 bricked!
186
187 On most C1xx models there seems to be no way to access the Calypso's JTAG
188 signals, hence no possibility of using JTAG to unbrick a bricked phone. And
189 because the flash chip is a micro-BGA, it is quite unlikely that one could
190 successfully desolder it, program it in a standalone flash chip programmer,
191 and then put it back on the board. Thus if you brick your C1xx phone, then
192 most likely it is truly toast. You've been warned!
193
194 That being said, if your phone came with a maliciously locked bootloader, such
195 that you had to use tfc139 to break in, then replacing that bootloader with a
196 non-malware version is pretty much a necessity, and taking the chance of
197 bricking the phone becomes a necessary risk. Even if the bootloader version in
198 your C1xx is free of the locking malfeature, if you need to reflash the main fw
199 to a different version, one still needs to erase and reprogram the dangerous
200 sector: on C11x/123 and C139/140 the main fw image starts at 0x2000, but the
201 erase block boundary doesn't come until 0x10000.
202
203 The good news, however, is that fc-loadtool has special support for rewriting
204 the boot sector on Compal phones with minimal risk of bricking. The command is:
205
206 flash erase-program-boot binfile [length]
207
208 The first argument is the name of the file (in straight binary format)
209 containing the new boot code; the second argument (always interpreted as hex)
210 is the number of bytes to program, always starting at 0. If only one argument
211 is given, the length of the file is used instead, which must not exceed the
212 length of flash sector 0: 64 KiB on C11x/123 and C139/140, or 8 KiB on C155/156.
213
214 This special command minimizes the bricking vulnerability window by loading the
215 entirety of the new boot code to be programmed into a scratchpad RAM buffer on
216 the target first (no problem because it's 64 KiB max), then commanding loadagent
217 (the code that actually runs on the Calypso when you use fc-loadtool) to perform
218 the "atomic" operation of erasing flash sector 0, then immediately reprogramming
219 it with the bits that are already in scratchpad RAM on the phone.
220
221 With this approach the phone will only be bricked if the battery dies or is
222 physically yanked out of the phone in the time window between the beginning of
223 the erase operation and the last critical bit of the new boot code being
224 programmed - on the order of a second or two, or if the flash operations fail
225 for some reason. However, the phone will *not* be bricked with this approach
226 if the serial connection between fc-loadtool or the target gets broken during
227 the window in question, or if the host machine running fc-loadtool crashes: no
228 flash operations start until loadtool gives the go-ahead command to loadagent,
229 and once loadagent receives the latter command, it will proceed till completion
230 without caring if loadtool is still there or not.
231
232 Of course the conventional flash erase and flash program-bin commands will be
233 happy to operate on flash sector 0 just like any other sector, but doing so is
234 NOT recommended, as the window of vulnerability for bricking would then be
235 considerably greater.
236
237 Unlocked firmware for C139
238 ==========================
239
240 If your phone is a North American (1900+850 MHz) C139, and you are reading this
241 article because it came with Cingular or TracFone branding, whereas you would
242 like to use it with SIMs and networks of your own choosing instead, you've come
243 to the right place. We have an unlocked and non-carrier-branded (Mot branding
244 only) version of the fw that runs on these phones, and you can use FreeCalypso
245 loadtools to flash this version into your C139 whether it came with Cingular or
246 TF branding originally. Download this file:
247
248 ftp.freecalypso.org:/pub/GSM/Compal/c139-unlocked-fw.zip
249
250 Unzip it, and you'll get c139-unlocked-fw.bin - that is the image you'll need
251 to flash into your phone. Get in with fc-loadtool (using tfc139 if necessary
252 for bootloader-locked phones) and make a backup of the original flash content.
253 Then reflash the firmware as follows:
254
255 flash erase-program-boot c139-unlocked-fw.bin 2000
256 flash erase 10000 360000
257 flash program-bin 2000 c139-unlocked-fw.bin 2000
258
259 The 3 commands given above will reflash the phone as follows:
260
261 * The first 0x2000 bytes of the firmware image in c139-unlocked-fw.bin comprise
262 the boot code. This fw version features the "good" boot code *without* the
263 access locking malfeature. The erase-program-boot command will erase flash
264 sector 0 (the entire 64 KiB sector, as the physics of the flash chip dictates)
265 and then immediately reprogram its first 8 KiB with the "good" boot code from
266 the unlocked fw image file. The remaining 56 KiB of this sector will be blank
267 after this step.
268
269 * The following "regular" flash erase command is to erase the following 54
270 sectors (also of 64 KiB each) in preparation for programming the main fw
271 image in there.
272
273 * The last command programs the bulk of the fw image into blank flash that has
274 been erased by the first two commands.
275
276 I also recommend erasing the old FFS that was maintained by the old fw version,
277 so that the new fw will automatically format a "virgin" FFS the first time it
278 boots:
279
280 flash erase 370000 50000
281
282 After this procedure the phone should retain its original IMEI and factory RF
283 calibration values, as these are stored in the 8 KiB sector at 0x3FC000 which
284 is not touched per the above procedure - not in the FFS.
285
286 The same procedure should be followed for flashing all firmwares for C11x/123
287 and C139/140 phones. In the case of C11x/123, adjust the length for the "main"
288 erase and program operations appropriately for the flash configuration in your
289 phone.
290
291 Flashing newer firmware versions
292 ================================
293
294 The flashing procedure given above, where the first 0x2000 bytes of the new fw
295 image (the bootloader part) are written with the flash erase-program-boot
296 command and the regular flash program-bin command writes everything from 0x2000
297 onward, is only correct for older firmware versions whose bootloader portion is
298 completely free from the access locking malfeature: not only unlocked, but with
299 no provision for locking at all. In these older fw versions the boot code is
300 fully contained in the first 0x2000 bytes and nothing from 0x2000 onward affects
301 the ability to perform a new serial boot, hence the bricking vulnerability
302 window ends at 0x2000. However, this flashing procedure should NOT be used for
303 newer fw versions that have the provision for locking the bootloader - it's the
304 provision that matters in this case, even if the lock hasn't been activated -
305 if you flash one of these newer fw versions as above, you will risk bricking
306 your phone!
307
308 If you need to flash one of the newer fw versions that includes the bootloader
309 lock provision, you need to take some additional precautionary steps:
310
311 1. Examine the fw image you wish to flash with a hex dump viewer. Look starting
312 at offset 0x2000. You should see 3 identifying ASCII strings: one right at
313 0x2000, another at 0x2020 and one more at 0x2040. Then look at 4 bytes at
314 offset 0x2060. If they contain 0xFFFFFFFF (blank flash) like the surrounding
315 unused bytes, then you have an older fw version without the bootloader lock
316 provision - you can safely flash it as in the previous section. If it's a
317 newer fw version with the bootloader lock provision, the word at 0x2060 will
318 contain either 0x00000000 or 0xDDDDDDDD, corresponding to the activated
319 (access disabled) and non-activated (access enabled) states of the lock,
320 respectively.
321
322 2. If the fw image you wish to flash has 0x00000000 at 0x2060, you must patch
323 it to 0xDDDDDDDD with a hex editor before flashing. Just because our tfc139
324 utility can recover phones with maliciously locked bootloaders does NOT mean
325 that you should *ever* deliberately flash such a bootloader-locked fw image
326 into your phone! Recovery of locked phones via tfc139 depends on the
327 complete fw image being present and working, not just the bootloader part,
328 hence if you were to flash an image that has a lockable bootloader with the
329 lock activated, the bricking vulnerability window will extend until the
330 *entire* fw image has been programmed - far too dangerous.
331
332 3. When flashing the image with fc-loadtool, use a slightly different command
333 sequence compared to the previous section:
334
335 flash erase-program-boot new-fw-image.bin 10000
336 flash erase 10000 360000
337 flash program-bin 10000 new-fw-image.bin 10000 360000
338
339 The difference is that the boundary between the part handled with flash
340 erase-program-boot and the part handled with flash program-bin has been moved
341 from 0x2000 to 0x10000. Because the word at 0x2060 is part of the bricking
342 vulnerability window with these newer fw versions, one should rewrite the
343 entire boot sector of the flash (including the beginning of the main fw image)
344 with flash erase-program-boot for safety.
345
346 Unlocking while keeping the same fw version
347 ===========================================
348
349 Suppose you have a phone with a locked bootloader such that you had to break in
350 with tfc139, you would like to unlock it so you can use RAM-based (non-flash)
351 tools such as c139explore or OsmocomBB with it, but you have no particular need
352 to change the main fw from the original version to a different one. If you
353 need to perform such a cisversion unlock, you can do it as follows:
354
355 1. Break in with tfc139;
356 2. Use fc-loadtool's flash dump2bin command to save the first 64 KiB sector
357 of the flash to a file;
358 3. Using a hex editor, patch the word at 0x2060 from 0x00000000 to 0xDDDDDDDD;
359 4. Use fc-loadtool's flash erase-program-boot command to flash the patched
360 (unlocked) boot sector back into the phone.
361
362 C155/156 differences
363 ====================
364
365 C155/156 phones are nicer than the others in that they use a flash chip with a
366 "bottom boot" configuration. C11x/123 and C139/140 use "top boot" flash chips,
367 which is why the boot code and the first 56 KiB of the main fw image live in
368 the same erase block on those phones. The boot code and the control hand-off
369 interface between it and the main fw have also been revamped in C155/156 fw,
370 and the new structure is:
371
372 8 KiB sector at 0: contains the boot code
373 7 more 8 KiB sectors starting at 0x2000: blank and unused
374 64 KiB sector at 0x10000: also blank and unused
375 64 KiB sector at 0x20000: beginning of main fw image
376
377 With this new flash layout, it is now possible to erase and program the main fw
378 region starting at 0x20000 without ever erasing the boot code sector or doing
379 any writes to it, so there is no bricking vulnerability window at all. (The
380 phone can still be bricked though if one types the wrong command and erases the
381 boot sector inadvertently, so be careful.)
382
383 So far the only phones in this family that I laid my hacking hands on have been
384 North American C156 units, all from the same seller and batch (hence identical),
385 so I don't know if there exist any maliciously-locked boot code versions in
386 this family - the boot code in my C156 is free of any malfeatures. But if "bad"
387 versions of C155/156 boot code do exist, and if you can break into the phone
388 somehow, you can use the flash erase-program-boot command to rewrite the boot
389 code with minimal risk of bricking just like on the other Compal families.