241

Re: moonwalk

Интересно, как это можно объяснить, на сайте видео играет

http://nkino.org/fantastika/1992-moya-devushka-monstr-2016.html

А полученная ссылка

 http://185.38.12.26/sec/1538976530/333035350eba68990c008279b4b2142b19f070d19749f154/ivs/ce/e7/75e40734f5de/hls/tracks-2,5/index.m3u8

Дает ошибку 403.  Другие ссылки с этого сайта нормально проигрываются.

242

Re: moonwalk

smsbox3 пишет:

Дает ошибку 403.  Другие ссылки с этого сайта нормально проигрываются.

Да, есть ссылки, которые привязаны к IP.
hokkonorti уже обращал на это внимание.
Как их вычислить непонятно. Ничем не примечательны.

Sony Bravia KDL-32CX523

243

Re: moonwalk

WendyH пишет:

Да, есть ссылки, которые привязаны к IP.

У меня другая идея по поводу этих ссылок, нет ли там ограничения на страну воспроизведения контента, по IP ? Как таковой привязки к IP нет, но не играет, там где не надо. Я попробую получить ссылку используя другой сервер и сравню результат.

244 (2018.10.08 16:26:51 отредактировано GSHK)

Re: moonwalk

Мой говнокод по получению iv и key автоматически... Не знаю сколько проработает  :(

вместо

+ открыть спойлер
// Получаем данные для шифрования
$key = 'ae3539058f0bf09378324b70f9e549e01c7ed59f08e38fa627dcd2f29991d222';
$iv  = 'f7b4e772e74ccacb1dda2acbb6be38fa';

вставить

+ открыть спойлер
preg_match_all('#r=\[(.*?)\];#',$jsData,$keys);
preg_match('#e\[o\("0xb"\)\]="([^"]+)",#',$jsData,$ks);
$k =  explode(',',$keys[1][8]);

preg_match_all('#,e[\[\]"a-z0-9\(\)]+=([\[\]"a-z0-9\(\)\+.\.]+)#',$jsData, $e);

$iv = GetRegexValue($jsData, '#,\b[ira]="([^"]+)",#i');
if (!$iv)
    $iv = str_replace('"','',array_reduce($k, function ($a, $b) { return (string)strlen($a) > (string)strlen($b) ? $a : $b; }));

$tmpKey = array_reduce($e[1], function ($a, $b) { return (string)strlen($a) > (string)strlen($b) ? $a : $b; });
$sums = explode('+', $tmpKey); 

$t = (int)GetRegexValue($jsData, '#}\(r,(\d{1,})\)#')+1;

for (;--$t;)
{
    array_push($k, array_shift($k));
}

$offset = GetRegexValue($jsData, '#r\[e\]};(.+),e[\[\]"a-z0-9\(\)]+=[\[\]"a-z0-9\(\)\+.\.]+;var#');

$key = '';
foreach($sums as $value){
    $find = substr($value,2);
    $find = trim($find, ']');
    $find = str_replace('(','\(', $find);
    $find = str_replace(')','\)', $find);
    if(substr($find, 0,2) == 'o\\')
    {
        $of = GetRegexValue($jsData,'#e[\[\.]'.$find.'[\]]*=[o\("]+([0-9a-fx]+)["\)]+[,\W]#');
        
        if (!$of )
        {
            $tmp = str_replace('"','',$k[intval(substr($find,4), 16)]);
            $of = GetRegexValue($jsData,'#e[\[\.]'.$tmp.'[\]]*=[o\("]+([0-9a-fx]+)["\)]+[,\W]#');
                        
            $key .= str_replace('"','',$of);
            continue;
        }
        
        if (substr($of,0,2) !== '0x')
            $key .= $of;
        else 
            $key .= str_replace('"','',$k[intval(substr($of,2), 16)]);
    }
    else if (substr($value, 0,2) == 'e[')
    {
        $tmp = 'o\("0x'.dechex(array_search($find, $k)).'"\)';
        $of = GetRegexValue($jsData,'#e[\[\.]'.$tmp.'[\]]*=[o\("]+([0-9a-fx]+)["\)]+[,\W]#');
        
        if(!$of)
            $key .= str_replace('"','',$k[array_search($find, $k)]);
        else
            $key .= str_replace('"','',$k[intval(substr($of,2), 16)]);
    }
}

Просьба сильно не пинать...

Спасибо сказали: ruslachka, igores2

245 (2018.10.08 19:55:37 отредактировано smsbox3)

Re: moonwalk

GSHK пишет:

Просьба сильно не пинать...

Сегодня опять поменяли ключи и что-то не получилось ваш код использовать. Можете полностью выложить, а не только что надо поменять?

Новые значения


$vi='61a78146bcc8e86a36a2caa6e0003695';
$key='6766a8aa2006d8bf308968da22b67a7fa5a96dc095d440566fe4bd831d307661';


Кстати, актуальным становиться скрип, что будет отслеживать работу-не работу и информировать оперативно, что помер.
Насколько понимаю писать его надо не на PHP, а значит 2 варианта под linux и под windows

246

Re: moonwalk

smsbox3 пишет:

Сегодня опять поменяли ключи и что-то не получилось ваш код использовать. Можете полностью выложить, а не только что надо поменять?

Новые значения


$vi='61a78146bcc8e86a36a2caa6e0003695';
$key='6766a8aa2006d8bf308968da22b67a7fa5a96dc095d440566fe4bd831d307661';


Кстати, актуальным становиться скрип, что будет отслеживать работу-не работу и информировать оперативно, что помер.
Насколько понимаю писать его надо не на PHP, а значит 2 варианта под linux и под windows

Выкладывать полностью - смысла не вижу - у меня сильно видоизменен данный скрипт под свои нужды... По поводу того что не работает - защита хоть и простая, но геморойная... попробую сейчас поправить

247 (2018.10.08 22:21:32 отредактировано GSHK)

Re: moonwalk

Исправил... очередной говнокод..

+ открыть спойлер
preg_match_all('#r=\[(.*?)\];#',$jsData,$keys);
preg_match('#e\[o\("0xb"\)\]="([^"]+)",#',$jsData,$ks);
$k =  explode(',',$keys[1][8]);

preg_match_all('#,e[\[\]"a-z0-9\(\)]+=([\[\]"a-z0-9\(\)\+.\.]+)#',$jsData, $e);

$iv = GetRegexValue($jsData, '#,\b[ira]="([^"]+)",#i');
if (!$iv)
    $iv = str_replace('"','',array_reduce($k, function ($a, $b) { return (string)strlen($a) > (string)strlen($b) ? $a : $b; }));

$tmpKey = array_reduce($e[1], function ($a, $b) { return (string)strlen($a) > (string)strlen($b) ? $a : $b; });
$sums = explode('+', $tmpKey); 

$t = (int)GetRegexValue($jsData, '#}\(r,(\d{1,})\)#')+1;

for (;--$t;)
{
    array_push($k, array_shift($k));
}

$offset = GetRegexValue($jsData, '#r\[e\]};(.+),e[\[\]"a-z0-9\(\)]+=[\[\]"a-z0-9\(\)\+.\.]+;var#');

$k[array_search('"90fc8f081c"', $k)] = $k[0x0];

$key = '';
foreach($sums as $value){
    $find = substr($value,2);
    $find = trim($find, ']');
    $find = str_replace('(','\(', $find);
    $find = str_replace(')','\)', $find);
    if(substr($find, 0,2) == 'o\\')
    {
        $of = GetRegexValue($jsData,'#e[\[\.]'.$find.'[\]]*=[o\("]+([0-9a-fx]+)["\)]+[,\W]#');
        
        if (!$of )
        {
            $tmp = str_replace('"','',$k[intval(substr($find,4), 16)]);
            $of = GetRegexValue($jsData,'#e[\[\.]'.$tmp.'[\]]*=[o\("]+([0-9a-fx]+)["\)]+[,\W]#');
            
            if (!$of)
            {
                $tmp = $k[intval(substr($find,4), 16)];
                $tmp = GetRegexValue($jsData,'#e[\[\.]'.$tmp.'[\]]*=[o\("]+([0-9a-fx]+)["\)]+[,\W]#');
                $of = str_replace('"','',$k[intval(substr($tmp,2), 16)]);
            }
            
            $key .= str_replace('"','',$of);
            continue;
        }
        
        if (substr($of,0,2) !== '0x')
            $key .= $of;
        else 
            $key .= str_replace('"','',$k[intval(substr($of,2), 16)]);
    }
    else if (substr($value, 0,2) == 'e[')
    {
        $tmp = 'o\("0x'.dechex(array_search($find, $k)).'"\)';
        $of = GetRegexValue($jsData,'#e[\[\.]'.$tmp.'[\]]*=[o\("]+([0-9a-fx]+)["\)]+[,\W]#');
        
        if(!$of)
            $key .= str_replace('"','',$k[array_search($find, $k)]);
        else
            $key .= str_replace('"','',$k[intval(substr($of,2), 16)]);
    }
    else if (substr($value, 0,2) == 'e.')
    {
        $tmp = 'o\("0x'.dechex(array_search('"'.$find.'"', $k)).'"\)';
        $of = GetRegexValue($jsData,'#e[\[\.]'.$tmp.'[\]]*=[o\("]+([0-9a-fx]+)["\)]+[,\W]#');
        
        if(!$of)
            $key .= str_replace('"','',$k[array_search($find, $k)]);
        else
            $key .= str_replace('"','',$k[intval(substr($of,2), 16)]);
    }
}

Но он все равно рано или поздно сломается - все варианты сразу не просмотришь

Спасибо сказали: foks5050, ruslachka, smsbox3, igores4

248

Re: moonwalk

GSHK пишет:

Выкладывать полностью - смысла не вижу

Хорошо, тогда с вашего разрешения выкладываю ваш код встроенный в то, что работает у меня

<?php
ini_set("log_errors", 1); ini_set("error_log", $_SERVER['SCRIPT_FILENAME'].".log"); ini_set('error_reporting', E_ALL); ini_set("display_errors", 1);
$urlBase = "http://moonwalk.cc";
// Получение ссылки на видео c moonwalk в переданных параметрах, а также тип получаемого потока.
$url     = isset($_REQUEST['url'    ]) ? $_REQUEST['url' ] : ""    ; // moonwalk.cc iframe url
$type    = isset($_REQUEST['type'   ]) ? $_REQUEST['type'] : "m3u8"; // tyle of link (m3u8, mp4)
$urlonly = isset($_REQUEST['urlonly']); // Флаг, сигнализирующий отдавать ссылку на плейлист, а не само его содержимое
$attacha = isset($_REQUEST['at'     ]); // Флаг, сигнализирующий отдавать плейлист как прикреплённый файл с расширением
if (!$url) die("No moonwalk iframe url in the parameters.");
$cookies = array();
$userAgent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36";
// Установка HTTP заголовков
$headers = "Accept-Encoding: gzip, deflate, br\r\n" .
           "Content-Type: application/x-www-form-urlencoded; charset=UTF-8\r\n" .
           "Referer: " . $url . "\r\n" .
           "User-Agent: $userAgent\r\n";
// Загружаем страницу iframe c moonwalk
$page = LoadPage($url, "GET", $headers);
// Добавляем HTTP заголовки для POST запроса
$headers .= ":authority: moonwalk.cc\r\n";
// Поиск дополнительных HTTP заголовков, которые нужно установить
$data = GetRegexValue($page, "#VideoBalancer\((.*?)\);#is");
if (!$data) die("No VideoBalancer info in the loaded iframe.");
$options = JSDecode($data);
// Получение ссылки на js-скрипт, где есть список параметров POST запроса
$jsUrl = GetRegexValue($page, '#src="(.*?)"#');
if (!$jsUrl)  die("Not found js url in the loaded iframe.");
$jsData = LoadPage($urlBase . $jsUrl, "GET", $headers);
// Формируем параметры для POST запроса
$postData = array();
$postData["a"] = (int)$options["partner_id"];
$postData["b"] = (int)$options["domain_id"];
$postData["c"] = false;
$postData["e"] = $options["video_token"];
$postData["f"] = $userAgent;
$data4Encrypt = json_encode($postData, JSON_UNESCAPED_SLASHES);
// Шифруем

preg_match_all('#r=\[(.*?)\];#',$jsData,$keys);
preg_match('#e\[o\("0xb"\)\]="([^"]+)",#',$jsData,$ks);
$k =  explode(',',$keys[1][8]);

preg_match_all('#,e[\[\]"a-z0-9\(\)]+=([\[\]"a-z0-9\(\)\+.\.]+)#',$jsData, $e);

$iv = GetRegexValue($jsData, '#,\b[ira]="([^"]+)",#i');
if (!$iv)
    $iv = str_replace('"','',array_reduce($k, function ($a, $b) { return (string)strlen($a) > (string)strlen($b) ? $a : $b; }));

$tmpKey = array_reduce($e[1], function ($a, $b) { return (string)strlen($a) > (string)strlen($b) ? $a : $b; });
$sums = explode('+', $tmpKey); 

$t = (int)GetRegexValue($jsData, '#}\(r,(\d{1,})\)#')+1;

for (;--$t;)
{
    array_push($k, array_shift($k));
}

$offset = GetRegexValue($jsData, '#r\[e\]};(.+),e[\[\]"a-z0-9\(\)]+=[\[\]"a-z0-9\(\)\+.\.]+;var#');

$k[array_search('"90fc8f081c"', $k)] = $k[0x0];

$key = '';
foreach($sums as $value){
    $find = substr($value,2);
    $find = trim($find, ']');
    $find = str_replace('(','\(', $find);
    $find = str_replace(')','\)', $find);
    if(substr($find, 0,2) == 'o\\')
    {
        $of = GetRegexValue($jsData,'#e[\[\.]'.$find.'[\]]*=[o\("]+([0-9a-fx]+)["\)]+[,\W]#');
        
        if (!$of )
        {
            $tmp = str_replace('"','',$k[intval(substr($find,4), 16)]);
            $of = GetRegexValue($jsData,'#e[\[\.]'.$tmp.'[\]]*=[o\("]+([0-9a-fx]+)["\)]+[,\W]#');
            
            if (!$of)
            {
                $tmp = $k[intval(substr($find,4), 16)];
                $tmp = GetRegexValue($jsData,'#e[\[\.]'.$tmp.'[\]]*=[o\("]+([0-9a-fx]+)["\)]+[,\W]#');
                $of = str_replace('"','',$k[intval(substr($tmp,2), 16)]);
            }
            
            $key .= str_replace('"','',$of);
            continue;
        }
        
        if (substr($of,0,2) !== '0x')
            $key .= $of;
        else 
            $key .= str_replace('"','',$k[intval(substr($of,2), 16)]);
    }
    else if (substr($value, 0,2) == 'e[')
    {
        $tmp = 'o\("0x'.dechex(array_search($find, $k)).'"\)';
        $of = GetRegexValue($jsData,'#e[\[\.]'.$tmp.'[\]]*=[o\("]+([0-9a-fx]+)["\)]+[,\W]#');
        
        if(!$of)
            $key .= str_replace('"','',$k[array_search($find, $k)]);
        else
            $key .= str_replace('"','',$k[intval(substr($of,2), 16)]);
    }
    else if (substr($value, 0,2) == 'e.')
    {
        $tmp = 'o\("0x'.dechex(array_search('"'.$find.'"', $k)).'"\)';
        $of = GetRegexValue($jsData,'#e[\[\.]'.$tmp.'[\]]*=[o\("]+([0-9a-fx]+)["\)]+[,\W]#');
        
        if(!$of)
            $key .= str_replace('"','',$k[array_search($find, $k)]);
        else
            $key .= str_replace('"','',$k[intval(substr($of,2), 16)]);
    }
}

//$vi='84b4163f40967a10ab05aa59bb328b94';
//$key='d21fcd1cc172af12c173249ccb3683163f8ef378f8ad02ac478ef9a0993b6011';


// Шифруем AES cbc PKCS7 Padding
$crypted = openssl_encrypt($data4Encrypt, 'aes-256-cbc', hex2bin($key), 0, hex2bin($iv));
// Делаем POST запрос и получаем список ссылок на потоки
$data = LoadPage($urlBase . "/vs", "POST", $headers, "q=".urlencode($crypted));
if ($type=="json") die($data);
// Делаем из полученных json данных ассоциативный массив PHP
$answerObject = json_decode($data, TRUE);
// Получаем значение ссылки нужного типа потока (по-умолчанию: m3u8)
$link = "";
if (isset($answerObject["mp4" ]) && $type=="mp4") $link = $answerObject["mp4" ];
if (isset($answerObject["m3u8"]) && $link==""   ) $link = $answerObject["m3u8"];
// Если ссылка с таким типом есть, получаем содержимое плейлиста/манифеста
if ($link) {
    if ($urlonly) 
        $data = $link;
    else {
//        if      ($type=="m3u8") header("Content-Type: application/vnd.apple.mpegurl");
//        else if ($type=="f4m" ) header("Content-Type: application/xml");
        $data = LoadPage($link, "GET", $headers);
        if ($attacha) {
            header("Content-Length: ".strlen($data));
            header("Content-Disposition: attachment; filename=play.$type");
        }
    }
} 
// Отдаём полученное
echo $data;
///////////////////////////////////////////////////////////////////////////////
// Получение страницы с указанными методом и заголовками
function LoadPage($url, $method, $headers, $data='') {
    global $cookies;
    // Если есть кукисы - добавляем их значения в HTTP заголовки
    $coo = "";
    foreach($cookies as $key => $val) $coo .= $key."=".urlencode($val)."; ";
    if ($coo) $headers .= "Cookie: $coo\r\n";
    $options = array();
    $options['http'] = array('method' => $method ,
                             'header' => $headers,
                             'content'=> $data   );
    $context = stream_context_create($options);
    $page    = file_get_contents($url, false, $context);
    // Перебираем HTTP заголовки ответа, чтобы установить кукис
    foreach($http_response_header as $c => $h) {
        if (stristr($h, 'content-encoding') and stristr($h, 'gzip')) {
            $page = gzdecode($page);
        } else if (preg_match('#^Set-Cookie:\s*([^;]+)#', $h, $matches)) {
            parse_str($matches[1], $tmp);
            $cookies += $tmp;
        }
    }
    return $page;
}
///////////////////////////////////////////////////////////////////////////////
// Функция получения значения по указанному регулярному выражению
function GetRegexValue($text, $pattern, $group=1) {
    if (preg_match($pattern, $text, $matches))
        return $matches[$group];
    return "";
}
///////////////////////////////////////////////////////////////////////////////
// Функция получения массива из JS кода вместо json_decode
function JSDecode($data) {
  $data = str_replace("encodeURIComponent(", "", $data); // Убираем левые js команды
  $data = str_replace("'),", "',", $data);
  $data = str_replace("'", "\""  , $data); // Заменяем одинарные кавычки на экранированные обычные
  $data = str_replace(["\n","\r"], "", $data);                    // Убираем переносы строк
  $data = preg_replace('/([^\w"\.])(\w+)\s*:/','$1"$2":', $data); // Берём в кавычки имена
  $data = preg_replace('/("\w+")\s*:\s*([\w\.]+)/' ,'$1:"$2"', $data); // Берём в кавычки все значения
  $data = preg_replace('/(,\s*)(})/','$2', $data);                     // Убираем лишние пробелы
  $json = json_decode($data, true);
  return $json;
}
?>

Сегодня, после смены ключей, ваш код прекрасно продолжил работать. Браво!

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

249

Re: moonwalk

Для тех, кто вставляет ключи новые значения

$iv='84b4163f40967a10ab05aa59bb328b94';
$key='d21fcd1cc172af12c173249ccb3683163f8ef378f8ad02ac478ef9a0993b6011';

250 (2018.10.09 13:34:41 отредактировано GSHK)

Re: moonwalk

Будет время - попробую его сделать менее пахнущим, а то аж самому стыдно... В свое оправдание могу лишь сказать что php я не знаю...

Также дома есть наработка с списком прокси, но тоже кастыль...

PS и так размышления в письменном виде... Не проще ли написать скрипт который будет брать значения iv и key с единого ресурса, а на этом ресурсе соответственно либо руками их вбивать, либо же скриптом - чтобы было более универсально и централизованно?

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

251 (2018.10.09 13:35:42 отредактировано smsbox3)

Re: moonwalk

GSHK пишет:

аж самому стыдно... .

Нам нужно ехать, а шашечки дело третье :) Спасибо за работу.
Главное, что он работает и пережил одну смену ключей.

252

Re: moonwalk

Опять умер. За день 2 раз.

$iv = 'd65f71ac333a2fee04ccb76fdcfd36ad';
$key = '3f28892e254dffdc263922b43a461102fa002c5fdcdf65052948ce523a31128b';

253 (2018.10.10 10:09:31 отредактировано GSHK)

Re: moonwalk

Видоизменил и прилизал:

<?php
ini_set("log_errors", 1); ini_set("error_log", $_SERVER['SCRIPT_FILENAME'].".log"); ini_set('error_reporting', E_ALL); ini_set("display_errors", 1);
$urlBase = "http://moonwalk.cc";
// Получение ссылки на видео c moonwalk в переданных параметрах, а также тип получаемого потока.
$url     = isset($_REQUEST['url'    ]) ? $_REQUEST['url' ] : ""    ; // moonwalk.cc iframe url
$type    = isset($_REQUEST['type'   ]) ? $_REQUEST['type'] : "m3u8"; // tyle of link (m3u8, mp4)
$urlonly = isset($_REQUEST['urlonly']); // Флаг, сигнализирующий отдавать ссылку на плейлист, а не само его содержимое
$attacha = isset($_REQUEST['at'     ]); // Флаг, сигнализирующий отдавать плейлист как прикреплённый файл с расширением
if (!$url) die("No moonwalk iframe url in the parameters.");
$cookies = array();
$userAgent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36";
// Установка HTTP заголовков
$headers = "Accept-Encoding: gzip, deflate, br\r\n" .
           "Content-Type: application/x-www-form-urlencoded; charset=UTF-8\r\n" .
           "Referer: " . $url . "\r\n" .
           "User-Agent: $userAgent\r\n";
// Загружаем страницу iframe c moonwalk
$page = LoadPage($url, "GET", $headers);
// Добавляем HTTP заголовки для POST запроса
$headers .= ":authority: moonwalk.cc\r\n";
// Поиск дополнительных HTTP заголовков, которые нужно установить
$data = GetRegexValue($page, "#VideoBalancer\((.*?)\);#is");
if (!$data) die("No VideoBalancer info in the loaded iframe.");
$options = JSDecode($data);
// Получение ссылки на js-скрипт, где есть список параметров POST запроса
$jsUrl = GetRegexValue($page, '#src="(.*?)"#');
if (!$jsUrl)  die("Not found js url in the loaded iframe.");
$jsData = LoadPage($urlBase . $jsUrl, "GET", $headers);
// Формируем параметры для POST запроса
$postData = array();
$postData["a"] = (int)$options["partner_id"];
$postData["b"] = (int)$options["domain_id"];
$postData["c"] = false;
$postData["e"] = $options["video_token"];
$postData["f"] = $userAgent;
$data4Encrypt = json_encode($postData, JSON_UNESCAPED_SLASHES);

preg_match_all('#r=\[(.*?)\];#',$jsData,$keys);
preg_match('#e\[o\("0xb"\)\]="([^"]+)",#',$jsData,$ks);
$k =  explode(',',$keys[1][8]);

preg_match_all('#,e[\[\]"a-z0-9\(\)]+=([\[\]"a-z0-9\(\)\+.\.]+)#',$jsData, $e);

$iv = GetRegexValue($jsData, '#,\b[ira]="([^"]+)",#i');
if (!$iv)
    $iv = str_replace('"','',array_reduce($k, function ($a, $b) { return (string)strlen($a) > (string)strlen($b) ? $a : $b; }));

$tmpKey = array_reduce($e[1], function ($a, $b) { return (string)strlen($a) > (string)strlen($b) ? $a : $b; });

$sums = explode('+', $tmpKey); 

$t = (int)GetRegexValue($jsData, '#}\(r,(\d{1,})\)#')+1;

for (;--$t;)
{
    array_push($k, array_shift($k));
}

$offset = GetRegexValue($jsData, '#r\[e\]};(.+),e[\[\]"a-z0-9\(\)]+=[\[\]"a-z0-9\(\)\+.\.]+;var#');

$key = '';

$offset = explode(',', $offset);

$old = $k; //Для получения значения из элемента типа e["..."]

foreach ($offset as $value) {
    $k[GetIndex($value, $k)] = GetElement($value, $k, $old);
}

foreach ($sums as $value) {
    $key .= GetElement($value, $k, $old);
}

$key = str_replace('"', '', $key);

// Шифруем AES cbc PKCS7 Padding
$crypted = openssl_encrypt($data4Encrypt, 'aes-256-cbc', hex2bin($key), 0, hex2bin($iv));
// Делаем POST запрос и получаем список ссылок на потоки
$data = LoadPage($urlBase . "/vs", "POST", $headers, "q=".urlencode($crypted));
if ($type=="json") die($data);
// Делаем из полученных json данных ассоциативный массив PHP
$answerObject = json_decode($data, TRUE);
// Получаем значение ссылки нужного типа потока (по-умолчанию: m3u8)
$link = "";
if (isset($answerObject["mp4" ]) && $type=="mp4") $link = $answerObject["mp4" ];
if (isset($answerObject["m3u8"]) && $link==""   ) $link = $answerObject["m3u8"];
// Если ссылка с таким типом есть, получаем содержимое плейлиста/манифеста
if ($link) {
    if ($urlonly) 
        $data = $link;
    else {
//        if      ($type=="m3u8") header("Content-Type: application/vnd.apple.mpegurl");
//        else if ($type=="f4m" ) header("Content-Type: application/xml");
        $data = LoadPage($link, "GET", $headers);
        if ($attacha) {
            header("Content-Length: ".strlen($data));
            header("Content-Disposition: attachment; filename=play.$type");
        }
    }
} 
// Отдаём полученное
echo $data;
///////////////////////////////////////////////////////////////////////////////
// Получение страницы с указанными методом и заголовками
function LoadPage($url, $method, $headers, $data='') {
    global $cookies;
    // Если есть кукисы - добавляем их значения в HTTP заголовки
    $coo = "";
    foreach($cookies as $key => $val) $coo .= $key."=".urlencode($val)."; ";
    if ($coo) $headers .= "Cookie: $coo\r\n";
    $options = array();
    $options['http'] = array('method' => $method ,
                             'header' => $headers,
                             'content'=> $data   );
    $context = stream_context_create($options);
    $page    = file_get_contents($url, false, $context);
    // Перебираем HTTP заголовки ответа, чтобы установить кукис
    foreach($http_response_header as $c => $h) {
        if (stristr($h, 'content-encoding') and stristr($h, 'gzip')) {
            $page = gzdecode($page);
        } else if (preg_match('#^Set-Cookie:\s*([^;]+)#', $h, $matches)) {
            parse_str($matches[1], $tmp);
            $cookies += $tmp;
        }
    }
    return $page;
}
///////////////////////////////////////////////////////////////////////////////
// Функция получения значения по указанному регулярному выражению
function GetRegexValue($text, $pattern, $group=1) {
    if (preg_match($pattern, $text, $matches))
        return $matches[$group];
    return "";
}
///////////////////////////////////////////////////////////////////////////////
// Функция получения массива из JS кода вместо json_decode
function JSDecode($data) {
  $data = str_replace("encodeURIComponent(", "", $data); // Убираем левые js команды
  $data = str_replace("'),", "',", $data);
  $data = str_replace("'", "\""  , $data); // Заменяем одинарные кавычки на экранированные обычные
  $data = str_replace(["\n","\r"], "", $data);                    // Убираем переносы строк
  $data = preg_replace('/([^\w"\.])(\w+)\s*:/','$1"$2":', $data); // Берём в кавычки имена
  $data = preg_replace('/("\w+")\s*:\s*([\w\.]+)/' ,'$1:"$2"', $data); // Берём в кавычки все значения
  $data = preg_replace('/(,\s*)(})/','$2', $data);                     // Убираем лишние пробелы
  $json = json_decode($data, true);
  return $json;
}

function GetIndex($raw, &$k) {
    $tmp = explode('=', $raw)[0];
    if (!$tmp)
        $tmp = $raw;
    $i = false;
    
    switch (substr($tmp, 0, 2)) {
        case 'o(' :
            $tmp = substr($tmp,5);
            $tmp = trim($tmp, '")');
            
            $i = intval($tmp, 16);
            break;
        case 'e.' :
            $tmp = substr($tmp,2);
            $tmp = '"'.trim($tmp, ']').'"';
            $i = array_search($tmp, $k);
            
            if(!$i) {
                array_push($k,$tmp);
                $i = array_search($tmp, $k);
            }
            
            break;
        case 'e[' :
            $tmp = substr($tmp,2);
            $tmp = trim($tmp, ')]');
            
            if(substr($tmp,0,2) == 'o(') {
                $tmp = $k[intval(substr($tmp,5), 16)];
            }
            
            $i = array_search($tmp, $k);
            
            if(!$i) {
                array_push($k,$tmp);
                $i = array_search($tmp, $k);
            }
            
            break;
        default :
            return -1;
    }
    
    return $i;
}

function GetElement($raw, &$k, $old) {
    $tmp = '';
    if(strpos($raw, '=') !== false)
        $tmp = explode('=', $raw)[1];    
    else
        $tmp = $raw;
        
    $i = '';
    
    switch (substr($tmp,0,1)) {
        case '"' :
            $i = $tmp;
            break;
        case 'e' :
            if (substr($tmp,0,2) == 'e[')
                $i = $k[GetIndex($tmp,$old)];
                break;
        case 'o' :
            $i = $k[GetIndex($tmp,$k)];
            break;
        default :
            $i = $k[$tmp];
    }
    
    return $i;
}
?>

Может возникнуть проблема при появлении в ключе элемента типа e.123adf123... :(

Спасибо сказали: hokkonorti, smsbox32

254

Re: moonwalk

Не пойму глюки какие то у moonwalk'а или нет, но сегодня очень часто предустановленный key и iv не подходит, потом спустя время подходит... скрипт приложенный выше тоже часто не работает, иногда получаю пустые iv и key, а иногда значения получаю. вообщем как то странно

255

Re: moonwalk

Нашел на каком моменте стопорится всё, хотя ключи указанны
https://streamguard.cc/assets/video-c1e … 0f392.js): failed to open stream: No route to host

И на локалхосте так и на сервере, как будто через раз работает

256 (2018.10.10 16:50:43 отредактировано smsbox3)

Re: moonwalk

hokkonorti пишет:

failed to open stream: No route to host

Тоже самое
Новые ключи
$iv = 'feef7551772e489406cacf6f4358160e';
$key = 'f6b8def0c6e50aca452d8aab46e08f20ba74cc26cca91129a99f7d39c762e7a4';

257

Re: moonwalk

Warning: file_get_contents(http://moonwalk.cc/assets/video-9588c8b176b0d1da2f9886cf8701e49f89986796bf8dd87c15105b5153602d22.js): failed to open stream: No route to host in /var/www/wonky.lostcut.net/moonwalk.php on line 164

Notice: Undefined variable: http_response_header in /var/www/wonky.lostcut.net/moonwalk.php on line 166

Warning: Invalid argument supplied for foreach() in /var/www/wonky.lostcut.net/moonwalk.php on line 166

Notice: Undefined offset: 8 in /var/www/wonky.lostcut.net/moonwalk.php on line 53

Warning: openssl_encrypt(): Using an empty Initialization Vector (iv) is potentially insecure and not recommended in /var/www/wonky.lostcut.net/moonwalk.php on line 116

Warning: file_get_contents(http://moonwalk.cc/vs): failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden in /var/www/wonky.lostcut.net/moonwalk.php on line 164

258

Re: moonwalk

smsbox3 пишет:

Тоже самое, похоже ключи они не меняли сегодня, просто неустойчиво работает.

пробовал на странице разместить и ссылки на m3u8 и ихний плеер через тег iframe,  через тег не разу проблем небыло ещё, разве тогда iframe с ихним плеером должен был загрузиться?

259

Re: moonwalk

$iv = 'feef7551772e489406cacf6f4358160e';
$key = 'f6b8def0c6e50aca452d8aab46e08f20ba74cc26cca91129a99f7d39c762e7a4';

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

260

Re: moonwalk

smsbox3 пишет:

$iv = 'feef7551772e489406cacf6f4358160e';
$key = 'f6b8def0c6e50aca452d8aab46e08f20ba74cc26cca91129a99f7d39c762e7a4';

опередили меня :)

261 (2018.10.10 17:01:04 отредактировано smsbox3)

Re: moonwalk

hokkonorti пишет:

пробовал на странице разместить и ссылки на m3u8 и ихний плеер через тег iframe,  через тег не разу проблем небыло ещё, разве тогда iframe с ихним плеером должен был загрузиться?

Тогда, как предположение, они разные ключи используют, раз один набор два другой.
Надо попробовать несколько раз по-запускать, вдруг еще какая пара ключей появиться.

262

Re: moonwalk

smsbox3 пишет:

Тогда, как предположение, они разные ключи используют, раз один набор два другой.
Надо попробовать несколько раз по-запускать, вдруг еще какая пара ключей появиться.

только что много раз перепроверил, на той же странице где и iframe и m3u8 пытается определить, через file_get_contents и curl чаще получал ошибку No route to host чем содержимое файла m3u8, а вот iframe всё время грузился нормально и одни и теже ключи всё время
$iv = 'feef7551772e489406cacf6f4358160e';
$key = 'f6b8def0c6e50aca452d8aab46e08f20ba74cc26cca91129a99f7d39c762e7a4';

263

Re: moonwalk

опять новые ключи
$iv = 14661ce716c5ac9d60f1c366c7afd866
$key = a0a47c3d5a46cf93102598bc2aac2909ce41c3344a74c76af21d4c63e9e0d4e4

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

264

Re: moonwalk

hokkonorti пишет:

опять новые ключи

Надо делать сервер, что можно будет нам править, а программы будут считывать уже эти ключи. Я только сейчас обнаружил, что ключи не работают, значит 1.5 часа  пропало. Один человек не может сидеть все время на правке,  давайте объединяться . Можно просто форму сделать, куда вбивать и текстовый файл будет записываться, в нем будут актуальные  ключи, первый кто заметил правит, а читают этот файл все.

265

Re: moonwalk

smsbox3 пишет:

Надо делать сервер, что можно будет нам править, а программы будут считывать уже эти ключи. Я только сейчас обнаружил, что ключи не работают, значит 1.5 часа  пропало. Один человек не может сидеть все время на правке,  давайте объединяться . Можно просто форму сделать, куда вбивать и текстовый файл будет записываться, в нем будут актуальные  ключи, первый кто заметил правит, а читают этот файл все.

Я согласен

266

Re: moonwalk

уже устал подгонять код  :\'(

+ открыть спойлер
<?php
ini_set("log_errors", 1); ini_set("error_log", $_SERVER['SCRIPT_FILENAME'].".log"); ini_set('error_reporting', E_ALL); ini_set("display_errors", 1);
$urlBase = "https://streamguard.cc";
// Получение ссылки на видео c moonwalk в переданных параметрах, а также тип получаемого потока.
$url     = isset($_REQUEST['url'    ]) ? $_REQUEST['url' ] : ""    ; // moonwalk.cc iframe url
$type    = isset($_REQUEST['type'   ]) ? $_REQUEST['type'] : "m3u8"; // tyle of link (m3u8, mp4)
$urlonly = isset($_REQUEST['urlonly']); // Флаг, сигнализирующий отдавать ссылку на плейлист, а не само его содержимое
$attacha = isset($_REQUEST['at'     ]); // Флаг, сигнализирующий отдавать плейлист как прикреплённый файл с расширением
if (!$url) die("No moonwalk iframe url in the parameters.");
$cookies = array();
$url = str_replace("http://moonwalk.cc",$urlBase, $url);

$userAgent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36";
// Установка HTTP заголовков
$headers = "Accept-Encoding: gzip, deflate, br\r\n" .
           "Content-Type: application/x-www-form-urlencoded; charset=UTF-8\r\n" .
           "Referer: " . $url . "\r\n" .
           "User-Agent: $userAgent\r\n";
// Загружаем страницу iframe c moonwalk
$page = LoadPage($url, "GET", $headers);
// Добавляем HTTP заголовки для POST запроса
$headers .= ":authority: moonwalk.cc\r\n";
// Поиск дополнительных HTTP заголовков, которые нужно установить
$data = GetRegexValue($page, "#VideoBalancer\((.*?)\);#is");
if (!$data) die("No VideoBalancer info in the loaded iframe.");
$options = JSDecode($data);
// Получение ссылки на js-скрипт, где есть список параметров POST запроса
$jsUrl = GetRegexValue($page, '#src="(.*?)"#');
if (!$jsUrl)  die("Not found js url in the loaded iframe.");
$jsData = LoadPage($urlBase . $jsUrl, "GET", $headers);
// Формируем параметры для POST запроса
$postData = array();
$postData["a"] = (int)$options["partner_id"];
$postData["b"] = (int)$options["domain_id"];
$postData["c"] = false;
$postData["e"] = $options["video_token"];
$postData["f"] = $userAgent;
$data4Encrypt = json_encode($postData, JSON_UNESCAPED_SLASHES);

preg_match_all('#r=\[(.*?)\];#',$jsData,$keys);
preg_match('#e\[o\("0xb"\)\]="([^"]+)",#',$jsData,$ks);
$k =  explode(',',$keys[1][8]);

preg_match_all('#,e[\[\]"a-z0-9\(\)]+=([\[\]"a-z0-9\(\)\+.\.]+)#',$jsData, $e);

$iv = GetRegexValue($jsData, '#,\b[ira]="([^"]+)",#i');
if (!$iv)
    $iv = str_replace('"','',array_reduce($k, function ($a, $b) { return (string)strlen($a) > (string)strlen($b) ? $a : $b; }));

$tmpKey = array_reduce($e[1], function ($a, $b) { return (string)strlen($a) > (string)strlen($b) ? $a : $b; });

$sums = explode('+', $tmpKey); 

$t = (int)GetRegexValue($jsData, '#}\(r,(\d{1,})\)#')+1;

for (;--$t;)
{
    array_push($k, array_shift($k));
}

$offset = GetRegexValue($jsData, '#r\[e\]};(.+),e[\[\]"a-z0-9\(\)]+=[\[\]"a-z0-9\(\)\+.\.]+;var#');

$key = '';

$offset = explode(',', $offset);


$old = $k; //Для получения значения из элемента типа e["..."]

foreach ($offset as $value) {
    $k[GetIndex($value, $k)] = GetElement($value, $k, $old);
}


foreach ($sums as $value) {
    $key .= GetElement($value, $k, $old);
}

$key = str_replace('"', '', $key);

// Шифруем AES cbc PKCS7 Padding
$crypted = openssl_encrypt($data4Encrypt, 'aes-256-cbc', hex2bin($key), 0, hex2bin($iv));
// Делаем POST запрос и получаем список ссылок на потоки
$data = LoadPage($urlBase . "/vs", "POST", $headers, "q=".urlencode($crypted));
if ($type=="json") die($data);
// Делаем из полученных json данных ассоциативный массив PHP
$answerObject = json_decode($data, TRUE);
// Получаем значение ссылки нужного типа потока (по-умолчанию: m3u8)
$link = "";
if (isset($answerObject["mp4" ]) && $type=="mp4") $link = $answerObject["mp4" ];
if (isset($answerObject["m3u8"]) && $link==""   ) $link = $answerObject["m3u8"];
// Если ссылка с таким типом есть, получаем содержимое плейлиста/манифеста
if ($link) {
    if ($urlonly) 
        $data = $link;
    else {
//        if      ($type=="m3u8") header("Content-Type: application/vnd.apple.mpegurl");
//        else if ($type=="f4m" ) header("Content-Type: application/xml");
        $data = LoadPage($link, "GET", $headers);
        if ($attacha) {
            header("Content-Length: ".strlen($data));
            header("Content-Disposition: attachment; filename=play.$type");
        }
    }
} 
// Отдаём полученное
echo $data;
///////////////////////////////////////////////////////////////////////////////
// Получение страницы с указанными методом и заголовками
function LoadPage($url, $method, $headers, $data='') {
    global $cookies;
    // Если есть кукисы - добавляем их значения в HTTP заголовки
    $coo = "";
    foreach($cookies as $key => $val) $coo .= $key."=".urlencode($val)."; ";
    if ($coo) $headers .= "Cookie: $coo\r\n";
    $options = array();
    $options['http'] = array('method' => $method ,
                             'header' => $headers,
                             'content'=> $data   );
    $context = stream_context_create($options);
    $page    = file_get_contents($url, false, $context);
    // Перебираем HTTP заголовки ответа, чтобы установить кукис
    foreach($http_response_header as $c => $h) {
        if (stristr($h, 'content-encoding') and stristr($h, 'gzip')) {
            $page = gzdecode($page);
        } else if (preg_match('#^Set-Cookie:\s*([^;]+)#', $h, $matches)) {
            parse_str($matches[1], $new);
            $cookies += $tmp;
        }
    }
    return $page;
}
///////////////////////////////////////////////////////////////////////////////
// Функция получения значения по указанному регулярному выражению
function GetRegexValue($text, $pattern, $group=1) {
    if (preg_match($pattern, $text, $matches))
        return $matches[$group];
    return "";
}
///////////////////////////////////////////////////////////////////////////////
// Функция получения массива из JS кода вместо json_decode
function JSDecode($data) {
  $data = str_replace("encodeURIComponent(", "", $data); // Убираем левые js команды
  $data = str_replace("'),", "',", $data);
  $data = str_replace("'", "\""  , $data); // Заменяем одинарные кавычки на экранированные обычные
  $data = str_replace(["\n","\r"], "", $data);                    // Убираем переносы строк
  $data = preg_replace('/([^\w"\.])(\w+)\s*:/','$1"$2":', $data); // Берём в кавычки имена
  $data = preg_replace('/("\w+")\s*:\s*([\w\.]+)/' ,'$1:"$2"', $data); // Берём в кавычки все значения
  $data = preg_replace('/(,\s*)(})/','$2', $data);                     // Убираем лишние пробелы
  $json = json_decode($data, true);
  return $json;
}

function GetIndex($raw, &$k) {
    $tmp = explode('=', $raw)[0];
    if (!$tmp)
        $tmp = $raw;
    $i = false;
    
    switch (substr($tmp, 0, 2)) {
        case 'o(' :
            $tmp = substr($tmp,5);
            $tmp = trim($tmp, '")');
            
            $i = intval($tmp, 16);
            break;
        case 'e.' :
            $tmp = substr($tmp,2);
            $tmp = '"'.trim($tmp, ']').'"';
            $i = array_search($tmp, $k);
            
            if(!$i) {
                $tmp = trim($tmp, '"');
                $k[$tmp] = $tmp;
                $i = $tmp;
            }
            
            break;
        case 'e[' :
            $tmp = substr($tmp,2);
            $tmp = trim($tmp, ')]');
            
            if(substr($tmp,0,2) == 'o(') {
                $tmp = $k[intval(substr($tmp,5), 16)];
            }
            
            $i = array_search($tmp, $k);
            
            if(!$i) {
                array_push($k,$tmp);
                $i = array_search($tmp, $k);
            }
            
            break;
        default :
            return -1;
    }
    
    return $i;
}

function GetElement($raw, &$k, $old) {
    $tmp = '';
    if(strpos($raw, '=') !== false)
        $tmp = explode('=', $raw)[1];    
    else
        $tmp = $raw;
        
    $i = '';
    
    switch (substr($tmp,0,1)) {
        case '"' :
            $i = $tmp;
            break;
        case 'e' :
            if (substr($tmp,0,2) == 'e[')
                $i = $k[GetIndex($tmp,$old)];
            else if (substr($tmp,0,2) == 'e.')
                $i = $k[substr($tmp,2)];
                break;
        case 'o' :
            $i = $k[GetIndex($tmp,$k)];
            break;
        default :
            $i = $k[$tmp];
    }
    
    return $i;
}
?>
Спасибо сказали: smsbox31

267

Re: moonwalk

smsbox3 пишет:

Надо делать сервер, что можно будет нам править, а программы будут считывать уже эти ключи. Я только сейчас обнаружил, что ключи не работают, значит 1.5 часа  пропало. Один человек не может сидеть все время на правке,  давайте объединяться . Можно просто форму сделать, куда вбивать и текстовый файл будет записываться, в нем будут актуальные  ключи, первый кто заметил правит, а читают этот файл все.

Предлагаю такой вариант.
Я в репозитории на github создал файл https://github.com/WendyH/PHP-Scripts/b … 4crack.ini, который содержит значения iv и key.
Значения которых можно прочитать на PHP примерно так:

// Получаем данные для шифрования
$ini_text  = file_get_contents("https://github.com/WendyH/PHP-Scripts/raw/master/moon4crack.ini");
$moon_vals = parse_ini_string($ini_text);
$iv  = $moon_vals['iv' ];
$key = $moon_vals['key'];

И я приглашаю энтузиастов (если ещё не зарегались на github - зарегаться) прислать мне в личку Username своей учётки в Github - я вышлю инвайт на вступление в соавторы (contibutors) данного репозитория. И там вы сможете править значения iv и key. Или даже moonwalk.php, если хотите его улучшить.

В данный момент скрипт на моём сервере так и работает, берёт значения из  файла moon4crack.ini. Вот с таким исходником.

GSHK, хорошее дело делаешь. Заведи себе репу на github плиз, чтобы тут кодом постоянно обновляемым не мусорить и просто анонсировать об изменениях. Я обязательно подпишусь, ибо идея очень правильная - автоматизировать реакцию на изменения кода. Потому что как бы они не могли поменять код, всё время изобретать то не будут, просто хотят постоянно видоизменяемую защиту сделать. А где защита работает по алгоритму, там и алгоритм противодействия сделать можно.

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

268

Re: moonwalk

У меня github почему то перестал открываться, получаю ошибку ERR_TIMED_OUT, хотя другие сайты открываются, чистка браузера и открытие через инкогнито тоже не помогла. Не пойму в чем дело. Но через wget страницы с гитхаба скачиваются.... Вообщем не понятное чтото происходит..

недавно регался, мой логин wiyegate, я ещё открывал issue по поводу битых ссылок в вк

269

Re: moonwalk

Есть одна идея по автоматическому противодействию их защите любых видов, но на основной работе к сожалению нет времени

270

Re: moonwalk

При правке ссылка новая получается ! Скрип не берет ее
https://github.com/Izvekov/PHP-Scripts/ … 4crack.ini
Новые значения
iv  = "fd5dee1b81bcb7fbdc03f5228de6a96b"
key = "3e680ab05a87b0b66c9c3a3ddbd03d88e483c99fa969bf32d62d000883580e4b"