Durch die Brust ins Auge auf koreanisch
21.04.2014 13:35 von Andre Grosse Bley
Artikel abonnierenDer Entwickler nutzt für die Entwicklungs- und Testphase sehr gerne eine serielle Schnittstelle, um Statusmeldungen oder die Ausgaben vom Betriebssystem einfach abgreifen zu können. Wird das Gerät so ausgeliefert, erlangt der Bastler mehr Informationen und eventuell sogar Zugang, als er eigentlich erlangen sollte. Ergo: Schnittstelle deaktivieren. Aber wie?
Naheliegend wäre es, die Ausgaben zu unterbinden. Also dem Betriebssystem nicht mehr mitteilen, dass Ausgaben der Console auf ttySx sollen. Der Software dieses ebenso unterbinden. Oder zumindest das zugehörige Device File durch ein Null Device ersetzen. Oder im Bootloader die Schnittstelle gar nicht mehr initialisieren? Die letzten beiden Ideen lassen sich allerdings recht leicht rückgängig machen.
Hardwareseitig könnte man im Layout einfach die Leitungen nicht mehr von dem 1024 pin BGA rausführen. Erschwert den Zugang zur Schnittstelle.
Vielleicht setzt man ein SoC eines Herstellers mit Paranoia-Funktion ein? Die passende Fuse setzen, und schon wird die Schnittstelle irreversibel von den Pins getrennt.
Nehmen wir nun einen Hersteller, der die Schnittstellen auf eine passende Stiftleiste legt und diese sogar bestückt. Freundlicherweise wird die Schnittstelle sogar mit UART beschriftet. Die Belegung ist schnell mit dem Oszilloskop ermittelt, da doch viel erzählt wird.
SMT-G7400 UBOOT 00.58 (Mar 7 2012 - 08:59:12) DRAM: 128 MB Spansion S25FL129P flash found Spansion S25FL129P flash found Flash: 32 MB Read Marvell EEPROM Interrupt Phy patch & Switch 1000 Full Duplex Setting is done ####### SMT-G7400 UBOOT V00.58 ####### *** ACTIMAGE = 2, will try to boot UBFI2 stored @0x4c000000 *** UBFI2 bootscript executed successfully. Start booting... Data Size: 9389120 Bytes = 9 MB Verifying Checksum ... OK OK Starting kernel ...
Famous last words. Nach dem Starting Kernel kommen nur noch CRs in loser Folge. Die Console ist quasi abgetaucht. CRs als Luftblasen?
Erste Idee - wird der Port vom Kernel für etwas anderes verwendet? Denkste! Im Flash - es ist in zwei Blöcken organisiert, um nach einem fehlgeschlagenen in-field-Update hoffentlich noch die vorherige Version starten zu können - ist noch eine ältere Version, mit der die Hardware ausgeliefert wurde. Im aufgetauchten Zustand dem U-Boot befohlen, diese zu starten.
*** ACTIMAGE = 1, will try to boot UBFI1 stored @0x48040000 *** UBFI1 bootscript executed successfully. Start booting... Data Size: 9392192 Bytes = 9 MB Verifying Checksum ... OK OK Starting kernel ... init started: BusyBox v1.15.2 (2013-03-25 09:33:33 KST) starting pid 653, tty '/dev/tts/0': '/etc/init.d/rcS > /dev/console 2> /dev/console' [....................]
Gut, keine Meldungen vom Kernel, aber das Userland redet. Und startet sogar ein "CLI", welches aber keinen Befehl annimmt.
Netterweise hat Samsung seine Änderungen im GPL-Paket oftmals markiert.
gandalf@akasha kernel: grep -r SAMSUNG_BTYPE * [...] 8250.c-static void serial8250_console_putchar(struct uart_port *port, int ch) 8250.c-{ 8250.c- struct uart_8250_port *up = (struct uart_8250_port *)port; 8250.c- 8250.c- wait_for_xmitr(up, BOTH_EMPTY); 8250.c:#if defined(SAMSUNG_BTYPE_REL) /* disable console messages */ 8250.c- serial_out(up, UART_TX, '\r'); 8250.c-#else 8250.c- serial_out(up, UART_TX, ch); 8250.c-#endif 8250.c-} -- serial_core.c- serial_core.c-static void uart_put_char(struct tty_struct *tty, unsigned char ch) serial_core.c-{ serial_core.c- struct uart_state *state = tty->driver_data; serial_core.c- serial_core.c:#if defined(SAMSUNG_BTYPE_REL) serial_core.c- __uart_put_char(state->port, &state->info->xmit, '\r'); serial_core.c-#else serial_core.c- __uart_put_char(state->port, &state->info->xmit, ch); serial_core.c-#endif serial_core.c-} -- [...] -- [...] serial_core.c:#if defined(SAMSUNG_BTYPE_REL) serial_core.c- p = circ->buf + circ->head; serial_core.c- for (i=0; i<c; i++) *p++ = '\r'; serial_core.c-#else serial_core.c- memcpy(circ->buf + circ->head, buf, c); serial_core.c-#endif [...]
Kommentare
Kommentar von Pucciano | 14.06.2015
Hallo!
Wie genau hast du den das Board zum laden der alten image gebracht?
Selbst einen Break ignoriert die Console mit bravur.
Ist denn mitlerweile moeglich auf die Console normal zuzugreifen?
Ich versuche auf die variable SAMSUNG_BTYPE_REL zuzugreifen und diese zu aendern, jedoch ohne Erfolg :(
Lieben Grus,
ein weiterer Bastler xD
Einen neuen Kommentar schreiben