touch MAX

получи максимум — личный блог "тыж программиста"

Запуск ssh на прошивке JBL 9.1

Прошло примерно 3 года с момента покупки JBL 9.1, после очередных обновлений стал замечать, что устройство перегревается, а когда подвинул бар увидел, что под ним вспучилось покрытие тумбы. Плюс к этому, саундбар сам просыпался после перехода в режим в Standby и продолжал работать все время (в случайное время бар просыпался с надписью HELLO TV). Ну и вишенка на торте: из-за постоянно работающего бара, сурраунд колонки не переходили в режим ожидания и не заряжались, поэтому (даже ночью) на экране бесконечно бегала строчка «REAR SPKR LOW BATT»

перегрев jbl 9.1

Решил улучшить охлаждение «аппаратно» и «програмно».

Аппаратное охлаждение

Спойлер — не сильно помогло

Разобрал саундбар, для этого пришлось открутить 2 десятка винтов:

Содержимое бара модульное: каждая плата соединяется шинами и удобно отключается. Сам процессор Mediatek 8531 прикрыт малюсеньким радиатором (черный ребристый):

Выше процессора белый разъем, UART(скорость 921600). Разъем PH 2.0MM, 4P, 100MM

Просверлил отверстия рядом с процессором (вывел оттуда UART выводы) и отверстия рядом с HDMI:

Проблема не ушла — панель оставалась очень горячей, температура, скорее всего, понизилась всего на пару градусов. Опционально можно заменить радиатор, но нужен фен чтобы отклеить его от процессора.

«Программное» охлаждение

Спойлер, пока не помогло

Идея была, забраться внутрь устройства по SSH и отключить ненужные сервисы, в идеале (вместо разработчиков JBL) починить просыпание устройства в случайное время.

Первым делом скачал прошивку и распаковал ее с помощью 7zip — внутри Linux для ARM устройств, радовало, что все сервисы типа SSH, Telnet установлены, но не активированы. И конечно очень радует строчка «root::0:0:root,,,:/root:/bin/sh» внутри /etc/passwd, который разрешает работу под пользователем root без пароля. Не смотря на простую распаковку, сама прошивка состоит из нескольких разделов и все они подписаны JBL:

Для обновления прошивки нужно использовать флешку отформатированную в FAT32, в корне нужно создать папку UPG, внутрь положить файл прошивки с именем upgbinary.bin, нажать на самом баре POWER и VOL- и держать 10 сек.

Мою модифицированную прошивку bar видел, но после проверки ключей писал «NO FIRMWARE».

Основной программной оболочкой является приложение bdpprog (похоже, это стандартное имя прошивок написанный на SDK от MediaTek как я выяснил чуть позже), оно порождает множество резидентных сервисов для обработки HDMI сигнала, звука и даже обновления прошивки.

Решил провести анализ приложения через декомпилятор Binary Ninja и начал с поиска по ключевым словам связанным с SSH и бинго!

Сервис SSH будет запущен при отсутствии файла /mnt/ubi_boot/ssh_service_block.txt

Но до самого файла пока не добраться.

Начал искать другие интересные TXT файлы и они нашлись, это: HM-SECURE-MODE.txt, Harman_Soundbar.txt, они ищутся на примонтированной флешке, но должны содержать неизвестные спец параметры, которые парсятся системой (может кто-то их найдет?), например:

<bhy> not hotel mode <F=%s,FU=%s,L=%d>

Добавление с этими именами пустых файлов на флешку, ни к чему не привели.
Продолжил искать, на этот раз скриптов, которые могут автоматически стартовать при старте системы, искал «auto» и бинго номер два!

Начал искать в Google, что за скрипт автостарта AutoScript добавил MTK SDK и нашел старые сообщения на формах об изменении прошивок Blu-ray плееров, там как раз использовались команды, которые автоматически исполняются средой.

Пример:

#MTKAT 0.xx script
CLI (CLI_exec echo root :: 0: 0: root ,,,: / root: / bin / sh> / etc / passwd)
CLI (CLI_exec / usr / sbin / inetd &;)
SLEEPMS (1000 )
CLI (CLI_exec / usr / sbin / telnetd &;)
#For NFS
# CLI (CLI_app.vfdmg.b scroll_msg start)
# CLI (CLI_exec mount -o nolock, proto = udp 192.168.0.1:/Video mnt / sda1 / Video )
# CLI (CLI_exec mount -o nolock, proto = udp 192.168.0.1:/Bilder mnt / sda1 / Bilder)
# CLI (CLI_exec mount -o nolock, proto = udp 192.168.0.1:/Musik mnt / sda1 / Musik)
# For SMB
CLI (CLI_exec mount.cifs //192.168.0.103/Video mnt / sda1 / Video -o user = ****, password = ****, ro)
CLI (CLI_exec mount.cifs //192.168.0.103/ Photo mnt / sda1 / Photo -o user = ****, password = ****, ro)
CLI (CLI_exec mount.cifs //192.168.0.103/Music mnt / sda1 / Music -o user = ****, password = ****, ro)
# CLI (CLI_app.vfdmg.b clear_msg)
CLI (CLI_exec mount > /mnt/sda1/mount.txt)

А вдруг сработает?!
Осталось дело за малым — модифицировать скрипт, подобрав нужные параметры и пути, скопировать на флешку и подключить в бар.

И он сработал! В итоге я запустил SSH на JBL 9.1

На данном чипе собраны серия Blu-ray плееров, например, OPPO BDP 95 и саундбары LG, например, SN7Y, так что теоретически на них можно сделать тоже самое 😎

На github вся вытянутая с устройства информация; итого чтобы запустить SSH нужно:

  • Отформатировать в FAT32 usb флешку, лучше старую на 4-8Гб
  • Скопировать всю папку AutoScript в корень флешки (остальные файлы не нужны)
  • Вставить в саунбар, подождать минут 5, на флешку скопируются все разделы NAND (файлы с расширением .bin это бэкап) и создадутся несколько текстовых файлов.
  • Все, можно вынимать флешку и выключить из розетки саунбар, включить
  • Можно подключаться по SSH, например, через Putty — IP бара, порт 22, user: root, password: пусто

Скрипт AutoScript копирует разделы NAND на USB, удаляет файл ssh_service_block.txt, стартует SSH и блокирует обращение к storage.harman.com, чтобы JBL не обновил прошивку.

Основные интересные папки:

/acfg — содержит конфигурацию SDK от Mediatek, файлы сохраняются после перезагрузки

/mnt/ubi_boot — содержит данные при калибровки помещения, настройки ChromeCast и AirPlay, файлы сохраняются после перезагрузки

/var — содержит настройки сети, файлы сохраняются после перезагрузки (находится внутри раздела ubi)

/mnt/sda1 — примонтированный usb диск

Сервисы которые можно убить (опционально) без последствий (выключит ChromeCast, AirPlay, Bluetooth):

/system/chrome/cast_cli stop cast
/etc/mdnsd.sh stop
kill WACServer
kill airplaydemo
kill c4a_adpater_server
kill btservice

Если создать пустой файл в папке /var/AirPlayBCT, то ChromeCast и c4a_adpater_server не будут стартовать при загрузке.

Выключение лишних сервисов (список выше) не привело к уменьшению температуры, основная проблема остается в том, что после выключения тв, саундбар снова просыпается и основной сервис bdpprog продолжает грузить процессор на 30% (возможно питание подается на силовые узлы и бар бесконечно «декодирует и проигрывает тишину», в прошивке встречаются строчки «fake standby«), что сказывается на температуре бара. Пока у меня нет UART кабеля, не понятно, что за сервис будит саундбар и почему он, видя, что сигнала по HDMI больше нет, не засыпает снова.

Теперь на помощь призывается сообщество чтобы модифицировать bdpprog или менять настройки /acfg бара через SSH (выключить наконец навсегда SMART MODE), интересным еще видится debug режим, который может накладывать на изображение доп информацию о видео сигнале и формате звука, теоретически бар может проигрывать и видео файлы, стать полноценным плеером, в прошивке есть тестовый режим с проигрыванием mkv файлов (пока не удалось проверить) 😁 

Файлы можно скачать на github

Лог загрузки устройства

preloader_v.42133
[nand] ckgen=0x0, _fgUsingDMA:0x0 
[fgBootLoaderHeaderVerification] read page correcte able and read success
dosf!
dop!
[N0]
OCTV 29, OFTV 28
[N1]
Err
[N2]
Err
[N0]
DDV=0x15
fs=5 tp=19 bs=7
[N1]
DDV=0x15
Err
fs=5 tp=255 bs=0
[N2]
DDV=0x15
Err
fs=5 tp=255 bs=0
DN0 101
DN1 Err
DN2 Err
DRAM_CHA_I6BIT
[nand] ckgen=0x3, _fgUsingDMA:0x1 
NSBC
1300, 1728, 1188 
DRS:  512 MB
RI: 0x2c 0xdc 0x80 0xa6 0x62 0x0
FMB 512
r_args_to_uboot:
	head sig	: 0xa0b0ead1
	version	: 1
	boot type	: 0
	dram ch1	: 0x20000000
	dram ch2	: 0x00000000
	kern addr	: 0x060fffc0
	initrd addr	: 0x0f000000
	initrd size	: 0x002e63b0
enable bim two way write.
[uboot_LED] tonly led init.
[uboot_LED] first power on.
channel A hole size is 0x0
Bootloader version 38946
 uboot print ch size,r_args_to_uboot.u4_dram_size_ch1=20000000,r_args_to_uboot.u4_dram_size_ch2=0
ÌÌÌÌÌÌÌ̪ªªªªªÿª
Hit any key to stop autoboot:  0 
<<MTK:8551>>
[TRUST ZONE]copy tz binary to 0e700000, SbinImagesize:0x578c4, sbinfullsize:0x209226, svp size:0x600000, mem size:0x900000
bootargs:root=/dev/ram0 rw initrd=0x0f000000,0x002e63ae console=ttyMT0  mem=512M isolcpus=2,3 isolcpus=2,3 drvmem=259M,41M,0M BL_Ver=38946 androidboot.console=ttyMT0 androidboot.hardware=wutang  tz_mem=9437184 
## Booting kernel from Legacy Image at 060fffc0 ...
   Image Name:   
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    3245504 Bytes =  3.1 MB
   Load Address: 06100000
   Entry Point:  06100000
   Loading Kernel Image ... OK
OK
Starting_kernel...
Uncompressing Linux... done, booting the kernel.
[    0.000000] Booting Linux on physical CPU 0x0
[    0.000000] 
[    0.000000] Linux version 4.9.134 (chenzhijun@ubuntu203) (gcc version 4.8.2 20131014 (prerelease) (Linaro GCC 4.8-2013.10) ) #1 SMP PREEMPT Thu Feb 9 10:11:52 HKT 2023
[    0.000000] 
[    0.000000] CPU: ARMv7 Processor [410fd032] revision 2 (ARMv7), cr=10c5383d
[    0.000000] 
[    0.000000] CPU: div instructions available: patching division code
[    0.000000] 
[    0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
[    0.000000] 
[    0.000000] Machine: mt85xx
[    0.000000] 
[    0.000000] [TRUST ZONE]reserved tz mem size is 0x900000
[    0.000000] === mt85xx_reserve_mem 0x20000000=== 
[    0.000000] 
[    0.000000] === mt85xx_mon_mem 0x6000000 0x100000=== 
[    0.000000] 
[    0.000000] === mt85xx_sbin_mem 0xe700000 0x900000=== 
[    0.000000] 
[    0.000000] Memory policy: Data cache writealloc
[    0.000000] 
[    0.000000] BUG: not creating mapping for 0x00002000 at 0x0d002185 in user region
[    0.000000] 
[    0.000000] [kernel zone size]DMA: 204800KB, NORMAL: 319488KB
[    0.000000] get_core_count val = 4
[    0.000000] 
[    0.000000] enable log
[    0.000000] 
[    0.000000] enable cli input
[    0.000000] 
[    0.000000] percpu: Embedded 14 pages/cpu @9fabe000 s24960 r8192 d24192 u57344
[    0.000000] 
[    0.000000] Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 127488
[    0.000000] 
[    0.000000] Kernel command line: root=/dev/ram0 rw initrd=0x0f000000,0x002e63ae console=ttyMT0  mem=512M isolcpus=2,3 isolcpus=2,3 drvmem=259M,41M,0M BL_Ver=38946 androidboot.console=ttyMT0 androidboot.hardware=wutang  tz_mem=9437184 
[    0.000000] 
[    0.000000] PID hash table entries: 2048 (order: 1, 8192 bytes)
[    0.000000] 
[    0.000000] Dentry cache hash table entries: 65536 (order: 6, 262144 bytes)
[    0.000000] 
[    0.000000] Inode-cache hash table entries: 32768 (order: 5, 131072 bytes)
[    0.000000] 
[    0.000000] Memory: 454528K/514048K available (5120K kernel code, 207K rwdata, 1320K rodata, 1024K init, 433K bss, 59520K reserved, 0K cma-reserved, 0K highmem)
[    0.000000] 
[    0.000000] Virtual kernel memory layout:
[    0.000000]     vector  : 0xffff0000 - 0xffff1000   (   4 kB)
[    0.000000]     fixmap  : 0xffc00000 - 0xfff00000   (3072 kB)
[    0.000000]     vmalloc : 0xa0800000 - 0xff800000   (1520 MB)
[    0.000000]     lowmem  : 0x80000000 - 0xa0000000   ( 512 MB)
[    0.000000]     pkmap   : 0x7fe00000 - 0x80000000   (   2 MB)
[    0.000000]     modules : 0x7f000000 - 0x7fe00000   (  14 MB)
[    0.000000]       .text : 0x80008000 - 0x80600000   (6112 kB)
[    0.000000]       .init : 0x80800000 - 0x80900000   (1024 kB)
[    0.000000]       .data : 0x80900000 - 0x80933d60   ( 208 kB)
[    0.000000]        .bss : 0x80935000 - 0x809a174c   ( 434 kB)
[    0.000000] 
[    0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=4, Nodes=1
[    0.000000] 
[    0.000000] Preemptible hierarchical RCU implementation.
[    0.000000] 
[    0.000000] 	Build-time adjustment of leaf fanout to 32.
[    0.000000] 
[    0.000000] NR_IRQS:320
[    0.000000] 
[    0.000000] WDT_EN=0x0
[    0.000000] 
[    0.000000] WDTSTA=0x0
[    0.000000] 
[    0.000000] === timer_set_state_shutdown mode
[    0.000000] 
[    0.000000] === timer_set_state_periodic mode
[    0.000000] 
[    0.000000] __cpuxgpt_set_clk fwq  div is  0x200 
[    0.000000] 
[    0.000000] set_cpuxgpt_clk: reg(200) 
[    0.000000] 
[    0.000000] enable_cpuxgpt: reg(203) 
[    0.000000] 
[    0.000000] === timer_set_state_shutdown mode
[    0.000000] 
[    0.000000] arm_arch_timer: WARNING: Invalid trigger for IRQ29, assuming level low
[    0.000000] 
[    0.000000] arm_arch_timer: WARNING: Please fix your firmware
[    0.000000] 
[    0.000000] arm_arch_timer: WARNING: Invalid trigger for IRQ30, assuming level low
[    0.000000] 
[    0.000000] arm_arch_timer: WARNING: Please fix your firmware
[    0.000000] 
[    0.000000] arm_arch_timer: Architected cp15 timer(s) running at 13.50MHz (phys).
[    0.000000] 
[    0.000000] clocksource: arch_sys_counter: mask: 0xffff

Всем мира!

, ,