Skip to content

Finna leið til að afdulkóða strauma úr Síminn Sjónvarp #1

Description

@hauxir

Undir https://github.com/hauxir/istvproxy/blob/master/channelsources/siminn.py er komið plugin til þess að tala við Símann Sjónvarp ef gefið er upp device id. Því tekst að logga inn og sækja playlista fyrir allar stöðvar sem notandi hefur aðgang að. Til þess að fá Device ID þarf að logga sig inn á https://desktop.tv.siminn.is/ og fara í console í browsernum og skoða localStorage.

Vandamálið

Flestir straumar úr Síminn Sjónvarp eru dulkóðaðir.
Semsagt HTTP response þegar sóttir eru video straumar eru dulkóðuð að fullu(headers meðtaldir).

Hvernig?

Þeir virðast vera að dulkóða alla strauma serverside(DRM) og nota síðan proprietary spilara frá VisualOn til að bæði sækja, afdulkóða og birta straumana.

Eins og þetta virkar á Windows og eflaust svipað á öðrum tækjum hjá þeim er ferlið til að spila straumana svona:

  1. Keyrt er upp "native" HTML/JS based app "Sjonvarp" wrappað í NWJS NaCl custom build.
  2. Það app keyrir síðan upp SjonvarpHelper.exe sem staðsettur er undir C:\ProgramData\Siminn\SjonvarpHelper. Þetta er server sem talað er við gegnum websockets á porti 9002. Ég er nokkuð viss um að þessi server innihaldi kóða sem afdulkóðar http responsin. Hann er notaður sem nokkurskonar proxy á video straumana sjálfa, ásamt playlistum og keyfiles til að afdulkóða straumana enn og aftur býst ég við.
  3. Appið keyrir upp JavaScript kóða sem keyrir síðan upp native client(NaCl). Til að tala við þennan native client eru notuð messaging úr JavaScript. Javascript kóðann er að finna hér en einnig ef skoðað er appið sjálft undir C:\Program Files (x86)\Sjónvarp\package.nw\public. Native Clientinn er að finna í möppu þar sem heitir plugins.
  4. Eins og stendur er ég ekki alveg viss hvernig hlutverkaskiptingin milli Helper og NaCl eru en mig grunar að helperinn sjái um afdulkóðun og clientinn aðeins um birtingu og samskipti við helper, en enganveginn viss um það.

Mögulegar lausnir

  1. Ég held að best sé að byrja á að reyna að keyra upp NaCl playerinn í Chrome/Chromium.
    Verkefnið felst þá í að gera einfaldan kóða sem keyrir í Chrome, talar við Helper processinn og spilar straumana. Þetta ætti að einfalda debugging, losna við nwjs og skilja betur hvernig Helper virkar. Mögulega er þetta skref óþarft en það myndi allavega hjálpa.
    Hér er einhver kóði sem ég var byrjaður á. Þarf að sækja pexe og nmf skrárnar úr plugins möppunni nefnda fyrir ofan:
document.addEventListener('DOMContentLoaded', function() {
  var moduleEl = document.createElement('embed');
  moduleEl.setAttribute('src', 'BrowserPluginPNaCl.nmf');
  moduleEl.setAttribute('type', 'application/x-pnacl');
  var listenerDiv = document.getElementById('listener');
  listenerDiv.appendChild(moduleEl);

  moduleEl.addEventListener('message', function(ev) {
	console.log(ev);
  }, true);

  moduleEl.addEventListener('load', function() {
	moduleEl.postMessage({cmd: "init", args:[0,0], cb: 0 });
	moduleEl.postMessage({cmd: "registerEventHandler", args:[true], cb: 0 });
	moduleEl.postMessage({cmd: "setDRMLibrary", args:["voDRM_VeriMatrix_AES128", "voGetVeriMatrixDRMAPI"], cb: 0 });
	moduleEl.postMessage({cmd: "setPreAgreedLicense", args:["VISUALON-SIMINN-C98BF6EE97FD4530AFD20EE79D107D5E"], cb: 0 });
	//TODO: code that fetches playlists through the API and sends them to the server
	//var url = ????
	//moduleEl.postMessage({cmd: "open", args:[url, 0, 0, {}], cb: ?? });
  }, true);
});

Þessi Postmessage eru semsagt það sem kallað er í um leið og appið er keyrt. Síðan þarf að sækja playlistana og senda þá í clientinn, væri hægt að kalla í istvproxy til að sækja urlin á straumana.

  1. Nota Wireshark eða sambærilegt til að finna hvað fer fram milli NaCl clientsins(Chrome) og Helper. Jafnvel líka hvort Helper sé að sækja keys einhverstaðar úr serverum hjá símanum.

  2. Með næsta skref eru nokkrar hugmyndir:

    1. Ef hægt er að losna við NaCl þá skrifa python module sem talar við Helper gegnum websockets eða jafnvel betra: notar kóðann í helper til þess að afdulkóða straumana ;)
    2. Ef ekki er hægt að losna við NaCl þá er málið kannski að keyra upp headless chrome sem keyrir upp NaCl, tekur við urls, afdulkóðar þá og skilar þeim hreinum til baka.
    3. Fara í hardcore debugging á þessum 2 binaries, þeas. BrowserPluginPNaCl.pexe og SiminnHelper.exe og finna út hvernig straumarnir eru decrypted. Þetta væri besta en erfiðasta lausnin!

Þetta er augljóslega mikil og tímafrek vinna enda gafst ég upp á þessu.
Engu að síður skemmtileg þraut fyrir þá sem hafa gaman að cracka svona og þess vegna henti ég þessu hingað.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions