1

Тема: Расшифровка ссылок балансера bazon

Для кучи, BazonDecode для расшифровки ссылок с балансера bazon.site.

На PHP:

<?php

if (!isset($_SERVER["HTTP_REFERER"])) $_SERVER["HTTP_REFERER"] = "https://yohoho.bazon.site/embed/";

$link = isset($_GET["url"]) ? $_GET["url"] : ""; if (!$link) die("No url!");

// Притворяемся браузером, передаём куки, подменяем Referer'а
$opts = Array('http'=>Array(
    'method'=>"GET",
    'header'=>"Referer: " . str_replace($_SERVER["HTTP_HOST"], $link, $_SERVER["HTTP_REFERER"]) . "\r\n" .
              "User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36\r\n"));
$html = file_get_contents($link, false, stream_context_create($opts));

// Ищем упакованный скрипт в загруженном html
if (!preg_match('#<script>(eval\(.*?)</script>#s', $html, $matches)) die("Not found script for Eval in html.");

// Создаём распаковщик js-кода
$unpacker = new JavascriptUnpacker;

// Распаковываем js
$unpackedJs1 = $unpacker->unpack($matches[1]);

// Во второй половине распакованного js есть переменная path - она нужна нам будет дальше
$path = preg_match('#path:"(.*?)"#s', $unpackedJs1, $m) ? $m[1] : "";

// Вырезаем из первой половины ещё раз запакованный участок кода
$data2 = preg_match("#eval\(.*?split\('\|'\),0,{}\)\)#s", $unpackedJs1, $m) ? $m[0] : "";

// Распаковываем js
$unpackedJs2 = $unpacker->unpack($data2);

// // Теперь в распакованном второй раз js-коде есть зашифрованная ссылка на файл
$file = preg_match('#file="(.*?)";#s', $unpackedJs2, $m) ? $m[1] : "";
$file = str_replace('"+"', "", $file);

// Раскодируем её
$data = BazonDecode($file, $path);

echo $data;

exit();

///////////////////////////////////////////////////////////////////////////////
// Раскодирование ссылки с сайта bazon.info
function BazonDecode($data, $path) {
  $data = base64_decode($data);
  $c = substr($data, 0, 4);
  $d = substr($data, 4, strlen($data)-4);
  $e = array();
  $f = 0;
  $h = "";
  for ($k=0; $k < 256; $k++) $e[] = $k;
  for ($k=0; $k < 256; $k++) {
    $f = ($f + $e[$k] + Ord($c[$k % strlen($c)])) % 256;
    $g = $e[$k];
    $e[$k] = $e[$f];
    $e[$f] = $g;
  }
  $k = 0; $f = 0;
  for ($l=0; $l < strlen($d); $l++) {
    $k = ($k + 1     ) % 256;
    $f = ($f + $e[$k]) % 256;
    $g = $e[$k];
    $e[$k] = $e[$f];
    $e[$f] = $g;
    $h .= Chr(Ord($d[$l]) ^ $e[($e[$k] + $e[$f]) % 256]);
  }
  return str_replace("@", $path, base64_decode($h));
}

///////////////////////////////////////////////////////////////////////////////
// Распаковщик js-кода https://github.com/ptcong/php-javascript-unpacker
class JavaScriptUnpacker
{
    protected $alphabet = array(
        52 => '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOP',
        54 => '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQR',
        62 => '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
        95 => ' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~'
    );

    private $base;
    private $map;

    public function unpack($source, $dynamicHeader = true)
    {
        if (! $this->isPacked($source, $dynamicHeader)) return $source;
        preg_match("/}\('(.*)',\s*(\d+),\s*(\d+),\s*'(.*?)'\.split\('\|'\)/", $source, $match);
        $payload = $match[1];
        $this->base = (int) $match[2];
        $count = (int) $match[3];
        $this->map = explode('|', $match[4]);
        if ($count != count($this->map)) return $source;
        $result = preg_replace_callback('#\b\w+\b#', array($this, 'lookup'), $payload);
        $result = strtr($result, array('\\' => ''));
        return $result;
    }

    public function isPacked($source, $dynamicHeader = true)
    {
        $header = $dynamicHeader ? '\w+,\w+,\w+,\w+,\w+,\w+' : 'p,a,c,k,e,[rd]';
        $source = strtr($source, array(' ' => ''));
        return (bool) preg_match('#^eval\(function\('.$header.'\){#i', trim($source));
    }

    protected function lookup($match)
    {
        $word = $match[0];
        $unbased = $this->map[$this->unbase($word, $this->base)];
        return $unbased ? $unbased : $word;
    }

    protected function unbase($value, $base)
    {
        if (2 <= $base && $base <= 36) return intval($value, $base);
        static $dict = array();
        $selector = $this->getSelector($base);
        if (empty($dict[$selector])) {
            $dict[$selector] = array_flip(str_split($this->alphabet[$selector]));
        }
        $result = 0;
        $array = array_reverse(str_split($value));
        for ($i = 0, $count = count($array); $i < $count; $i++) {
            $cipher = $array[$i];
            $result += pow($base, $i) * $dict[$selector][$cipher];
        }
        return $result;
    }

    protected function getSelector($base)
    {
        if ($base > 62) return 95;
        if ($base > 54) return 62;
        if ($base > 52) return 54;
        return 52;
    }
}

Тест: http://wonky.lostcut.net/bazon.php?url= … b92c0e5c37

Для HMS:

///////////////////////////////////////////////////////////////////////////////
// Получение ссылки балансера bazon
void GetLink_bazon(string sLink) {
  string html, js, data, sVal, path, sServ;
  HmsRegExMatch("^(http.*?//[^/]+)", sLink, sServ);
  html = HmsUtf8Decode(HmsDownloadURL(sLink, 'Referer: '+mpFilePath+'\r\nOrigin: '+sServ));

  if (HmsRegExMatch('<script>eval(\\(.*?\\))</script>', html, js, 1, PCRE_SINGLELINE)) data = jsEval(js);
  HmsRegExMatch('path:"(.*?)"', data, path);
  if (HmsRegExMatch("eval(\\(.*?split\\('\\|'\\),0,{}\\)\\))", data, js, 1, PCRE_SINGLELINE)) data = jsEval(js);
  HmsRegExMatch('file="(.*?)";', data, sVal);
  sVal = ReplaceStr(sVal, '"+"', "");
  MediaResourceLink = BazonDecode(sVal, path);
}

///////////////////////////////////////////////////////////////////////////////
// Javascript Eval
string jsEval(string sData) {
  Variant objScript; string sResult = '';
  try { objScript = CreateOleObject('MSScriptControl.ScriptControl'); } except { };
  if (VarType(objScript) != varDispatch) { 
    HmsLogMessage(2, 'Не могу создать ActiveXObject MSScriptControl.ScriptControl'); 
    return ''; 
  }
  objScript.Language = 'JavaScript';
  try { sResult = objScript.Eval(sData); } except { };
  return sResult;
}

///////////////////////////////////////////////////////////////////////////////
// Раскодирование ссылки с сайта bazon.info
string BazonDecode(string data, string path) {
  data = HmsBase64Decode(data);
  string c = Copy(data, 1, 4);
  string d = Copy(data, 5, Length(data)-4);
  Variant e[256];
  int g, f = 0; string h = '';
  for (int k = 0; k < 256; k++) e[k] = k;
  for (k=0; k < 256; k++) {
    f = (f + e[k] + Ord(c[(k % Length(c))+1])) % 256;
    g = e[k];
    e[k] = e[f];
    e[f] = g;
  }
  k = 0; f = 0;
  for (int l = 0; l < Length(d); l++) {
    k = (k + 1   ) % 256;
    f = (f + e[k]) % 256;
    g = e[k];
    e[k] = e[f];
    e[f] = g;
    h += Chr(Ord(d[l+1]) ^ e[(e[k] + e[f]) % 256]);
  }
  return HmsUtf8Decode(ReplaceStr(HmsBase64Decode(h), "@", path));
}

Жаль только, с полученными ссылками особо ничего сделать нельзя, без указания referer и origin.
HTTP заголовок Referer должен быть на bazon.site, при получении плейлиста и даже при проигрывании видео.
Т.е. эти заголовки нужно указывать при транскодировании ffmpeg или VLC дополнительно.

Но как пример, пусть будет.

Sony Bravia KDL-32CX523
Спасибо сказали: smsbox3, foks50502

2 (2020.05.23 10:45:40 отредактировано Mr.Max)

Re: Расшифровка ссылок балансера bazon

WendyH пишет:

Для кучи, BazonDecode для расшифровки ссылок с балансера bazon.site...

Есть ещё kino feed там 4k есть и HDVB. Спасибо за вашу работу.

3

Re: Расшифровка ссылок балансера bazon

Mr.Max пишет:

Есть ещё kino feed там 4k есть и HDVB. Спасибо за вашу работу.

Ещё много чего есть. К чему это?
И там и там не можете расшифровать незашифрованные ссылки?

Sony Bravia KDL-32CX523

4

Re: Расшифровка ссылок балансера bazon

WendyH пишет:

Ещё много чего есть. К чему это?
И там и там не можете расшифровать незашифрованные ссылки?

Простите . Недосмотрел . Все в порядке .