Пользователь
192,0
рейтинг
12 декабря 2013 в 15:55

Разработка → Запускаем Ubuntu и смотрим Torrent и Torrent-TV прямиком на Samsung SmartTV

image
После прочтения комментария от awoland во вчерашней статье Как SmartTV забыли о главном, я сразу полез пробовать получить root-права и telnet/ssh на своем телевизоре. Оказывается, все уже готово для этого, и это проще простого!

Достаточно установить Виджет SamyGo, и он все сделает за вас!

Что дает нам SamyGO?

  • Root-доступ на ТВ через Telnet
  • Виртуальную флешку, монтирование NFS, Samba, FTP на нее
  • Samba, FTP-серверы
  • Apache2 с PHP
  • rtorrent
  • Уйму веселья!


# -*- DISCLAIMER -*-
Все, что вы делаете со своим ТВ, вы делаете на свой страх и риск. Автор этой статьи не несет никакой ответственности за ваш анал.

Для моего ТВ (E-серия), мне необходимо было:
  1. Установить Skype на ТВ и запустить его 1 раз
  2. Скачать инсталлятор виджета SamyGo на флешку
  3. Запустить его с флешки
  4. ???
  5. PROFIT!

Как они это сделали, демоны?

Вот как выглядит скрипт инсталлятора:
Скрытый текст
var Main = {  }

var widgetAPI = new Common.API.Widget();        
var tvKey = new Common.API.TVKeyValue();

var runf1=1;
var runf2=1;
var LabelString="Log:
";
var usbPlugin;
var FilePlugin;
var nUSBCount;
var commonFilePath;

Main.onLoad = function() 
{             
    alert("Main.onLoad()");
    this.enableKeys();
    widgetAPI.sendReadyEvent();             
    Func();
};

Main.onUnload = function()
{

};

Main.enableKeys = function()
{
	document.getElementById("anchor").focus();
};

Main.keyDown = function() 
{            
    var keyCode = event.keyCode;

	switch(keyCode)
	{
		case tvKey.KEY_RETURN:
		case tvKey.KEY_PANEL_RETURN:
			widgetAPI.sendReturnEvent();
			break;
		case tvKey.KEY_RED:
			if(runf2==1) 
				{
				 runf2=0;
				 Log ("
Please Wait 20-30 sec....");
				 setTimeout("Func1(commonFilePath);",3000);
				}
			 else Log('Activated yet!');
			break;
		case tvKey.KEY_ENTER:
		case tvKey.KEY_PANEL_ENTER:
			if(runf1==1)
			   {
				runf1=0;
				Log ("
Please Wait  20-30 sec....");
				setTimeout("Func1(commonFilePath);",3000);
			   }	
			 else Log('Activated yet!');
			
			break;
		default:
			alert("Unhandled key");
			break;
	} 
};

function Log(Str)
{
	var Label = document.getElementById("LogLabel");
	LabelString = LabelString+Str+"
";
	widgetAPI.putInnerHTML(Label,LabelString);
};

function sleep(ms) 
{
	ms += new Date().getTime();
	while (new Date() < ms){}
};

function Func() 
{
	usbPlugin = document.getElementById("pluginStorage");
	FilePlugin = document.getElementById("pluginObjectFile");
	nUSBCount = eval("usbPlugin.GetUSBListSize()");
	var Param;
	var r1=0;
	var r2=0;
	var r3=0;

	Log("Found <b style='font-size:30px; color:green'>" + nUSBCount + "</b> USB devices");
    for (var i = 0; i < nUSBCount; i++)
    {
        var nid1 = eval("usbPlugin.GetUSBDeviceID("+i+")");
        var nid = parseInt(nid1);
        var VN = "
Vendor Name = <b style='color:green'>" + eval("usbPlugin.GetUSBVendorName("+nid+")") + "</b>";
        var MN = "
Model Name = <b style='color:green'>" + eval("usbPlugin.GetUSBModelName("+nid+")") + "</b>";
        nPartition = eval("usbPlugin.GetUSBPartitionNum("+nid+")");
        for (var j = 0; j < nPartition; j++) 
        {
        	var mntPath = eval("usbPlugin.GetUSBMountPath("+nid+", "+j+")");
            commonFilePath = '/dtv/usb/' + mntPath; 

            Param = "FilePlugin.IsExistedPath(commonFilePath + '/InstallSamygo/data/SamyGO.zip')";
            r1 = eval(Param);
            Param = "FilePlugin.IsExistedPath(commonFilePath + '/InstallSamygo/data/AutoStart')"; 
            r2 = eval(Param);
            Param = "FilePlugin.IsExistedPath(commonFilePath + '/InstallSamygo/data/libSkype.so')"; 
            r3 = eval(Param);
            if (r1 == 1 && r2 == 1 && r3 == 1)
            	{
            		Log("The installation files found on USB: " + commonFilePath + VN + MN);
            		return;
            	}
              else 
            	{
          			Log("Some installation files not found on USB: " + commonFilePath + VN + MN);
          			return;
            	}
        }
       Log("The installation files not found on USB: error");
    }   
};

function Func1(Path) 
{

	var r=0;
	var Param;
	var str =''; 

    Param="FilePlugin.Copy ('"+ Path +"/InstallSamygo/data/AutoStart','/mtd_rwcommon/moip/engines/Skype/AutoStart')";
    r = eval(Param);
    if (r==1) str = 'OK'; else str = 'No';
    Log("Step1: " + str)

    Param="FilePlugin.Copy ('"+ Path +"/InstallSamygo/data/libSkype.so','/mtd_rwcommon/moip/engines/Skype/libSkype.so')";
    r = eval(Param);
    if (r==1) str = 'OK'; else str = 'No';
    Log("Step2: " + str);

    if(runf2==1)
     {
      Param="FilePlugin.Unzip('"+ Path +"/InstallSamygo/data/SamyGO.zip','/mtd_rwcommon/widgets/user/SamyGO/')";
      r = eval(Param);
      if (r==1) str = 'OK'; else str = 'No';
      Log("Step3: " + str);
     } 
    Log("Now press exit and restart tv");	
};

Уязвимость в функции FilePlugin.Copy, вызываемой через eval, которая позволяет копировать что угодно куда угодно. Скрипт берет и копирует подмененный libSkype.so, который умеет только запускать другой скрипт, и устанавливает сам виджет SamyGo.

Что же в виджите SamyGo?
Скрытый текст
var Main = {                    
}

var widgetAPI = new Common.API.Widget();        
var tvKey = new Common.API.TVKeyValue();

Main.onLoad = function() {             
    alert("Main.onLoad()");
    widgetAPI.sendReadyEvent();             
    document.getElementById("anchor").focus();   
                                                 

     var FilePlugin = document.getElementById("pluginObjectFile");
     var Param1="FilePlugin.Copy (\"/proc/self/cmdline\", \"$(sh /mtd_rwcommon/widgets/user/SamyGO/data/run.sh)/tmp/cmdline\")";
     eval(Param1);  	 
}

Main.keyDown = function() {            
    var keyCode = event.keyCode;
    alert("Main Key code : " + keyCode);

    switch (keyCode) {
        case tvKey.KEY_RETURN:
            break;
    }
}

Ну это вообще пушка! Мы можем выполнять shell-команды из все той же функции, используя $()-синтаксис.
run.sh выполняет инсталляцию busybox и прочей мишуры, монтирует data.xfs, запускает telnetd и nc, который запускает sh при коннекте (если будут какие-то проблемы с /dev/pts и к telnet нельзя будет подключиться), запускает подобия init-скриптов.

Что внутри?

Внутри у нас 2-ядерный процессор с архитектурой ARMv7, с поддержкой NEON, я полагаю, семейства Cortex-A8, видео MALI 400, 512МБ оперативной памяти, ядро 2.6.35.13. В общем, довольно типичный «планшет» 2012 года.
cat /proc/cpuinfo
VDLinux#> cat /proc/cpuinfo
Processor       : ARMv7 Processor rev 0 (v7l)
processor       : 0
BogoMIPS        : 1794.04

processor       : 1
BogoMIPS        : 1794.04

Features        : swp half thumb fastmult vfp edsp neon vfpv3 
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x3
CPU part        : 0xc09
CPU revision    : 0

Hardware        : amber3
Revision        : 0000
Serial          : 0000000000000000

Ядро поддерживает SquashFS, FAT32, XFS, RFS (Самсунговская ФС, FAT32 + журналирование), NTFS (Драйвер tntfs от Tuxera). Есть поддержка модулей, в SamyGo поставляются несколько модулей ФС, FUSE загружается, а, например, ext2/3/4 — нет, т.к. в ядре нет символов для них.

На ТВ запущен самый обычный X-сервер с xf86-video-mali, за весь SmartTV отвечает 125-мегабайтный файл exeDSP (загружался в IDA PRO 17 минут до начала анализа), а вот со звуком интересней: alsa нет, и, похоже, exeDSP общается с /dev/system напрямую.

Что можно делать-то?

Да что угодно. Я лентяй, и стараюсь лишний раз не кросс-компилировать что-либо, поэтому просто взял Ubuntu Core, создал на флешке XFS-раздел, распаковал туда Ubuntu и вставил в ТВ. С armhf-версией были проблемы (всякие unknown instruction, там компилируют с thumb2?), поэтому нашел 12.04 armel.
Остается только вставить флешку в ТВ, подключиться по telnet и сделать:
chroot /dtv/usb/sda1 /bin/bash

И мы получим полноценную убунту 12.04.
mount --bind не работает, поэтому, если вам нужен proc и sys в chroot (а он вам будет нужен), используйте:
mount -t sysfs sysfs ./sys
mount -t proc proc ./proc


Первым делом, я, конечно же, поставил mplayer. И знаете, работает! Медленно, конечно, и из выводов только x11 работает, но показывает! Я посмотрел вчерашний опенинг с субтитрами и без звука ;)


Скриншотов, вот, scrot'ом поснимал:
image
image

Прошу обратить внимание, разрешение скриншотов я не менял, и, на самом деле, разрешение у ТВ (по крайней мере у X-сервера) 1280×720!

Ну а дальше я решил поставить Ace Stream Engine и AceProxy для просмотра ТВ-стримов и Torrent прямо на ТВ. Для этого нам необходим Python, т.к. именно на нем написаны эти два продукта. Т.к. Ace Stream официально не выпускается для ARM, да и вообще, его разработчики несколько дикие, то мы возьмем распакованную версию для Raspberry PI, ну а AceProxy из моего репозитория

Собственно, нужные пакеты для Ace Stream написаны в ссылке, а для AceProxy нужен только python-gevent. Запускаем все это дело, можно даже открыть страницу статистики AceProxy во встроенном браузере ТВ:
image

На удивление, Ace Stream не особо грузит процессор (где-то на 15% судя по top), так что его вполне можно использовать на ТВ.
Теперь остается только взять какой-нибудь плеер (nStreamLmod, например) и сделать плейлист для AceProxy.

Что-то еще?

Это все proof-of-concept. Я все это делал чисто из кратковременного интереса и, скорее всего, не буду продолжать дальше. Однако, если кто-нибудь подопнет меня, как происходит работа со звуком, то можно будет смотреть видео с FLAC и Vorbis в MKV, просто запуская их вместе.
Будьте осторожны с SamyGo. По умолчанию, он запускает много сервисов, и доступ по telnet осуществляется без пароля.
Успехов!
Влад @ValdikSS
карма
621,0
рейтинг 192,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (66)

  • +15
    У Вас получился свой Smart-TV с блэкджеком и… torrent stream!

    • +2
      А биткоины можно на нем майнить?
      • +12
        Один не справится. Только в пуле с утюгами и холодильниками.
      • +7
        Только ситкомины
  • +38
    Я в своё время ржал над теми, кто говорил, что в будущем придумают вирусы, способные заразить телевизор. Теперь мне стыдно…
    • +9
      Да телевизор то ладно, а вот заражение утюга, например, или холодильника имеет более ощутимые последствия.
      • +5
        Телевизор тоже не плохо, учитывая что в нем есть веб-камера и в теории можно настроить трансляцию видео со спальни в интернет )
        • +1
          Недавно был в крупном гипермаркете бытовой техники — там со встроенными камерами только пара-тройка топовых моделей была. Для остальных со смартТВ — камеру нужно покупать отдельно.
          • +23
            Лет 15 назад был в крупном гипермаркете бытовой техники — там LCD-телевизоров пара-тройка топовых моделей, с низким разрешением и весом с холодильник. Остальные — обычные кинескопы.
            • +7
              Намек понял :)
        • +3
          Имеет смысл снова начать накрывать телевизор на ночь салфеткой?
          • +3
            Проще уж камеру залепить синей изолентой.
            • 0
              А микрофоны?
              • 0
                Тоже.
                Ну можно, конечно, залезть туда с паяльником, но залепление внешних отверстий должно очень сильно ослабить сигнал.
      • +2
        Или электроодеяла.
      • +1
        А вот если объединить заражённые утюги в ботнет…
    • +3
      Вирусы — то ладно, а вот трояны, заложенные производителем (была на хабре недавно тема).
  • +1
    Ради AсePlayer заморочусь наверное. Слог повествования у вас интересный.)
  • +14
    Странное заявление, или я такой пошлый…
    >>Автор этой статьи не несет никакой ответственности за ваш анал.
    • +18
      Но ведь и правда не несет.
      • 0
        Модератор мне изменил «анал» на «действия». Бред какой-то.
        • +6
          Хм. Наоборот было бы еще более странно, нет?
  • +3
    Вот бы такое сделать для LG Smart TV (2012, 2013 годов выпуска)
    • 0
      Это не очень сложно. Я делаю так:
      1) /usr/bin/acestreamengine --log-file /dev/null --client-console --live-buffer 30 --cache-limit 2
      2) vlc -I telnet --clock-jitter 0 --network-caching 500 --sout-mux-caching 500 --telnet-password admin
      3) python acehttp.py (https://github.com/ValdikSS/aceproxy)
      4) в Mediatomb добавляю item:
      Title: Torrent stream
      URL: http://<ubuntu_host>:8000/pid/<torrent_stream_hash>
      class: object.item.videoItem
      Mimetype: video/H264
      5) через телек захожу в mediatiomb и запускаю Torrent stream
      • 0
        Это понятно, но это не то что в топике описано.
        Я про то как в LG Smart TV аналогично telnet завести и прочие радости.
        • 0
          Согласен, было бы просто прекрасно. Я пока нашел только как с помощью светодиода попасть в инженерное меню. Но там нет одной очень важной и необходимой мне плюшечки — ограничения максимального уровня громкости. Дедушка глуховат (наушники не переваривает) и жмет на пульте кнопку есс-но повышая громкость до 100. Решил проблему — поставил приставку с T2 и на ней установил маленькую громкость. Теперь телек постоянно на 100 )
          • +1
            Подскажите, пожалуйста, как попасть в инженерное меню при помощи светодиода на LG LA620V (2013 Smart TV).
  • +6
    хочеца XBMC
  • +1
    А я специально купил телевизор без смарт TV, а теперь не могу выбрать Mini PC для него. Открыл, даже, вопрос на тостере, но никто не отвечает :( Люди только подписываются на вопрос, видать тема актуальна.
    • +26
      Никто не отвечает, т.к. туда теперь ходят только спрашивать…
      • +21
        На q&a лучше было…
    • +1
      Вопрос: а для чего именно линукс, почему бы сермяжный андроид не оставить? Все-таки андроид ловчее подходит для подобных вещей, интерфейсы приложений более подходящие для «грубого» управления чем-то типа ДУ с air mouse. Как человек, у которого в спальне свисток с андроидом, а в гостиной — медиацентр с xbmcbuntu, скажу что все-таки с андроидом все же лучше.
      Понятно, что если цель превратить ТВ в еще один компьютер, то нужен линукс.
      • +2
        Доверия к линуксу как-то больше и привычнее он. Я как бывший пользователь китайского планшета очень сомневаюсь в возможностях андроида воспроизводить флэш как и в скорой кончине второго.
        Нет, если андроид лучше для этого подходит, то можно и на нём, возможно дело привычки. Чем вам xbmcbuntu не нравится?
        • 0
          Ну, для поднятия линукса на каком-нибудь рокчипе нужно с бубном протанцевать. Касаемо флеша, в моем случае флеш проигрывался, но с определенными неудобствами (теми же что и у «большого убунту» — нужно целиться в маленькие контролы), решилось подбором соответствующих приложений. Например, все видео я смотрю через FS Videobox (чисто наш внутриукраинский кинозал, фронтенд к fs.to, есть и плагином к xbmc, но приложение получше будет). В принципе, для России киноприложений может и поболее будет. Так что свой flash я из андроида выдрал.

          Касаемо xbmcbuntu — всем нравится, обожаю эту штуку. Другое дело что со временем за собой заметил, что кроме xbmc я в ней ничего вообще не запускаю — потому что запуск браузера, приложений и т.д. превращается в охоту за контролами. А увеличение dpi не выход. То есть если сначала пускал браузеры, нативные приложения и т.д., то со временем линукс стал только фронтэндом для xbmc.

          p.s. На моем андроид-свистке с удовольствием работает тот же xbmc, использует ту же базу что и «большой» xbmc (перенесена на NAS), т.е. у меня в итоге получается андроид-свисток более функционален.
          • 0
            Ну, для поднятия линукса на каком-нибудь рокчипе нужно с бубном протанцевать.
            Ну, вроде бы, подо все сейчас есть мануалы готовые по установке Линукса в N шагов.
            • 0
              Да дело вроде не в самом факте установки, проблема с аппаратным ускорением видео, что для тв-приставки критично.

              Может уже эту проблему одолели, но когда в последний раз интересовался, ни на рокчипе ни на олвиннере аппаратного ускорения не было.
  • +1
    Поздравляю!
    Теперь ещё бы телевизионный и спутниковый тюнер под убунтой задействовать…
  • +1
    >> Root-доступ на ТВ через Telnet

    Прочитав эту фразу, я понял: будущее наступило.
  • +2
    Есть готовые смартТВ с Андроидом на борту. Например, SUPRA STV-LC46S990FL, там 4-й андроид и встроенный wifi.

    Хочу на НГ купить новый SMART TV, чтоб фильмы через Инет смотреть (нафиг эти спутниковые каналы),
    выбрал себе какой хочешь фильм или сериал и вперед. Пока не определился с моделью, предпочитаю LG, но там проприетарное ПО мне не очень по душе.
    • +2
      Вы уж меня извините, но покупать не-брендовый телевизор как основной это уж совсем издевательство над собой, имхо. Вот что-что а телевизоры от всех этих SUPRA, Mystery и прочих покупать не стоит. (собственно как и low-end модели брендовых телевизоров, а то получите тот же SUPRA только с шильдиком и прошивкой от, к примеру, самсунга)
      • +1
        А меня расстраивает, что практически нельзя купить просто большой ТВ-экран без тюнера и всякой смарт-начинки. Зачем мне за нее платить, если я все равно подключу внешний медиаплейер и т.д.?
        • 0
          Вы занимаетесь продажей телевизоров. Ваши графики показывают, что вы, как потребитель с такими желаниями, ну никак не влияете на продажи. Вы не входите в целевую аудиторию. Я бы тоже хотел покупать отдельно экраны. Но сдается мне, там начинка эта от силы 5%-10% цены кушает)
          • 0
            Если судить по стоимости мониторов, то именно так и получается, больше всего в TV стоит матрица.
        • +3
          Помню раньше тема «для чего мне платить за камеру в мобильном телефоне» возникала с завидной регулярностью.

          Вы платите не за какой-то набор компонентов, а за один экземпляр из конкретной партии девайсов, причем чем больше партия, тем меньше себестоимость. Соответственно, менее востребованный «просто большой ТВ-экран без тюнера и всякой смарт-начинки» будет стоить дороже, т.к. спрос меньше, партии меньше, себестоимость больше.
    • +1
      Пользовался и LG, и SAMSUNG.
      Минус LG в том, что не воспроизводит звук в DTS (а это очень популярный кодек), половина раздач на рутрекере пролетает.
      А нравится в LG его 3d-технология: очки без батарейки, мерцание не заметно.
      • +1
        Я бы еще отнес к плюсам LG естественные красивые цвета, в отличие от контрастных мультяшных самсунговских имхо.
        • +1
          Если на самсунге выбрать режим «Кино», то они тоже естественные.
          • 0
            И темнота темнотой. Оставим этот разговор. Я же написал имхо. Мне не нравятся самсунговские матрицы (тем более что они в более дешевых моделях совсем уж китайские), а вот на лыжах которые смотрел все устраивает. Но на вкус и цвет фломастеры…
        • 0
          Так если телевизор по назначению испроьзовать — аниме смотреть, то мультяшные цвета — плюс :)
  • +3
    Пользуясь случаем хочу поинтересоваться, не пробовал ли автор или еще кто из хабравчан завести обычную uvc веб камеру?
    Хотелось бы использовать для скайпа обычную камеру, не покупая редкую и дорогостояющую «специальную» камеру от самсунга.
    Я лично безуспешно потратил почти все выходные на сей процесс. В поставке ядра изначально отсутствуют модули uvcvideo.ko и все что с этим связано. Собрать эти модули с первого захода как-то не получилось.
    К слову, делать insmod/rmmod других модулей телевизор разрешает, я вот так для разнообразия загрузил и выгрузил usbserial.ko, который собрать удалось.
    Еще терзают большие сомнения, что даже если нужные модули будут загружены и появится устройство /dev/video — сможет ли виджет скайпа с ним работать?
    Отдельный вопрос по поводу звука, самсунговская камера имеет встроенный микрофон, а использовать микрофон, встроенный в телевизор (пульт) скайп не умеет…
  • +1
    Список моделей или хотя бы серий не помешал бы! Когда последний раз смотрел он вроде бы не поддерживал модели 2012 года.
    • +1
      На Wiki очень устаревшая информация, смотрите ссылку на ixbt, которая в статье.
      • +1
        Спасибо! Действительно уже умеет E серию
  • +1
    Ребят, а как же так, почему 1280x720?! или потом напрямую видео идет через аппаратный декодер в 1080p?
    • +1
      А если еще и приложение какое-нибудь запустить, так вообще 960×540! Прям как на телефоне у меня! Скорее всего, он выводит видео напрямую в видеовывод в 1920×1080 при просмотре, ну а если нет, то это позор.
      • +1
        ТВ 2010-го года могли запускать приложения только в 960x540. 2011-го частично 960x540, частично 720p. 2012-2014 все могут запускать приложения а 720p.
        Из-за проблем с обновлением документации у самсунгов и необходимостью поддержки старых ТВ выходят новые приложения в 960x540, но есть и 720p.
        Видео рендерится в FullHD даже внутри 960x540 приложений.
  • +1
    Здорово, а есть что-нить на эту тему под LG? Я было начал ковырять, но наковырял только дублирование функционала пульта по http.
    • +1
      openlgtv.org.ru/wiki/index.php/Achievements

      Если вашего телевизора нет то, увы, ничего не выйдет.
      • +1
        Был там, не нашел ничего полезного для себя. Будем ждать…
      • 0
        Спасибо. Нашел там свой 575. Плохо что коннект через 232. Надо искать старый бук )
  • 0
    Добавьте что ли дикарей сюда.
    • 0
      Это вы про Ace Stream, или про Samsung? Если про первое, то я уже писал в Videolan.
  • 0
    Немного отвлечённый вопрос: а существуют ли ТВ без вот этих всех «SmartTV» тормознутых интерфейсов, но с 3D, usb, читающие все форматы и т.д. и т.п.?
    • +1
      Тут противоречие возникает, если «тв читает все форматы» — то в него добавить SmartTV плевое дело, тем более, что на нем вендор поднимет неплохо бабла.
      • 0
        Именно в этом и проблема – зачем-то пихают тупящие и тормозящие интерфейсы, которые мне не нужны.
        • 0
          Голосуйте рублем, я так же собираюсь сделать — к плазме докуплю андроидный SmartTV.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.