Тема: Расшифровка ссылок балансера 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 дополнительно.
Но как пример, пусть будет.