リバースエンジニアリング:tvali.geサービス

背景(スキップ)



状況:アクセスできない「外部」を備えた大規模なローカルエリアネットワークと、無制限の外部インターネットを備えた多かれ少なかれ生産性の高い無料のマシンがあります。

また、学生の間では一般的な要望があります。ホステルではテレビにアクセスできないため、インターネットでサッカーを観戦することです。

「外部」からテレビを中継するための多くの試行錯誤の後(夕方の通信の中断、ビデオソースの遅れ-ローカルネットワーク内の全員の中断と「キューブ」)、スポーツチャネルの代替ソースを検索しました。 衛星放送受信アンテナを置く可能性はありません。 そして最終的に、サイトが見つかりました-tvali.ge 、スキームに従って動作します:

チャンネルからビデオをキャプチャしました(5分)->保存-> Flashプレーヤーでユーザーに提供しました。 すべて10分で元のストリームの遅延

プレイヤーデモ








カットの下に、サービスの動作の詳細な図と、チャンネルをそれ自体に「ドラッグアンドドロップ」する方法の決定。



テレビ番組を見るスキーム


サイトにアクセスしました(Cookieを取得しました)->目的のチャネルでページを開きました->チャネルの記録を確認します。

しかし! クッキー サイトからのセッションがない場合、プレーヤーはプレイリストをロードして表示しません:

セッションなしで視聴しようとしています。アクセスが拒否されました






さて、さらに見てください。

このサービスは、このチャンネルを使用してプレーヤーのウェブサイトに「挿入」を提供します。 「NTV + Sport」、つまりプレイヤーの通話の一部を分析しましょう。 挿入物から興味のある行にコメントを付けて、サービスを提供します。



var cc=955; // ID    var d = new Date(); var cd = d.getDay()*(24*60)+d.getHours()*60+Math.floor(d.getMinutes()/5)*5-10; //  ""  (    ). var fn = "http://tvali.ge/tv/"+cc+"_list.php?d="+cd; //      .
      
      







Cookieを使用しないチャンネルへのアクセス禁止の分析


プレイリストでリンクをたどります。 これは、Cookieがチェックされる場所で発見されます。

サイトへのアクセスから「チケット」(サービス開発者の言葉で言えば)があれば、プレイリストは正しく生成され、チャンネル記録のあるファイルへのリンクが提供されます。 エントリの1つへのリンクの例:



tvali.ge/c.php?action=010102&vid=010102-06-12-00-00.mp4



プレイリストは、「?D = "パラメーターで渡したものに応じて生成されます。 そして、そこに-週の始まりからの秒単位の時間(分(5)で四捨五入)とマイナス10分(ブロードキャスト遅延)。

Cookieを使用しない場合、1つのエントリへのリンクが取得され、そのスクリーンショットが上記に提供されます。

www.tvali.ge/noaccess.flv

判明したように、ファイルにアクセスするときにCookieもチェックされます。 そのため、それらがないと、ファイルを「プル」できません。



サービスのコピーの実装を開始します
自分にファイルをダウンロードする


ファイル名を解析しましょう-06-12-35-00

06-曜日

12時間

35-分

00-秒

いいね! ファイルをダウンロードするスクリプトを書きましょう



 <?php set_time_limit(0); function curl_get_file_contents($URL) { $c = curl_init(); curl_setopt($c, CURLOPT_RETURNTRANSFER, 1); curl_setopt($c, CURLOPT_FOLLOWLOCATION, 1 ); curl_setopt($c, CURLOPT_COOKIE, 'CO=cookie_from_service'); curl_setopt($c, CURLOPT_URL, $URL); $contents = curl_exec($c); curl_close($c); if ($contents) { $out_handle = fopen ('/var/www/domain/videos/'.substr($URL, -12), "wb+"); fwrite ($out_handle, $contents); } } // .      2 . 15  -   $mod_time = time() - 2*60*60 - 15*60; $min = floor(date("i", $mod_time)/5)*5; if ($min < 10) $min = '0'.$min; $hours = date("H", $mod_time); $vid = "010102-0".date("w", $mod_time)."-".$hours."-".$min."-00.mp4"; curl_get_file_contents('http://tvali.ge/c.php?action=010102&vid='.$vid); echo 'http://tvali.ge/c.php?action=010102&vid='.$vid; ?>
      
      







そのため、cronに実行を追加するスクリプトがあります(5分ごと)

*/5 * * * * /usr/bin/php /var/www/downloader.php







プレイヤー


サービス自体にあるプレーヤーのスキーム:

プレイリストを取得->すべてのレコードを半分に分割し、そこから表示を開始しました。

プレイリストジェネレーターを作成します。

 <?php $mod_time = time() - 2*60*60 - 17*60 - 12*60*60; $links = "<playlist version = \"1\"><trackList>"; $titles = ""; for ($i = 0; $i< 288; $i++) { $min = floor(date("i", $mod_time)/5)*5; if ($min < 10) $min = '0'.$min; $hours = date("H", $mod_time); if ($hours < 22) $title = $hours+2; else $title = $hours-22; $title .= ":".$min; $links .= "<track><title>$title</title><location>http://domain/videos/$hours-$min-00.mp4</location></track> "; $mod_time += 300; } echo $links."</trackList></playlist>"; ?>
      
      





ご覧のとおり、プレイリストジェネレーターは、オリジナルとは異なり、日付パラメーターを考慮せず、単純に考慮しません。 プレーヤーで作業するときに起こりうるエラーを回避するために、これはユーザーよりもサーバー上のリアルタイムを判断するためのより適切なオプションだと判断しました。

それだけです。このリソースのフラッシュプレーヤーを自分でダウンロードし、var fn = ...をプレイリストスクリプトのあるアドレスに変更し、ローカルネットワークでスポーツを高品質で視聴してください。



「20分遅れてスポーツを観戦するのは理にかなっていない」と言う人もいるかもしれませんが、これが唯一の選択肢です。

PS同じ方法で他のチャンネルを「プル」できますが、夕方には同じ「STS」が途切れます。録画の長さは1〜2分です(5分である必要があります)。



All Articles