Durch die Brust ins Auge auf koreanisch

21.04.2014 13:35 von Andre Grosse Bley

Artikel abonnieren
-Werbung-

Der 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
[...]

Zurück

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