1

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

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

На PHP:

<?php
$link = isset($_GET["url"]) ? $_GET["url"] : ""; if (!$link) die("No url!");
$referer = isset($_SERVER["HTTP_REFERER"]) ? $_SERVER["HTTP_REFERER"] : "http://4h0y.gitlab.io/";

// Притворяемся браузером, передаём куки, подменяем Referer'а
$opts = Array('http'=>Array(
    'method'=>"GET",
    'header'=>"Referer: $referer\r\n" .
              "User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 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
$unpackedJs = $unpacker->unpack($matches[1]);

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

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

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

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

echo $data;

exit();

///////////////////////////////////////////////////////////////////////////////
// Раскодирование ссылки с сайта bazon.info
function rc4($c, $d) { // Функции rc4 и dec взяты из https://yo.bazon.site/js/player.js
  $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 $h;
}

function dec($e, $f) {
  $i = substr($e, strlen($e)-1);
  $e = substr($e, 0, strlen($e)-1);
  $j = base64_decode($e);
  $l = substr($j, 0, $i);
  $m = substr($j, $i, strlen($e)-$i);
  return base64_decode(rc4($l . $f, $m));
}

function BazonDecode($data, $path) {
  $decoded = dec($data, "YspH62r6");
  return str_replace("@", $path, $decoded);
}

///////////////////////////////////////////////////////////////////////////////
// Распаковщик 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.info
string BazonDecode(string data, string path) {
  int i = StrToInt(Copy(data, Length(data), 1));
  data = Copy(data, 1, Length(data)-1);
  if (ProgramVersion >= "3.0") {
    string s = 'decodeBase64=function(f){var g={},b=65,d=0,a,c=0,h,e="",k=String.fromCharCode,l=f.length;for(a="";91>b;)a+=k(b++);a+=a.toLowerCase()+"0123456789+/";for(b=0;64>b;b++)g[a.charAt(b)]=b;for(a=0;a<l;a++)for(b=g[f.charAt(a)],d=(d<<6)+b,c+=6;8<=c;)((h=d>>>(c-=8)&255)||a<l-2)&&(e+=k(h));return e};';
    data = jsEval(s+";(decodeBase64('"+data+"'))");
  } else {
    data = HmsBase64Decode(data);
  }
  string c = Copy(data, 1, i)+"YspH62r6";
  string d = Copy(data, i+1, Length(data)-i);
  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 пишет:

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

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

5

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

Доброго времени суток! У кого нибудь есть актуальный метод расшифровки?

6

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

Joker пишет:

Доброго времени суток! У кого нибудь есть актуальный метод расшифровки?

А есть ссылка на какое-нибудь видео с их работающим плеером? Для изучения.

Sony Bravia KDL-32CX523

7 (2020.06.23 09:49:50 отредактировано Joker)

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

WendyH пишет:

А есть ссылка на какое-нибудь видео с их работающим плеером? Для изучения.

Вот ссылка на плеер https://yo.bazon.site/embed/170a23f16e1 … 6e0f0844f9 нужно передать Referer https://4h0y.gitlab.io/ чтобы открыть или смотреть на сайте 4h0y.gitlab.io

Спасибо сказали: WendyH1

8

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

Joker, обновил скрипты в первом сообщении.

Ну и небольшой ликбез по реверсинжинирингу на примере этого сайта.

Открываем какой-нибудь сайт, где есть этот плеер. Например http://4h0y.gitlab.io/#1091257
Идём в инструменты разработчика на вкладку Network, тыкаем все плеера (если их там несколько) и смотрим запросы к интересующему домену. Можно в фильтр поставить слово bazon, чтобы было удобней.
В данном примере это плеер под номером 3. Не удивляемся, что плеер не загружается как следует, ибо в скриптах защита от отладчика.
Ничего страшного, закрываем инструменты разработчика, перезагружаем страницу и нажимаем на нужный плеер, чтобы он загрузился и инициализировался без открытого отладчика.
А вот теперь возвращаемся в инструменты разработчика снова на вкладку Console. Только сверху слева выбираем текущее окружение не "Top", а нужный адрес на домене yo.bazon.site. Этим самым в консоли у нас будут доступны переменные окружения загруженного по нужному iframe.

Начинаем исследовать.
Во-первых, посмотрим в код js-скрипта на самом html плеера. Распаковываем его в de4js и получаем на выходе нормальный скрипт и там есть такой код:

var player = new Playerjs(...);

Мхм, запомнили его (лучше соранить куданибудь в редактор).
Набираем в консоли Playerjs и жмём энтер. В ответ Хром в консоли нам отдаст исходный код этой функции. Два раза щелкаем по этому коду и он любезно откроется на вкладке Source, где мы его можем даже отформатировать нажав {} внизу слева.

Ставим там брекпоинт на первой строчке после function Playerjs(options) { и переходим в консоль.
И прям в консоли вставляем ранее скопированный код инициализации плеера как есть:

+ открыть спойлер
var player = new Playerjs({
        id: "player",
        path: "https://banana.bazonserver.site/manifest/19531",
        start: 0,
        file: "LdKmwKXuZTAwLtAwLH9iqoizuVFcyg26Xm6TJSH/stsF+zUOYgrjoAMB0SanCNDmw6q9mrv9KUkFpFsEdO22LtUQ8EBNfo8ZF2VhuTGz61VK1Yd7AOdX26stdfhY3EcAdv26TSDYYVA1p6ZxSQ1skpnw8OoyrhYsRqkjCfrpjzbL/ezNYPSOnO0u/PdDTaCC0gDIsmeYt6GfuRv5WUaZqZ9qEG+2uSepbPj6hvyeD9dxpNYbeXU9tAl78hC3Q0pTQA+PP8xT24YxmEfy2/O0X13J8NQW2LEnCH3n9FuE6GroO2EBZQgIbKQ+74VEgMmaDXvL/caW2XLsbv/dB/F6J6Jh6sxOE3Q4y5TMCr+CF8G0VpvKco7BWk0CptpnRmGYKJb6z4unPaqorgVq7q8Ww7MVdAlCVBUMADWx/6JD3hys3GKdKs7Hm9GoFeQvV8brbG/AhD8CeLFQ4Tn//8XKQhOR54qtnLg9lDsiP52Er+N/tEz9YrGWW//fWwfHTxaV1yDSoPZVK9miXS71ourSW0hQYNbdMXrmHyBtUSLUCi9hfIjCDCCMypvEqtEckZrX1KEqZEyhftmys4e31dhn5tU6vL+BqOKol6LYM7LubDTaRoKMmlUm70c2tex+/h6fn+70D39c5AKGCuJKyTxH313Cs8+sLVdP6Ak6",
        vast: 1,
        preroll: "id:custom and id:custom",
        custom: "https://protovid.com/j/v3.php?id=1468&subid=yo.bazon.site",
        custom2: "",
        poster: "https://banana.bazonserver.site/video/19531/poster.jpg",
        parent_domain: "bazon.to",
        default_quality: "480p",
        hlsconfig: {
            loader: engine.createLoaderClass(),
            maxBufferLength: 60
        }
    });

В ответ сработает точка останова, где мы нажимая F10 или F9 по шагам выполняем всю инициализацию, пока не доходим до странных:
options[b('0x10', 'LJhv')] = dec(options[b('0x17', '0l#A')], b('0xd', 'Yn^m'));

Вообще во время отладки обфусцированного кода постоянно выделяем мышкой участки, типа:

b('0x10', 'LJhv')

и подобных. И при наведении на выделенный участок отладчик подсказывает нам вычисленное значение. Обычно это закодированные строки свойств и методов.

Например, b('0x10', 'LJhv') возвращает "file" и b('0x17', '0l#A') возвращает "file", а b('0xd', 'Yn^m') возвращает "TZ#x!z40".

Итого строку:

options[b('0x10', 'LJhv')] = dec(options[b('0x17', '0l#A')], b('0xd', 'Yn^m'));

Можно понять как:

options["file"] = dec(options["file"], "TZ#x!z40");

Ну вот, функция dec - это и есть наш дешифровщик.

Также в отладчике по шагам выполняем всё что там происходит, не забывая вычислять для понимания всякие b('0x5', 'dF@$').
Можно скопировать текст функций в редактор, где постепенно заменяя обфусцированные строковые значения на их вычисленные при отладке получить в итоге более понятный код.

Таким образом обфусцированные функции:

+ открыть спойлер
    function rc4(c, d) {
        var e = [],
            f = 0x0,
            g, h = '';
        for (var k = 0x0; k < 0x100; k++) {
            e[k] = k
        }
        for (k = 0x0; k < 0x100; k++) {
            f = (f + e[k] + c[b('0x2d', '3^jF') + 't'](k % c[b('0xf', 'jhdx')])) % 0x100;
            g = e[k];
            e[k] = e[f];
            e[f] = g
        }
        k = 0x0;
        f = 0x0;
        for (var l = 0x0; l < d[b('0x5', 'dF@$')]; l++) {
            k = (k + 0x1) % 0x100;
            f = (f + e[k]) % 0x100;
            g = e[k];
            e[k] = e[f];
            e[f] = g;
            h += String[b('0x1e', '1Nu!') + b('0x19', 'BUVh')](d[b('0x21', 'bj(M') + 't'](l) ^ e[(e[k] + e[f]) % 0x100])
        }
        return h
    }

    function b64DecodeUnicode(c) {
        return decodeURIComponent(atob(c)[b('0x2', 'A*Tk')]('')[b('0xd', 'ozZ9')](function (d) {
            return '%' + ('00' + d[b('0x27', 'jhdx') + 't'](0x0)[b('0x11', '(OmG')](0x10))[b('0x1d', 'TCNs')](-0x2)
        })[b('0x16', '(Ks*')](''))
    }

    function dec(e, f = '') {
        var g = function () {
            var n = !![];
            return function (o, p) {
                var q = n ? function () {
                    if (p) {
                        var r = p[b('0x1a', '8]um')](o, arguments);
                        p = null;
                        return r
                    }
                } : function () {};
                n = ![];
                return q
            }
        }();
        var h = g(this, function () {
            var n = function () {
                var o = n[b('0x13', 'g0ou') + 'or'](b('0xc', 'RB$5') + b('0x18', '^tA8') + b('0x6', 'dF@$'))()[b('0x10', 'X)(s')](b('0x1', '56Xw') + b('0x3', 'NeeX') + b('0x20', '9^e]'));
                return !o[b('0x23', '56Xw')](h)
            };
            return n()
        });
        h();
        var i = e[b('0xa', 'bj(M')](e[b('0x2b', 'i)[X')] - 0x1);
        e = e[b('0x1f', 'Jrw2')](0x0, e[b('0x4', 'ME]l')] - 0x1);
        var j = atob(e);
        var l = j[b('0x1b', 'O(GO')](0x0, i);
        var m = j[b('0x17', 'O(GO')](i, j[b('0x7', 'g0ou')] - i);
        return b64DecodeUnicode(rc4(l + f, m))
    }
    String[b('0x8', 'dF@$')][b('0x28', 'Jrw2') + 'l'] = function (c, d) {
        var e = this;
        return e[b('0x0', 'EIVF')](new RegExp(c, 'g'), d)
    };
    options[b('0x2a', '[xVm')] = dec(options[b('0x12', 'bj(M')], b('0x29', 'dF@$'));

Превращаются в более понятные:

+ открыть спойлер
    function rc4(c, d) {
        var e = [], f = 0x0, g, h = '';
        for (var k = 0x0; k < 0x100; k++) {
            e[k] = k
        }
        for (k = 0x0; k < 0x100; k++) {
            f = (f + e[k] + c.charCodeAt(k % c.length)) % 0x100;
            g = e[k];
            e[k] = e[f];
            e[f] = g
        }
        k = 0x0;
        f = 0x0;
        for (var l = 0x0; l < d.length; l++) {
            k = (k + 0x1) % 0x100;
            f = (f + e[k]) % 0x100;
            g = e[k];
            e[k] = e[f];
            e[f] = g;
            h += String.fromCharCode(d.charCodeAt(l) ^ e[(e[k] + e[f]) % 0x100])
        }
        return h
    }
    function b64DecodeUnicode(c) {
        return decodeURIComponent(atob(c).split('').map(function(d) {
            return '%' + ('00' + d.charCodeAt(0x0).toString(0x10)).slice(-0x2)
        }).join(''))
    }
    function dec(e, f) {
        var i = e.substring(e.length - 0x1);
        e = e.substring(0x0, e.length - 0x1);
        var j = atob(e);
        var l = j.substring(0x0, i);
        var m = j.substr(i, j.length - i);
        return b64DecodeUnicode(rc4(l + f, m))
    }

Ну а полученые функции переписываем на свой язык и используем.

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

9

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

У кого-нибудь работает этот плеер на сайте? Ни на 4h0y.gitlab.io, ни на каком-нибудь bestfilms.world этот плеер сейчас у меня не работает.

Sony Bravia KDL-32CX523

10

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

Да вроде вот здесь все работает

https://4h0y.bitbucket.io/#%D0%B4%D0%BE%D0%BA%D1%82%D0%BE%D1%80%20%D0%BA%D1%82%D0%BE

11

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

Снова сменили защиту, WendyH поможете? :)

12

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

Joker пишет:

Снова сменили защиту, WendyH поможете? :)

А какая ошибка, или что изменилось

Отладка кода — это как охота. Охота на баги.

13

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

пытаюсь решить задачку по скромнее, проверить есть такой фильм на bazon или нет, например

https://v1578689964.bazon.site/kp/1135243

При запросе заголовка всегда 404 выдает, при попытке прочитать пусто, вероятно заголовки неправильные выдаю. Читать пробовал функцией из первого сообщения в этой теме.

14

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

smsbox3 пишет:

пытаюсь решить задачку по скромнее, проверить есть такой фильм на bazon или нет, например

https://v1578689964.bazon.site/kp/1135243

При запросе заголовка всегда 404 выдает, при попытке прочитать пусто, вероятно заголовки неправильные выдаю. Читать пробовал функцией из первого сообщения в этой теме.

Я  думаю, Вы направильном пути, реферер нужно подправить

Отладка кода — это как охота. Охота на баги.
Спасибо сказали: smsbox31

15

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

Spell пишет:

Я  думаю, Вы направильном пути, реферер нужно подправить

Спасибо с  https://4h0y.gitlab.io/ не работает, поменял на другое - стало читать. Поставленную задачу решил :) Еще раз спасибо!