Ооо, опенлоад. Это боги шифрования!
Я его тут давеча вместе со Spell победил. Без всяких PhantomJS. Это было эпично.
Сказал Spell-у, что выложу статью, как такие защиты ломать.. Но несколько раз начав, понял, что это тот ещё труд (статьи писать) и времени так и не хватило. Надеюсь напишу, всё-таки. Вроде простые вещи нужно донести, но пока эти картинки и gif-ы подготовишь, да так, чтобы выглядело прилично - уйма времени уходит.
Чтобы понимали, с чем там сталкиваются люди, которые заглядывают в код страницы, там такое:
<script type="text/javascript">゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=(゚ー゚) =_=3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); (゚Д゚) =(゚Θ゚)= (o^_^o)/ (o^_^o);(゚Д゚)={゚Θ゚: '_' ,゚ω゚ノ : ((゚ω゚ノ==3) +'_') [゚Θ゚] ,゚ー゚ノ :(゚ω゚ノ+ '_')[o^_^o -(゚Θ゚)] ,゚Д゚ノ:((゚ー゚==3) +'_')[゚ー゚] }; (゚Д゚) [゚Θ゚] =((゚ω゚ノ==3) +'_') [c^_^o];(゚Д゚) ['c'] = ((゚Д゚)+'_') [ (゚ー゚)+(゚ー゚)-(゚Θ゚) ];(゚Д゚) ['o'] = ((゚Д゚)+'_') [゚Θ゚];(゚o゚)=(゚Д゚) ['c']+(゚Д゚) ['o']+(゚ω゚ノ +'_')[゚Θ゚]+ ((゚ω゚ノ==3) +'_') [゚ー゚] + ((゚Д゚) +'_') [(゚ー゚)+(゚ー゚)]+ ((゚ー゚==3) +'_') [゚Θ゚]+((゚ー゚==3) +'_') [(゚ー゚) - (゚Θ゚)]+(゚Д゚) ['c']+((゚Д゚)+'_') [(゚ー゚)+(゚ー゚)]+ (゚Д゚) ['o']+((゚ー゚==3) +'_') [゚Θ゚];(゚Д゚) ['_'] =(o^_^o) [゚o゚] [゚o゚];(゚ε゚)=((゚ー゚==3) +'_') [゚Θ゚]+ (゚Д゚) .゚Д゚ノ+((゚Д゚)+'_') [(゚ー゚) + (゚ー゚)]+((゚ー゚==3) +'_') [o^_^o -゚Θ゚]+((゚ー゚==3) +'_') [゚Θ゚]+ (゚ω゚ノ +'_') [゚Θ゚]; (゚ー゚)+=(゚Θ゚); (゚Д゚)[゚ε゚]='\\'; (゚Д゚).゚Θ゚ノ=(゚Д゚+ ゚ー゚)[o^_^o -(゚Θ゚)];(o゚ー゚o)=(゚ω゚ノ +'_')[c^_^o];(゚Д゚) [゚o゚]='\"';(゚Д゚) ['_'] ( (゚Д゚) ['_'] (゚ε゚+(゚Д゚)[゚o゚]+ (゚Д゚)[゚ε゚]+(-~0)+ ((o^_^o) +(o^_^o) +(c^_^o))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(-~0)+ ((゚ー゚) + (゚Θ゚))+ (-~0)+ (゚Д゚)[゚ε゚]+(-~0)+ ((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o) +(c^_^o))+ (゚Д゚)[゚ε゚]+(-~0)+ (-~3)+ (-~3)+ (゚Д゚)[゚ε゚]+(-~0)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(-~0)+ ((o^_^o) +(o^_^o) +(c^_^o))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ ((o^_^o) +(o^_^o) +(c^_^o))+ (゚Д゚)[゚ε゚]+(-~0)+ (-~3)+ ((o^_^o) +(o^_^o) +(c^_^o))+ (゚Д゚)[゚ε゚]+(-~0)+ (-~3)+ ((o^_^o) +(o^_^o) +(c^_^o))+ (゚Д゚)[゚ε゚]+(-~0)+ (-~3)+ ((o^_^o) +(o^_^o) +(c^_^o))+ (゚Д゚)[゚ε゚]+(-~0)+ (-~3)+ ((o^_^o) +(o^_^o) +(c^_^o))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(-~3)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(-~0)+ (-~1)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(-~0)+ ((c^_^o)-(c^_^o))+ (-~1)+ (゚Д゚)[゚ε゚]+(-~0)+ (-~1)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(-~0)+ (-~1)+ (-~0)+ (゚Д゚)[゚ε゚]+(-~0)+ (-~1)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(-~0)+ (-~3)+ (-~0)+ (゚Д゚)[゚ε゚]+(-~0)+ (-~-~1)+ ((c^_^o)-(c^_^o))+ (゚Д゚)[゚ε゚]+(-~0)+ ((c^_^o)-(c^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(-~0)+ ((c^_^o)-(c^_^o))+ (-~1)+ (゚Д゚)[゚ε゚]+(-~0)+ (-~3)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+(-~3)+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o^_^o))+ (-~-~1)+ (゚Д゚)[゚o゚]) (゚Θ゚)) ('_');var _0x9495=['\x5a\x66\x74','\x70\x6f\x77','\x74\x63\x56','\x45\x41\x6b','\x51\x48\x62','\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74','\x31\x31\x7c\x31\x32\x7c\x31\x33\x7c\x30\x7c\x31\x34\x7c\x33\x7c\x32\x7c\x39\x7c\x31\x36\x7c\x31\x7c\x34\x7c\x38\x7c\x35\x7c\x36\x7c\x31\x35\x7c\x31\x30\x7c\x37','\x73\x70\x6c\x69\x74','\x78\x58\x4d','\x6c\x65\x6e\x67\x74\x68','\x6a\x4c\x61','\x73\x75\x62\x73\x74\x72\x69\x6e\x67','\x61\x5a\x50','\x64\x4f\x44','\x50\x6f\x79','\x77\x72\x69\x74\x65','\x70\x75\x73\x68','\x64\x6b\x46','\x74\x65\x78\x74','\x74\x6a\x66','\x48\x49\x5a','\x57\x79\x58','\x66\x61\x7a','\x47\x63\x79','\x75\x63\x73','\x32\x7c\x30\x7c\x35\x7c\x34\x7c\x33\x7c\x31','\x64\x68\x68','\x70\x51\x75','\x65\x4d\x7a','\x5a\x42\x44','\x4c\x6e\x6b','\x66\x72\x6f\x6d\x43\x68\x61\x72\x43\x6f\x64\x65','\x44\x59\x6c','\x34\x7c\x33\x7c\x30\x7c\x35\x7c\x36\x7c\x32\x7c\x31','\x57\x4f\x61','\x67\x7a\x77','\x63\x42\x56'];(function(_0x1f55fe,_0x45ae62){var _0x3d4039=function(_0x32de24){while(--_0x32de24){_0x1f55fe['\x70\x75\x73\x68'](_0x1f55fe['\x73\x68\x69\x66\x74']());}};_0x3d4039(++_0x45ae62);}(_0x9495,0xbf));var _0x5949=function(_0x1f55fe,_0x45ae62){_0x1f55fe=_0x1f55fe-0x0;var _0x3d4039=_0x9495[_0x1f55fe];return _0x3d4039;};$(document)['\x72\x65\x61\x64\x79'](function(){var _0x45ae41={'\x78\x58\x4d':function _0x184df4(_0x3f842b,_0x6062d8){return _0x3f842b<_0x6062d8;},'\x6a\x4c\x61':function _0x3457b8(_0x38f439,_0x457b87){return _0x38f439*_0x457b87;},'\x61\x5a\x50':function _0x961da7(_0x56acea,_0x37f246){return _0x56acea+_0x37f246;},'\x64\x4f\x44':function _0x2dfccb(_0x44ea34,_0xe1a069,_0x49022f){return _0x44ea34(_0xe1a069,_0x49022f);},'\x50\x6f\x79':function _0x170b95(_0x49e0ac,_0x204c53){return _0x49e0ac in _0x204c53;},'\x64\x6b\x46':function _0x275cbe(_0x48d105,_0x930083){return _0x48d105(_0x930083);},'\x74\x6a\x66':function _0x2af2f3(_0x5d6e96,_0x41b58f){return _0x5d6e96*_0x41b58f;},'\x48\x49\x5a':function _0x1ccc24(_0x2f473c,_0xef0da5){return _0x2f473c^_0xef0da5;},'\x57\x79\x58':function _0x83e7c(_0x4fa9eb,_0x4fc60d){return _0x4fa9eb^_0x4fc60d;},'\x66\x61\x7a':function _0x7ec967(_0x1d25ce,_0x2d0418){return _0x1d25ce^_0x2d0418;},'\x47\x63\x79':function _0x3346a1(_0x5cef79,_0x59b5a3){return _0x5cef79%_0x59b5a3;},'\x75\x63\x73':function _0x2f75f3(_0x3e1dda,_0x192d4c){return _0x3e1dda<_0x192d4c;},'\x64\x68\x68':function _0x2cc0da(_0x240c12,_0x5b7c4c){return _0x240c12*_0x5b7c4c;},'\x70\x51\x75':function _0xe29029(_0x45e457,_0x88979d){return _0x45e457/_0x88979d;},'\x65\x4d\x7a':function _0xe40d05(_0x5a668a,_0x2c7bd1){return _0x5a668a<<_0x2c7bd1;},'\x5a\x42\x44':function _0x46f50e(_0x5ba232,_0x312024){return _0x5ba232&_0x312024;},'\x4c\x6e\x6b':function _0x56789d(_0x3aa5f8,_0x3172ef){return _0x3aa5f8!=_0x3172ef;},'\x44\x59\x6c':function _0x19031e(_0x144a2e,_0x309a9f){return _0x144a2e>>_0x309a9f;},'\x57\x4f\x61':function _0x1689bf(_0x39dbf0,_0x42e9f7){return _0x39dbf0 in _0x42e9f7;},'\x67\x7a\x77':function _0x5cedc0(_0x21a7ef,_0x482441){return _0x21a7ef<_0x482441;},'\x63\x42\x56':function _0x47a063(_0x47d3f1,_0x4bebf9){return (parseInt,_0x1fa71e,0x10);continue;}break;}}while(_0x45ae41[_0x5949('0x23')](_0x3d9c8e,_0x5eb93a));continue;case'\x31\x31':var _1x4bfb36=parseInt('15014242734',8)-26;continue;case'\x31\x32':var _0x1a873b=0x0;continue;case'\x31\x33':var _0x3d9c8e=0x0;continue;}break;}}continue;case'\x31\x31':var _0x531f91=_0x45ae41['\x64\x6b\x46']($,_0x45ae41[_0x5949('0x6')]('\x23',ffff))[_0x5949('0xc')]();continue;case'\x31\x32':var _0x5d72cd=_0x531f91[_0x5949('0x24')](0x0);continue;case'\x31\x33':_0x5d72cd=_0x531f91;continue;case'\x31\x34':var _0x41e0ff=_0x45ae41[_0x5949('0x14')](0x9,0x8);continue;case'\x31\x35':var _0x145894=0x0;continue;case'\x31\x36':var _0x31f4aa={'\x6b':_0x439a49,'\x6b\x65':[]};continue;}break;}});
゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=(゚ー゚) =_=3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); (゚Д゚) =(゚Θ゚)= (o^_^o)/ (o^_^o);(゚Д゚)={゚Θ゚: '_' ,゚ω゚ノ : ((゚ω゚ノ==3) +'_') [゚Θ゚] ,゚ー゚ノ :(゚ω゚ノ(゚Д゚) ['c']+(゚Д゚) ['o']+(゚ω゚ノ +'_')[゚Θ゚]+ ((゚ω゚ノ==3) +'_') [゚ー゚] + ((゚Д゚) +'_') [(゚ー゚)+(゚ー゚)]+ ((゚ー゚==3) +'_') [゚Θ゚]+((゚ー゚==3) +'_') [(゚ー゚) - (゚Θ゚)]+(゚Д゚) ['c']+((゚Д゚)+'_') [(゚
Напрочь обфусцированный код. С подсказок Spell, первая и последняя часть кода деобфусцируется декодером https://cat-in-136.github.io/2010/12/aa … ncode.html
А вот среднюю часть приходится декодировать вручную. И это нифига не быстро.
Но суть там следующая. После загрузки кода страницы и исполнения JavaScript в значении тега на странице появляется ссылка на видео (вместо слов Била Гейтса "640K ought to be enough for anybody").
<div class="" style="display:none;">
<p style="" id="baswccx3Pc">81cb6ce07f116636e8a6b5e4987ac42abac7b3ca21c94e06acef26927924d76ca37221b2784d43704402465a63506b01495d5861500344577f496703604458664503607f777752017679406d5e03467e4f5f115f6545506a026665707e70024a5653571d</p>
<p style="" class="" id="DtsBlkVFQx">640K ought to be enough for anybody</p>
</div>
Эта ссылка расшифровывается с помощью кода, привязана к IP и код с каждой загрузкой страницы немного меняется. Точнее меняются значения для дешифрования.
Так вот эти меняющиеся значения сильно добавляли головной боли. Т.е. их можно было получить только после деобфускации. Но я придумал, как получить их значения по уже частично известным данным.
Дело в том, что в зашифрованной ссылке, начало всегда начиналось с кода, который можно получить в открытом виде из html.
Например, ссылка iframe такая:
https://openload.co/embed/CWaAkV9Rp4I/Like.Father.2018.720p.WEBRip.HiWayGrope.mkv.mp4
а зашифрованная ссылка на странице на видео поток получалась такая:
CWaAkV9Rp4I~1540044612~2.94.0.0~eHngQiDs?mime=true
(к ней ещё нужно потом добавить /stream/ в начало, чтобы получилось что-то вроде https://openload.co/stream/CWaAkV9Rp4I~ … ?mime=true)
Так вот этот код: CWaAkV9Rp4I, известен заранее. Что помогает вычислить первоначальные значения magic чисел, с помощью которых идёт дешифрация (которые как раз меняются при каждом обращении к странице).
В общем, на PHP я пока такое не реализовывал, но может быть, поможет код для HMS на C++Script?
///////////////////////////////////////////////////////////////////////////////
// Расшифровка части ссылки с openload.co
string Decode_Openload(string encoded, string known) {
string decoded = ""; int i, encByte; Variant magic4Xor = StrToInt64("0");
variant arr4Xor = [1,2,3,4,5,6,7,8,9];
for (i=0; i<9; i++) // fill array by first 9 dwords
arr4Xor[i] = '0x'+Copy(encoded, i*8+1, 8);
encoded = Copy(encoded, i*8+1, 9999); // skip dwords
int dwCount = 0; i = 0;
while (i < Length(encoded)) {
int maxByte = 0x40;
int count2 = 0;
Variant val4xor = StrToInt64("0");
do {
if (i+1 >= Length(encoded)) maxByte = 0x8f;
encByte = StrToInt('0x'+Copy(encoded, i+1, 2)); // parseInt(s, 16)
int masked = encByte && 0x3F;
if (count2 < 30) val4xor += masked << count2;
else val4xor += masked * exp(ln(2) * count2); // exp(ln(X) * Y) - возведение в степень на паскале!!
count2 += 6; i += 2;
} while (encByte >= maxByte);
// Вот такое извращение для приведения к типу Int64 (другого не придумал)
Variant i64 = StrToInt64(IntToStr(val4xor));
Variant deV = i64 ^ StrToInt64(arr4Xor[dwCount % 9]);
// Если ещё не делали - получаем значения для XOR по известным четырём символам
if (magic4Xor==0) {
magic4Xor = StrToInt(Format('0x%x%x%x%x', [Ord(known[4])+1, Ord(known[3])+1, Ord(known[2])+1, Ord(known[1])+1])) ^ deV;
}
deV = deV ^ magic4Xor;
decoded += Chr(deV && 0xFF - 1);
decoded += Chr(deV >> 8 && 0xFF - 1);
decoded += Chr(deV >> 16 && 0xFF - 1);
decoded += Chr(deV >> 24 && 0xFF - 1);
dwCount++;
}
return ReplaceStr(decoded, '$', '');
}
///////////////////////////////////////////////////////////////////////////////
// Получение ссылки с openload.co
void GetLink_Openload(string link) {
string html, code, encrypted;
html = HmsDownloadURL(link);
// Получаем код для расшифровки
HmsRegExMatch('embed/(.*?)/', link, code); // вида "CWaAkV9Rp4I" - известное начало дешифрованной ссылки
// Получаем зашифрованный участок
if (HmsRegExMatch('<p[^>]+id="\\w{10}">(.*?)<', html, encrypted)) // в переменную encrypted получаем зашифрованные данные, которые нужно дешифровать
MediaResourceLink = 'https://openload.co/stream/'+Decode_Openload(encrypted, code)+'?mime=true';
else
HmsLogMessage(2, mpTitle+": Not found encrypted data in embeded iframe.");
}
///////////////////////////////////////////////////////////////////////////////
// Г Л А В Н А Я П Р О Ц Е Д У Р А //
{
mpFilePath = "https://recentfilms.info/komediya/258-kak-otec-like-father-2018.html"; // для примера
string html = HmsDownloadURL(mpFilePath);
if (HmsRegExMatch('(https?://openload.co/embed/.*?)"', html, mpFilePath))
GetLink_Openload(mpFilePath);
else
HmsLogMessage(2, mpTitle+": No openload iframe in loaded page.");
}
Сразу оговорюсь - очень много сил ушло на борьбу с перегрузкой чисел INT64, которые в HMS вообще вели себя не так как в JavaScript. Поэтому данный код напичкан странными StrToInt64("0") и проч. Без которых вообще, как оказалось, невозможно получить число, не приводя его к Int или Double. А это вообще не одно и то же.
Потом, может завтра, попробую перевести это дело на PHP, если интересует. Мне это будет сделать проще, ибо извращался тут я сам.
Ну а по поводу использования PhantomJs - тут задача сильно упрощается. Прям завидую тем, кто может использовать Phyton для своих медиа-серверов и проч. Тут приходится иметь дело с тем, что есть. FastScript убог, на самом деле.
И satelitas, я вообще не представляю, как вы хотели "этот плагин переписать c phyton на php без phantomjs". В том то и подход там, чтобы использовать phantomjs. Без него вам нужно придумывать что-то абсолютно другое.
Типа как я - разбираться, как генерятся нужные ссылки, как они дешифруются и писать подобное самому.
В общем, для кучи, даю ссылку на подкаст для зарубежного сайта openloadmovie.org (фильмы только на английском):
Чтобы можно было на нём поизучать, как работает мною приведённый код.
P.S.: Кстати, есть php-phantomjs, но с ним я ещё дело не имел.
Sony Bravia KDL-32CX523