Navigation DVD hacking
March 27th, 2009My car has a built-in navigation system with a couple of really annoying nanny features. It wants me to read an inane legal disclaimer and hit “I Agree” on the touch screen every time the car starts, and it won’t let me select new destinations, or dial a phone number, while driving. This is obviously not what customers want; it’s what car manufacturers put in to avoid being sued, and I dislike it.
So I thought I’d look into it, and see if it can be hacked in some way or another. I didn’t succeed, unfortunately, and it’s not really worth spending a huge amount of time on, but I thought I’d at least document what I did find out.
The DVD has a regular ISO9660 filesystem on it. On the file system are a bunch of .KWI files, and a directory called IDX. KWI stands for KIWI, which is an open standard that describes the format map media in car navigation systems. The standard is managed by a consortium called Kiwi-W, originally made up of Japanese car manufacturers but which now has a wider membership. The standard describing the KIWI file format(s) can be found here.
A couple of things to note:
- The map, routing and POI data on the DVD is not encrypted. You can just strings them and see places and such fly by.
- The firmware for the navigation system is also on the DVD, in the LOADING.KWI file.
Every KWI file on the DVD has its own binary format; other than a set of defined data types, they don’t really have much structure in common. The names are standard, however. Since we’re looking for the code that implements the nanny features, the LOADING.KWI file is what we need: that’s where all the code is. It’s essentially a container format, much like a ZIP file. It contains a series of modules with some metadata thrown in. I’ve written a tool (see below) to view or extract the modules from a LOADING.KWI file. This is what’s in my DVD’s LOADING.KWI file:
number of systems found: 1
System 1
Manufacturer ID: 0f 56 a3 00 3c 3c 8a 00 07 00 01 66
Number of modules in this system: 5
Module 1:
Name: V206
Version: 100J
Category: Program
Valid from: 2006-07-17
Address: 0x800
Size: 15.2 MB
Module 2:
Name: V214
Version: 100K
Category: Program
Valid from: 2006-07-17
Address: 0xF3F000
Size: 15.7 MB
Module 3:
Name: V308
Version: 100E
Category: Program
Valid from: 2006-06-09
Address: 0x1EE9000
Size: 20.5 MB
Module 4:
Name: V309
Version: 100E
Category: Program
Valid from: 2006-06-09
Address: 0x336D000
Size: 20.4 MB
Module 5:
Name: V312
Version: 100E
Category: Program
Valid from: 2006-06-08
Address: 0x47DC800
Size: 18.9 MB
The manufacturer ID shown consists of a number of fields that describe the location, in latitude and longitude, of the navigation DVD’s manufacturer’s HQ. The 13th byte, 07, means they’re on the 7th floor of the building at that location. You can’t make this stuff up.
Anyway, if we look at a hexdump of the start of the first module, called V206, this is what we see:
00000000 2E 4C 44 52 0D 0A 56 32 30 36 31 30 30 4A 0D 0A .LDR..V206100J.. 00000010 4A 75 6C 20 31 34 20 32 30 30 36 00 00 00 0D 0A Jul 14 2006..... 00000020 32 30 3A 33 35 3A 31 37 00 00 00 00 00 00 0D 0A 20:35:17........ 00000030 41 49 53 49 4E 20 41 57 20 63 6F 2E 4C 54 44 00 AISIN AW co.LTD. 00000040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
So this is some kind of header, and Aisin AW Co Ltd. is clearly the bunch on the 7th floor that made this navigation DVD. They’re also a leading member of the Kiwi-W consortium. The modules contain other interesting stuff: there are icons in there, in regular BMP format. I extracted some (you can find them by looking for the letters BM — 42 4d in hex — in the modules). They were icons I’ve seen on the navigation display.
Some of the code in there was apparently compiled with symbols. There is also lots of text to be found: debug output, various strings — and then there’s this:
00891070 67 61 E7 E3 6F 2E 00 00 44 72 69 76 65 20 73 61 ga..o...Drive sa 00891080 66 65 6C 79 20 61 6E 64 20 6F 62 65 79 20 74 72 fely and obey tr 00891090 61 66 66 69 63 20 72 75 6C 65 73 2E 0A 57 61 74 affic rules..Wat 008910A0 63 68 69 6E 67 20 74 68 69 73 20 73 63 72 65 65 ching this scree 008910B0 6E 20 77 68 69 6C 65 20 76 65 68 69 63 6C 65 20 n while vehicle 008910C0 69 73 0A 69 6E 20 6D 6F 74 69 6F 6E 20 63 61 6E is.in motion can 008910D0 20 6C 65 61 64 20 74 6F 20 61 20 73 65 72 69 6F lead to a serio 008910E0 75 73 20 61 63 63 69 64 65 6E 74 2E 0A 4D 61 6B us accident..Mak 008910F0 65 20 73 65 6C 65 63 74 69 6F 6E 73 20 6F 6E 6C e selections onl 00891100 79 20 77 68 69 6C 65 20 73 74 6F 70 70 65 64 2E y while stopped.
That’s the disclaimer, alright. The “I Agree” bit is there as well. So what you do to find the code that puts up the button and waits for the user to hit it, is note down where in the file that string is, and then look for code that references something at that location. And NOP it out.
Alas, it’s not that simple in this case: the module itself is clearly in some format I don’t know. It may well be an executable format, like ELF, or it may be a container format containing several executables and a bunch of icons. I’m not even sure what CPU the navigation system uses, so randomly looking for references isn’t going to do much good.
I don’t really have any more time to spend on this, and I really don’t want to rip the navigation unit out of the car to look at what CPU is on the motherboard. If anyone has more information, let me know. The car is a Lexus IS 220d, but other Toyota/Lexus models are likely to have the same unit.
The tool I wrote to view/extract modules from the LOADING.KWI file is called “kiwi”, and can be downloaded here. You’ll need python on your system.