1

Тема: Если вы на сайте встретили флеш-плеер Uppod и зашифрованные ссылки

Эта информация для тех, кто хочет сам написать подкаст для сайта, где все ссылки зашифрованы.

Если вы встретили на сайте флеш-плеер uppod.swf

Если вы видите, что ссылки на файл видео или плейлиста зашифрованы, или есть ссылка на другой текстовый файл, который зашифрован во flashvars...
Например, как когда-то на степашка.ком:

<param name="flashvars" value="comment=Stream-video&st=http://www.stepashka.com/engine/classes/flashplayer/video88-1287.txt&pl=4cQoHu0Npl8L81bNpnEDHlQ3H1Ff41XhpIvNVSMdVCM8USGNw1G3VT3h4TYXHWG3HTRXYTbfpTQawArr" />

или просто видите, что используется uppod плеер, но ссылок на странице и близко не видно, то можно попытаться это дело расшифровать.

Вообще, во всех случаях изучения получения ссылки - формула примерно одна:

  • Сниффером (например, Wireshark или Charles) слушаем http и смотрим какие запросы идут и ответы приходят;
  • Скачиваем флеш плеер, декомпилируем (например, Flash Decompiler Trillix) и изучаем как оно всё там происходит.

В случае с uppod, есть несколько советов, возможно, очень облегчающих получение реальной ссылки.
Если с плеером uppod ссылки закодированы, значит хозяева ресурса его купили и платная версия этого плеера собирается с возможностью шифрования ссылок. Шифровка ссылок у каждого клиента, купившего плеер, своя. Поэтому придётся смотреть внутрь плеера, который используется на ресурсе.

Но на самом деле, если повезёт и ничего дополнительно не используется для шифрования и защиты контента, там всё просто:

  1. Скачиваем uppod.swf;
  2. Декомпилируем;
  3. Ищем в файле скрипта ActionScript плеера значения двух массивов с именами codec_a и codec_b;

Например, в плеере http://filmix.net/styles/uppod.swf это будут строки типа:

client.codec_a = new Array("l", "u", "T", "D", "Q", "H", "0", "3", "G", "1", "f", "M", "p", "U", "a", "I", "6", "k", "d", "s", "b", "W", "5", "e", "y", "=");
client.codec_b = new Array("w", "g", "i", "Z", "c", "R", "z", "v", "x", "n", "N", "2", "8", "J", "X", "t", "9", "V", "7", "4", "B", "m", "Y", "o", "L", "h");

В плеере http://st.kset.kz/pl/pl.swf:

client.codec_a = ["m", "T", "u", "p", "L", "n", "M", "6", "Q", "i", "w", "7", "t", "X", "s", "0", "l", "a", "k", "v", "G", "B", "D", "2", "R", "="];
client.codec_b = ["9", "c", "W", "Z", "I", "H", "J", "e", "V", "o", "y", "z", "d", "N", "b", "4", "U", "Y", "x", "g", "5", "8", "3", "1", "f", "F"];

Это - таблицы замен символов. Они, по-умолчанию, тупо кодируют текст в Base64 и меняют символы по этим таблицам. Поэтому можно попытаться расшифровать ссылку или текст следующим скриптом:

+ C++Script

string DecodeUppodText(string sData) {
  char char1, char2; int i;
  variant Client_codec_a = ["l", "u", "T", "D", "Q", "H", "0", "3", "G", "1", "f", "M", "p", "U", "a", "I", "6", "k", "d", "s", "b", "W", "5", "e", "y", "="];
  variant Client_codec_b = ["w", "g", "i", "Z", "c", "R", "z", "v", "x", "n", "N", "2", "8", "J", "X", "t", "9", "V", "7", "4", "B", "m", "Y", "o", "L", "h"];

  sData = ReplaceStr(sData, "\n", "");
  for (i=0; i<Length(Client_codec_a); i++) {
    char1 = Client_codec_b[i];
    char2 = Client_codec_a[i];
    sData = ReplaceStr(sData, char1, "___");
    sData = ReplaceStr(sData, char2, char1);
    sData = ReplaceStr(sData, "___", char2);
  }
  sData = HmsUtf8Decode(HmsBase64Decode(sData));
  return sData;
} 

+ PascalScript

Function DecodeUppodText(sData: String): String;
Var
  char1, char2: String; i: Integer;
  Client_codec_a: Variant = ["l", "u", "T", "D", "Q", "H", "0", "3", "G", "1", "f", "M", "p", "U", "a", "I", "6", "k", "d", "s", "b", "W", "5", "e", "y", "="];
  Client_codec_b: Variant = ["w", "g", "i", "Z", "c", "R", "z", "v", "x", "n", "N", "2", "8", "J", "X", "t", "9", "V", "7", "4", "B", "m", "Y", "o", "L", "h"];
Begin
  sData := ReplaceStr(sData, "\n", "");
  For i:=0 to Length(Client_codec_a)-1 Do Begin
    char1 := Client_codec_b[i];
    char2 := Client_codec_a[i];
    sData := ReplaceStr(sData, char1, "___");
    sData := ReplaceStr(sData, char2, char1);
    sData := ReplaceStr(sData, "___", char2);
  End;
  Result := HmsUtf8Decode(HmsBase64Decode(sData));
End; 

Т.е. вызов этой функции с зашифрованным текстом, вернёт нормальный текст:

DecodeUppodText('XRHzQZe3yMD8Bxn8oCYgDac3Qxl3fmFTOZuL2ZAvDj5Y5jQn5WElfxJzDmts205z50wWDju37aA3SxFgBWwT5mlg7R=z')

вернёт http://filmix.net/pl/5ab882007f69b75ba04e4eb8364c9ff8/up/Hannibal.txt

В uppod плеере, если кто будет копаться, функции шифровки/дешифровки находятся в классе Is. Вход проверки дешифровки - функция _foo. Хотя, названия функций и класса очень похожи на обфусцированные, поэтому от версии к версии плеера, возможно, будут отличаться.

Sony Bravia KDL-32CX523

2

Re: Если вы на сайте встретили флеш-плеер Uppod и зашифрованные ссылки

Если плеере Uppod нет значений client.codec_a и client.codec_b

Если используется плеер Uppod, ссылки зашифрованы, но инициализация client.codec_a и client.codec_b нигде в исходниках плеера не встречается, то может быть ещё и второй вариант - кодирование с помощью hash функции.

Для этого нужно также в исходниках декомпилированного флеш-плеера найти:

private var hash:String = "0123456789WGXMHRUZID=NQVBLihbzaclmepsJxdftioYkngryTwuvihv7ec41D6GpBtXx3QJRiN5WwMf=ihngU08IuldVHosTmZz9kYL2bayE";

Скопировать значение этой строки и использовать в следующих функциях:

+ C++Script

string DecodeUppodTextHash(string sData) {
  variant char1, char2, hash, tab_a, tab_b; int i;

  hash = "0123456789WGXMHRUZID=NQVBLihbzaclmepsJxdftioYkngryTwuvihv7ec41D6GpBtXx3QJRiN5WwMf=ihngU08IuldVHosTmZz9kYL2bayE";

  // Проверяем, может не нужно раскодировать (json или ссылка)
  if ((Pos("{", sData)>0) || (LeftCopy(sData, 4)=="http")) return HmsUtf8Decode(sData);

  sData = DecodeUppod_tr(sData, "r", "A");
  
  hash = ReplaceStr(hash, 'ih', '\n');
  if (RightCopy(sData, 1)=='!') {
    sData = LeftCopy(sData, Length(sData)-1);
    tab_a = ExtractWord(4, hash, '\n');
    tab_b = ExtractWord(3, hash, '\n');
  } else {
    tab_a = ExtractWord(2, hash, '\n');
    tab_b = ExtractWord(1, hash, '\n');
  }

  sData = ReplaceStr(sData, "\n", "");
  for (i=1; i<=Length(tab_a); i++) {
    char1 = Copy(tab_b, i, 1);
    char2 = Copy(tab_a, i, 1);
    sData = ReplaceStr(sData, char1, "___");
    sData = ReplaceStr(sData, char2, char1);
    sData = ReplaceStr(sData, "___", char2);
  }
  sData = HmsUtf8Decode(HmsBase64Decode(sData));
  sData = ReplaceStr(sData, "hthp:", "http:");
  return sData;
}

string DecodeUppod_tr(string sData, string ch1, string ch2) {
  string s = ""; int i, loc3, nLen;

  if ((Copy(sData, Length(sData)-1, 1)==ch1) && (Copy(sData, 3, 1)==ch2)) {
    nLen = Length(sData);
    for (i=nLen; i>0; i--) s += Copy(sData, i, 1);
    loc3 = Int(StrToIntDef(Copy(s, nLen-1, 2), 0)/2);
    s = Copy(s, 3, nLen-5); i = loc3;
    if (loc3 < Length(s)) {
      while (i < Length(s)) {
        s = LeftCopy(s, i) + Copy(s, i+2, 99999);
        i+= loc3;
      }
    }
    sData = s + "!";
  }
  return sData;
}

+ PascalScript

Function DecodeUppodTextHash(sData: String): String;
var
  hash, tab_a, tab_b: string; i: Integer;
begin
  hash := "0123456789WGXMHRUZID=NQVBLihbzaclmepsJxdftioYkngryTwuvihv7ec41D6GpBtXx3QJRiN5WwMf=ihngU08IuldVHosTmZz9kYL2bayE";

  sData:= DecodeUppod_tr(sData, 'r', 'A'); //engine/classes/flashplayer/uppod-tc.swf
  hash := ReplaceStr(hash, 'ih', #13);
  if RightCopy(sData, 1) = '!' then begin
    sData := LeftCopy(sData, Length(sData)-1);
    tab_a := ExtractWord(4, hash, #13);
    tab_b := ExtractWord(3, hash, #13);
  end else begin
    tab_a := ExtractWord(2, hash, #13);
    tab_b := ExtractWord(1, hash, #13);
  end;

  sData := ReplaceStr(sData, #13, "");
  for i := 1 to Length(tab_a) do begin
    sData := ReplaceStr(sData, tab_b[i], "___"   );
    sData := ReplaceStr(sData, tab_a[i], tab_b[i]);
    sData := ReplaceStr(sData, "___",    tab_a[i]);
  end;
  Result := HmsUtf8Decode(HmsBase64Decode(sData));
End;

Function DecodeUppod_tr(sData, ch1, ch2: String): String;
var
  sNewData, sLoc3: string; i, n: Integer; e, iLoc3: Extended;
begin
  sNewData := '';
  if (sData[Length(sData)-1] = ch1) AND (sData[3] = ch2) then begin
    i := Length(sData);
    while (i > 0) do begin sNewData := sNewData + sData[i]; i := i - 1; end;
    sData := sNewData;
    sLoc3 := Copy(sData, Length(sData)-1, 2);
    sData := Copy(sData, 3, Length(sData)-5);
    iLoc3 := StrToFloatDef(sLoc3, 10000) / 2;
    if iLoc3 < Length(sData) then begin
      e := iLoc3; i := Length(sData); n := 0;
      while (e <= i) do begin
        sData := LeftCopy(sData, Trunc(e)) + Copy(sData, Trunc(e)+2, 10000);
        e := e + iLoc3 * 1;
        i := Length(sData);
        n := n + 1;
      end;
    end;
    sData := sData + '!';
  end;
  Result := sData;
End;

Но, сколько я ни заглядывал в uppod, там всегда это значение hash было одним и тем же.

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

3

Re: Если вы на сайте встретили флеш-плеер Uppod и зашифрованные ссылки

А алгоритм расшифровки каждый раз выковыривать из флэша нужно?

4

Re: Если вы на сайте встретили флеш-плеер Uppod и зашифрованные ссылки

d1mas пишет:

А алгоритм расшифровки каждый раз выковыривать из флэша нужно?

Сам алгоритм уже несколько лет там один и тот же. Нужно только значения переменных client.codec_a и client.codec_b выковыривать. И да, к сожалению именно из swf файла.

Sony Bravia KDL-32CX523

5

Re: Если вы на сайте встретили флеш-плеер Uppod и зашифрованные ссылки

WendyH пишет:
d1mas пишет:

А алгоритм расшифровки каждый раз выковыривать из флэша нужно?

Сам алгоритм уже несколько лет там один и тот же. Нужно только значения переменных client.codec_a и client.codec_b выковыривать. И да, к сожалению именно из swf файла.

Не работает. Декомпилировал флэшку. Client.codec-ов нет. Хэш такой же. Но на выходе какую-то белиберду отдает.

Взгляд зацепился за вызов этой процедуры:

DecodeUppod_tr(sData, "r", "A");

а именно буквы "r" и "A". В самой процедуре при этом не срабатывает условие:

if (sData[Length(sData)-2]=ch1) AND (sData[3]=ch2)

Нашел на просторах сети какой-то uppod decoder на дотнет, но он у меня падает при запуске.

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

6

Re: Если вы на сайте встретили флеш-плеер Uppod и зашифрованные ссылки

Дайте сайт с таким плеером, я посмотрю. Как правило многие "портят" зашифрованные ссылки, вставляя туда одни и те же "левые" символы. И их нужно оттуда удалять перед расшифровкой. Или ещё что придумали. Кто как извращается. Seasonvar так одно время там вообще мутил с запаковкой и шифровкой зашифрованной ссылки, прежде чем её нужно было расшифровывать таким алгоритмом.

Sony Bravia KDL-32CX523

7

Re: Если вы на сайте встретили флеш-плеер Uppod и зашифрованные ссылки

WendyH пишет:

Дайте сайт с таким плеером, я посмотрю. Как правило многие "портят" зашифрованные ссылки, вставляя туда одни и те же "левые" символы. И их нужно оттуда удалять перед расшифровкой. Или ещё что придумали. Кто как извращается. Seasonvar так одно время там вообще мутил с запаковкой и шифровкой зашифрованной ссылки, прежде чем её нужно было расшифровывать таким алгоритмом.

Спасибо, это не к спеху. Я подкастами не увлекаюсь, так из спортивного интереса ковырялся.

8

Re: Если вы на сайте встретили флеш-плеер Uppod и зашифрованные ссылки

Здравствуйте WendyH наконец то нашел ваш алгоритм расшифровки uppod ссылок на этом сайте.

К сожалению мои знания C++ и PascalScript немного хромают (очень хромают  ;) ). Есть ли возможностъ выложить код на Python, Ruby, PHP или Javascript?

Заранее благодарен!

WendyH пишет:

Если плеере Uppod нет значений client.codec_a и client.codec_b

Если используется плеер Uppod, ссылки зашифрованы, но инициализация client.codec_a и client.codec_b нигде в исходниках плеера не встречается, то может быть ещё и второй вариант - кодирование с помощью hash функции.

DecodeUppodText('XRHzQZe3yMD8Bxn8oCYgDac3Qxl3fmFTOZuL2ZAvDj5Y5jQn5WElfxJzDmts205z50wWDju37aA3SxFgBWwT5mlg7R=z')

9

Re: Если вы на сайте встретили флеш-плеер Uppod и зашифрованные ссылки

vlasuk пишет:

Здравствуйте WendyH наконец то нашел ваш алгоритм расшифровки uppod ссылок на этом сайте.

К сожалению мои знания C++ и PascalScript немного хромают (очень хромают  ;) ). Есть ли возможность выложить код на Python, Ruby, PHP или Javascript?

Заранее благодарен!

А какие сложности с пониманием этого скриптового языка? Например C++? Там только некоторые незнакомые функции, типа ExtractWord или LeftCopy могут быть незнакомы или непонятны. Но можно по ним спросить. Да и догадаться можно, что они делают. Если сумеете перевести с PHP, что ж тут трудного то со скрипта любого перевести?
Вот ведь ленивые все какие.

Правда, пока проверял, выяснил, что выложенные функции DecodeUppodTextHash на PascalScript не работают. Обновил там этот скрипты. Сорян.

Вот вам:

Внимание! данные функции для расшифровки только если в плеере Uppod нет значений client.codec_a и client.codec_b

+ Python

import base64

def DecodeUppodTextHash( data ):
    hash = "0123456789WGXMHRUZID=NQVBLihbzaclmepsJxdftioYkngryTwuvihv7ec41D6GpBtXx3QJRiN5WwMf=ihngU08IuldVHosTmZz9kYL2bayE"
    data = DecodeUppod_tr(data, "r", "A")
    data = data.replace("\n", "")
    hash = hash.split('ih')

    if data.endswith('!'):
        data = data[:-1]
        taba = hash[3]
        tabb = hash[2]
    else:
        taba = hash[1]
        tabb = hash[0]

    i = 0;
    while i < len(taba):
        data = data.replace(tabb[i], "__"   )
        data = data.replace(taba[i], tabb[i])
        data = data.replace("__"   , taba[i])
        i += 1

    result = base64.b64decode(data)
    return result

def DecodeUppod_tr(data, ch1, ch2):
    if data[:-1].endswith(ch1) and data[2]==ch2:
        srev = data[::-1]  # revers string
        try:
            loc3 = int(float(srev[-2:]) / 2) # get number at end of string
        except ValueError:
            return data
        srev = srev[2:-3] # get string between ch1 and ch2
        if loc3 < len(srev):
            i = loc3
            while i < len(srev):
                srev = srev[:i] + srev[i+1:] # remove char at index i
                i += loc3
        data = srev + "!"
    return data

print(DecodeUppodTextHash('22AchBGDaxacG1x5WiJw692MrWRFGJ6dwLFd4wbRCwbRCG6Li35XF3UnpdQVkQm5ntu0c9BMrN'))

+ PHP

<?php error_reporting(2);

echo DecodeUppodTextHash('22AchBGDaxacG1x5WiJw692MrWRFGJ6dwLFd4wbRCwbRCG6Li35XF3UnpdQVkQm5ntu0c9BMrN');


function DecodeUppodTextHash( $data ) {
    $hash = "0123456789WGXMHRUZID=NQVBLihbzaclmepsJxdftioYkngryTwuvihv7ec41D6GpBtXx3QJRiN5WwMf=ihngU08IuldVHosTmZz9kYL2bayE";
    $data = DecodeUppod_tr($data, "r", "A");
    $data = str_replace("\n", "", $data);
    $harr = split('ih', $hash);

    if (substr($data, -1)=='!') {
        $data = substr($data, 0, -1);
        $a = str_split($harr[3]);
        $b = str_split($harr[2]);
    } else {
        $a = str_split($harr[1]);
        $b = str_split($harr[0]);
    }
    for ($i=0; $i < count($a); $i++) {
         $data = str_replace($b[$i], "__"  , $data);
         $data = str_replace($a[$i], $b[$i], $data);
         $data = str_replace("__"  , $a[$i], $data);
    }
    return utf8_decode(base64_decode($data));
}

function DecodeUppod_tr($data, $ch1, $ch2) {
    if ((substr($data, -2, 1)==$ch1) && ($data[2]==$ch2)) {
        $srev = strrev($data);
        $loc3 = intval(substr($srev, -2)) / 2;
        $srev = substr($srev, 2, -3); # get string between ch1 and ch2
        if ($loc3 < strlen($srev)) {
            $i = $loc3;
            while ($i < strlen($srev)) {
                $srev = substr($srev, 0, $i) . substr($srev, $i+1); # remove char at index i
                $i += $loc3;
            }
        }
        $data = $srev . "!";
    }
    return $data;
}

+ JavaScript

String.prototype.replaceAll = function(search, replacement) {
    var target = this;
    return target.replace(new RegExp(search, 'g'), replacement);
};

function DecodeUppodTextHash( data ) {
    hash = "0123456789WGXMHRUZID=NQVBLihbzaclmepsJxdftioYkngryTwuvihv7ec41D6GpBtXx3QJRiN5WwMf=ihngU08IuldVHosTmZz9kYL2bayE";
    data = DecodeUppod_tr(data, "r", "A");
    data = data.replace("\n", "");
    harr = hash.split('ih');

    if (data.substr(-1)=='!') {
        data = data.substr(0, data.length-1);
        a = harr[3];
        b = harr[2];
    } else {
        a = harr[1];
        b = harr[0];
    }
    for (i=0; i < a.length; i++) {
        data = data.replaceAll(b[i], "__");
        data = data.replaceAll(a[i], b[i]);
        data = data.replaceAll("__", a[i]);
    }
    return base64_decode(data);
}

function DecodeUppod_tr(data, ch1, ch2) {
    if ((data.substr(-2, 1)==ch1) && (data[2]==ch2)) {
        srev = data.split("").reverse().join("");
        loc3 = parseInt(srev.substr(-2)) / 2;
        srev = srev.substr(2, srev.length-5); // get string between ch1 and ch2
        if (loc3 < srev.length) {
            i = loc3;
            while (i < srev.length) {
                srev = srev.substr(0, i) + srev.substr(i+1); // remove char at index i
                i += loc3;
            }
        }
        data = srev + "!";
    }
    return data;
}

function base64_decode(data) {
  var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
  var o1, o2, o3, h1, h2, h3, h4, bits, i = 0, ac = 0, dec = '', tmp_arr = [];

  if (!data) return data;
  data += '';
  do { // unpack four hexets into three octets using index points in b64
    h1 = b64.indexOf(data.charAt(i++));
    h2 = b64.indexOf(data.charAt(i++));
    h3 = b64.indexOf(data.charAt(i++));
    h4 = b64.indexOf(data.charAt(i++));

    bits = h1 << 18 | h2 << 12 | h3 << 6 | h4;

    o1 = bits >> 16 & 0xff;
    o2 = bits >> 8 & 0xff;
    o3 = bits & 0xff;

    if      (h3 == 64) tmp_arr[ac++] = String.fromCharCode(o1);
    else if (h4 == 64) tmp_arr[ac++] = String.fromCharCode(o1, o2);
    else               tmp_arr[ac++] = String.fromCharCode(o1, o2, o3);

  } while (i < data.length);

  dec = tmp_arr.join('');

  return dec.replace(/\0+$/, '');
}

var l = DecodeUppodTextHash('22AchBGDaxacG1x5WiJw692MrWRFGJ6dwLFd4wbRCwbRCG6Li35XF3UnpdQVkQm5ntu0c9BMrN');

Ruby не знаю. Могу на Ассемблере вам ещё написать.

Заметьте, если client.codec_a и client.codec_b не используются, то как правило, зашифрованные ссылки выглядят немного по-другому и функция вызова будет не DecodeUppodText('XRHzQZe3yMD8Bxn8oCYgDac3Qxl3fmFTOZuL2ZAvDj5Y5jQn5WElfxJzDmts205z50wWDju37aA3SxFgBWwT5mlg7R=z'), а что-то типа DecodeUppodTextHash('22AchBGDaxacG1x5WiJw692MrWRFGJ6dwLFd4wbRCwbRCG6Li35XF3UnpdQVkQm5ntu0c9BMrN').

Эти функции расшифровки взяты прямиком из uppod плеера, которые были соответственно на ActiveScript. Просто были переписаны на другой скриптовый язык.

И напомню ещё раз. На некоторых сайтах зашифрованные ссылки, в добавок ко всему, ещё и дополнены левыми символами (порченные), которые даже использовав данные функции нормально расшифровать нельзя.

Например, на сайте videozal.net это символы tj3l, которые вставлены в зашифрованную ссылку в случайном месте. Как мне тут подсказал tomcrash13, на kinogo.co символы tQ3N. Обычно, они одни и те же в разных ссылках, но в разных позициях строки. Соответственно, перед расшифровкой данные куски нужно удалить.

Чтобы это вычислить, нужно быть или внимательным (сравнивая разные ссылки и найдя закономерность, как это у меня получилось в первый раз) или написать обратную функцию зашифровки и сделать следующее. Сниффером, например Charles, подслушать какая ссылка получается на выходе (по какому адресу обращается браузер с данной страницы), т.е. реальная. Потом эту ссылку зашифровать обратным алгоритмом и сверить с той, которая светится на сайте. И будет сразу видно, чем они отличаются. Но это да, это нужно сидеть и делать.

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

10

Re: Если вы на сайте встретили флеш-плеер Uppod и зашифрованные ссылки

Добрый вечер WendyH!

Не знаю с чего и начать. С перва огромное спасибо за детальный ответ!!!
Я с вами абсолютно согласен с ленью нужно бороться но к сожалению времени на всё не хватает.

На Ассемблере не надо но спасибо за предложение  :D


Ещё раз спасибо за проделаную работу и сорри за лень ;)

Владимир

11 (2016.01.27 21:35:21 отредактировано vlasuk)

Re: Если вы на сайте встретили флеш-плеер Uppod и зашифрованные ссылки

Код работает как швецарские часы, вы спасли мне вечер!!!

P.S.: И я в полне уверен не только мне.

12

Re: Если вы на сайте встретили флеш-плеер Uppod и зашифрованные ссылки

Здравствуйте помогите с дешифровкой kodik.cc .
Вот код

+ открыть спойлер

NLgtebQMHfvmHy0MY9i=HyajHuaMDVgiDVoMefgmYJF0HuYID9k8Hfake9nmDVi2HyiIHjp5v7B2YCwfYJW1DCXfvyG5Huh
demzfvjAMNJw1Y4R2D7akOC6QsLg5OlzMe8p2NuG1NJd2ZuvMZuG2s9n2sCG8sLWiZJtMYyidD4vMefn5Y4W2cJX2NJ12vjA6aSw1HVsiZygdHjemDfAMN968H8oXvCGIDygicCw0vfBXH9htsLAxHmG8vlw
=DugINmwjZmGjDuwtYJwtHfateynhDSGyNJ60emG8s4UieywwDlwINSXmvbEkHyo2sunlY952a8WMeCGQDLvMv8Z5Hui2Y9nXHyt8s7Rd

Вот что у меня получается

+ открыть спойлер

htNp://s2.m/dik.cc/content/streat/films/supernyn.ii.2015.d.webdl.72op/hls/720/index.m3uґ,http¶//s2.kodik.cc/content/streacЇfilms/supernyn.ii.2015.d.webdl.72op/hls/480/index.t3u8,hNtp://s2.kodik.cc/conNenN/sNream/filts/supernyn.ii.2015.d.webdl.72op/hls/360/index.cіu8,

Вот  client.codec_a  = "i9DBzZT640N5JmMRuoLcn3Isk=" и  client.codec_b = "lGbU8Y7xXtawWyvg2QHeVfpd1r" .Ну походу где то поменялся код.
Помогите если не трудно.

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

13

Re: Если вы на сайте встретили флеш-плеер Uppod и зашифрованные ссылки

ruslachka пишет:

Здравствуйте помогите с дешифровкой kodik.cc

Да вроде нормально он дешифрует строку:

NLgtebQMHfvmHy0MY9i=HyajHuaMDVgiDVoMefgmYJF0HuYID9k8Hfake9nmDVi2HyiIHjp5v7B2YCwfYJW1DCXfvyG5Huh
demzfvjAMNJw1Y4R2D7akOC6QsLg5OlzMe8p2NuG1NJd2ZuvMZuG2s9n2sCG8sLWiZJtMYyidD4vMefn5Y4W2cJX2NJ12vjA6aSw1HVsiZygdHjemDfAMN968H8oXvCGIDygicCw0vfBXH9htsLAxHmG8vlw
=DugINmwjZmGjDuwtYJwtHfateynhDSGyNJ60emG8s4UieywwDlwINSXmvbEkHyo2sunlY952a8WMeCGQDLvMv8Z5Hui2Y9nXHyt8s7Rd

в

http://s2.kodik.cc/content/stream/films/supernyn.ii.2015.d.webdl.72op/hls/720/index.m3u8,http://s2.kodik.cc/content/stream/films/supernyn.ii.2015.d.webdl.72op/hls/480/index.m3u8,http://s2.kodik.cc/content/stream/films/supernyn.ii.2015.d.webdl.72op/hls/360/index.m3u8,

Может из-за символов переноса строк в зашифрованном тексте? Для кучи в функции дешифровки должна быть команда удаления таких вещей.

Я уж сразу подумал, что просто зашифрованные ссылки с добавлением соли и эту добавленную соль вычислить нужно. Даже кинулся писать функцию шифрования, чтобы получить зашифрованную ссылку и сравнить с вашей.
Изначально, с помощью интуиции и проверок на доступность в ссылке файлов m3u8 восстановил изначальный вид, который бы должен быть.
Потом зашифровал её обратным алгоритмом (тупо таблицы замен местами меняются и base64 encode делается в начале).

+ Python
def EncodeUppodText( data ):
    tabb = "i9DBzZT640N5JmMRuoLcn3Isk="
    taba = "lGbU8Y7xXtawWyvg2QHeVfpd1r"

    encoded = base64.b64encode (bytes(data, "utf-8"))
    data = encoded.decode("utf-8")

    i = 0;
    while i < len(taba):
        data = data.replace(tabb[i], "__"   )
        data = data.replace(taba[i], tabb[i])
        data = data.replace("__"   , taba[i])
        i += 1

    return data

print(EncodeUppodText('http://s2.kodik.cc/content/stream/films/supernyn.ii.2015.d.webdl.72op/hls/720/index.m3u8,http://s2.kodik.cc/content/stream/films/supernyn.ii.2015.d.webdl.72op/hls/480/index.m3u8,http://s2.kodik.cc/content/stream/films/supernyn.ii.2015.d.webdl.72op/hls/360/index.m3u8,'))

Вот я удивился, когда у меня зашифрованная ссылка получилась один в один как вы текст предоставили.
Проверил, так он дешифруется без проблем, вроде. И не ломанная получается. Соли тут нет (добавленных левых символов в зашифрованный текст).

P.S. Да, это не "соль" конечно, в понимании криптографии - добавление незначащих левых символов. Ну да ладно, просто надо же как-то это обозвать. А то на многих сайтах это практикуется.

На чём функция дешифровки написана?

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

14 (2016.01.28 23:21:09 отредактировано ruslachka)

Re: Если вы на сайте встретили флеш-плеер Uppod и зашифрованные ссылки

Я то на php пробывал. У меня свой декодер.Не знаю почему у меня так получилось. Я думал client.codec_a и client.codec_b поменялись чуток,значит всё нормально. Декодер что то не то выдаёт значит.
А вот выше декодер на PHP он для этого подойдёт?Там я не наблюдаю что то  client.codec_a и client.codec_b.

15

Re: Если вы на сайте встретили флеш-плеер Uppod и зашифрованные ссылки

ruslachka, вот гипер сложный скрипт дешифровки я где-то использовал, для дешифровки большого текста по ссылке (есть такие сайты, где плейлисты большие зашифрованы). Там в параметрах "l" - это ссылка на зашифрованный текст, "a" и "b" - client.codec-и.

Вот проверка (скрипт uppoddecode2.php), где строка

$data = file_get_contents($l);

заменена на

$data = $l;

Поэтому в параметре "l" можно передавать зашифрованный текст.
Тест вашего шифра

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

16 (2016.01.31 20:38:34 отредактировано qlon33)

Re: Если вы на сайте встретили флеш-плеер Uppod и зашифрованные ссылки

расшифровать ссылку получилось, но вот только она подается в таком формате:

http://wx14.poiuytrew.pw/s/b12224df772dbcf411ce90c647d07f61/HD_Sent_01/Bridge.of.Spies.2015.BDRip.720p_[720,480,360].mp4

Видимо сервер ее привязывает к IP, тк этот фрагмент "b12224df772dbcf411ce90c647d07f61" для каждого IP отличается. Из этой ссылки можно вытащить прямую?

17

Re: Если вы на сайте встретили флеш-плеер Uppod и зашифрованные ссылки

qlon33 пишет:

расшифровать ссылку получилось, но вот только она подается в таком формате:

http://wx14.poiuytrew.pw/s/b12224df772dbcf411ce90c647d07f61/HD_Sent_01/Bridge.of.Spies.2015.BDRip.720p_[720,480,360].mp4

Видимо сервер ее привязывает к IP, тк этот фрагмент "b12224df772dbcf411ce90c647d07f61" для каждого IP отличается. Из этой ссылки можно вытащить прямую?

Вот этот вот изменяемый участок - это обычно говорит о её "временности". Т.е. у неё ограниченное время жизни, а потом она "протухает". Даже вы, получив ссылку и сумев скачать по ней файл, завтра уже не сможете по ней что-то получить.

Вам нужно именно постоянная ссылка? Вряд ли это получится. Ибо они с сервера специально так отдают ссылки, чтобы не было постоянных.
Привязка к IP может быть, но редко такое встречается.

Обратите внимание, что у вас в ссылке есть квадратные скобки - значит это шаблон. И ссылок тут на самом деле три. Плеер uppod понимает такие шаблоны.
У вас три файла с разным качеством. Поэтому этот шаблон нужно превратить в одну из настоящих ссылок, где файл может быть:
Bridge.of.Spies.2015.BDRip.720p_720.mp4
Bridge.of.Spies.2015.BDRip.720p_480.mp4
Bridge.of.Spies.2015.BDRip.720p_360.mp4

Короче, всё что в квадратных скобках через запятую - это варианты файлов. А по ссылке-шаблону вы, естественно, ничего не скачаете. Её нужно превращать в одну из.

Sony Bravia KDL-32CX523

18 (2016.01.31 20:58:40 отредактировано qlon33)

Re: Если вы на сайте встретили флеш-плеер Uppod и зашифрованные ссылки

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

19

Re: Если вы на сайте встретили флеш-плеер Uppod и зашифрованные ссылки

qlon33 пишет:

Скорее всего его можно как-то расшифровать

А я думаю, что его расшифровать невозможно.
Ибо создаётся ссылка на сервере, где создание хеша может быть любым способом, с любыми дополнительными данными (типа ip запрашивающего).

Функция получения такой ссылки, как я понял, на стороннем сервере? Если есть привязка к IP, то тут ничего не поделаешь. Нужно запросы слать значит с клиента.
Это сделать невозможно (запрос получению ссылки сделать от самого клиента)?

А что за ресурс, если не секрет (у которого такие ссылки)?

Sony Bravia KDL-32CX523

20 (2016.01.31 21:15:17 отредактировано qlon33)

Re: Если вы на сайте встретили флеш-плеер Uppod и зашифрованные ссылки

WendyH пишет:

А что за ресурс, если не секрет (у которого такие ссылки)?

filmix :)

21 (2016.01.31 21:31:22 отредактировано WendyH)

Re: Если вы на сайте встретили флеш-плеер Uppod и зашифрованные ссылки

Да, к IP привязана, однозначно. Перепроверил.

P.S.: В общем, ничего тут не поделаешь. Значит нужно делать запрос и получать зашифрованную ссылку там, где мы её собираемся смотреть (скачивать).

Sony Bravia KDL-32CX523

22 (2016.01.31 21:33:44 отредактировано qlon33)

Re: Если вы на сайте встретили флеш-плеер Uppod и зашифрованные ссылки

То есть нужен ретранслятор, или же отправлять IP адрес клиента и отдавать ему зашифрованную ссылку.

23

Re: Если вы на сайте встретили флеш-плеер Uppod и зашифрованные ссылки

qlon33 пишет:

То есть нужен ретранслятор, или же отправлять IP адрес клиента и отдавать ему зашифрованную ссылку.

Просто клиент должен получать первоначальную зашифрованную ссылку (страницу фильма).
А отдавать, например, серверу или там стороннему сервису для расшифровки (получения нормальной ссылки).

Просто я не знаю что вы именно делаете. Поэтому трудно конкретно говорить.

Если это свой сайт с возможностью скачать фильм по указанной ссылке с онлайн кинотеатра, то тут облом. Нужно делать тогда типа, может быть проги на флеш, которая будет исполнятся у клиента в браузере, брать страницу с кинотеатра, отдавать её для расшифровки на свой сервер...

Если вы делаете просто программу или скрипт, который будет обращатся к вашему сервису для получения реальной ссылки, то тоже, значит нужно запрос делать на страницу фильма из программы (скрипта), а расшифровывать уже запросом к своему серверу..

Короче не знаю, я тут просто фантазирую уже.

Sony Bravia KDL-32CX523

24

Re: Если вы на сайте встретили флеш-плеер Uppod и зашифрованные ссылки

Есть задумка транслировать фильмы на своем сайте через свой плеер, которому нужно скармливать ссылки на видео. Вот и я подумал, почему бы не отправить filmix'у IP-адрес каждого индивидуального посетителя, для получения зашифрованной участка, используемого в ссылке.

Это лишь концепт, и я пока не знаю как это реализовать.

25

Re: Если вы на сайте встретили флеш-плеер Uppod и зашифрованные ссылки

qlon33 пишет:

Вот и я подумал, почему бы не отправить filmix'у IP-адрес каждого индивидуального посетителя, для получения зашифрованной участка, используемого в ссылке.

IP "отправить" невозможно. Его узнаёт сервер по текущему соединению.
Можно, если вы с админами фильмикса договоритесь... что очень ооочень маловероятно.

Sony Bravia KDL-32CX523

26

Re: Если вы на сайте встретили флеш-плеер Uppod и зашифрованные ссылки

WendyH пишет:

Его узнаёт сервер по текущему соединению.

Действительно, я об этом как-то не подумал.

27

Re: Если вы на сайте встретили флеш-плеер Uppod и зашифрованные ссылки

Люди добрые помогите. Пытаюсь расшифровать ссылку выше описанными способами с сайта allserial.tv и ничего не выходит, мне кажется, что там не вся ссылка кодируется а только хэш, ну в общем мне дается вот это
2iob3gRLvaozG54ZkxsB05wbvaG4GCmV2iA%2FUxyb2xJBPfu8Uf482fyb9Iu8PwJy0aWLkdwe2dMhvIt195hh3aDJyjuhyjUcU1yhkd94kQGZtjyHy5tbtaT1tjGhkdTbyQYA
а получиться должно что-то вроде
http://duvideo.net/get.php?action=playl … 49f9132614
пробовал оба выше описаннных способа, но выходи какая0то фигня, явно они что-то нахимичили с шифрованием, думал какие-то левые символы напихали, но мой глаз их не выявил, подсобите пожалуйста кто нить

28

Re: Если вы на сайте встретили флеш-плеер Uppod и зашифрованные ссылки

Anixiy,
Вот тут я писал, что часто в зашифрованные ссылки добавляют мусор.

WendyH пишет:

Например, на сайте videozal.net это символы tj3l

И там же написано было - что ничего не остаётся, как сравнивать кучу зашифрованных ссылок и увидеть в них одни и те же левые символы, но находящиеся в разных местах (при достаточно большом количестве сравнений становиться более менее ясно). Либо написать обратную функцию шифрования, если мы знаем как выглядит расшифрованная ссылка. Просто её зашифровываем и легко потом находим левые символы при сравнении с зашифрованной на сайте.

У allserials это символы %2FUxy
Ибо обычно их четыре символа (связано с особенностью шифрования и работы Base64). И спецсимволов не должно быть (опять же из-за Base64 стандарта, который тут используется). Так что в вашем случае эти левые символы прям светятся и кричат (из-за кода %2F) и их легко было увидеть.

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

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

29 (2016.03.03 16:05:21 отредактировано Anixiy)

Re: Если вы на сайте встретили флеш-плеер Uppod и зашифрованные ссылки

Спасибо, удалил и пропустил через ваши функции
вот это
2iob3gRLvaozG54ZkxsB05wbvaG4GCmV2iAb2xJBPfu8Uf482fyb9Iu8PwJy0aWLkdwe2dMhvIt195hh3aDJyjuhyjUcU1yhkd94kQGZtjyHy5tbtaT1tjGhkdTbyQYA

var
  hash, tab_a, tab_b: string; i: Integer;
  sData:string;
  List:TStringList;
begin
  hash := '0123456789WGXMHRUZID=NQVBLihbzaclmepsJxdftioYkngryTwuvihv7ec41D6GpBtXx3QJRiN5WwMf=ihngU08IuldVHosTmZz9kYL2bayE';
  sData:=Base64EncodeString(StringReplace(Memo1.Text, '#13#10', '',[rfReplaceAll, rfIgnoreCase]));
  sData:= DecodeUppod_tr(sData, 'r', 'A'); //engine/classes/flashplayer/uppod-tc.swf
  hash :=StringReplace(hash, 'ih', #13,[rfReplaceAll, rfIgnoreCase]);
   List:=TStringList.Create;
  StrBreakApart(hash,#13,List);
  if Copy(sData, Length(sData),Length(sData)) = '!' then begin
    sData := Copy(sData,0 ,Length(sData)-1);
    tab_a := List.Strings[3];
    tab_b := List.Strings[2];
  end else begin
    tab_a := List.Strings[1];
    tab_b := List.Strings[0];
  end;
   List.Clear;
  sData := StringReplace(sData, #13, '',[rfReplaceAll, rfIgnoreCase]);
  for i := 1 to Length(tab_a) do begin
    sData := StringReplace(sData, tab_b[i], '___',[rfReplaceAll, rfIgnoreCase]);
    sData := StringReplace(sData, tab_a[i], tab_b[i],[rfReplaceAll, rfIgnoreCase]);
    sData := StringReplace(sData, '___',tab_a[i],[rfReplaceAll, rfIgnoreCase]);
  end;
  Memo2.Text := UTF8Decode(Base64DecodeString(sData));

но из этого все равно получаю �0�5���^�Sn�/��� ����#��� я понимаю, что где-то с кодировками туплю, но не совсем вижу где.

30

Re: Если вы на сайте встретили флеш-плеер Uppod и зашифрованные ссылки

Anixiy пишет:

Спасибо, удалил и пропустил через ваши функции
вот это
2iob3gRLvaozG54ZkxsB05wbvaG4GCmV2iAb2xJBPfu8Uf482fyb9Iu8PwJy0aWLkdwe2dMhvIt195hh3aDJyjuhyjUcU1yhkd94kQGZtjyHy5tbtaT1tjGhkdTbyQYA
но из этого все равно получаю �0�5���^�Sn�/��� ����#��� я понимаю, что где-то с кодировками туплю, но не совсем вижу где.

Я в паскале не силён, его узнал только через PascalScript в HMS, поэтому ни в чем не уверен. Но нужно ли указывать везде при замене в строках rfIgnoreCase не уверен.
Хотя он в данном случае на результат не влияет.

А не работает ваша функция из-за этой строки:

sData:=Base64EncodeString(StringReplace(Memo1.Text, '#13#10', '',[rfReplaceAll, rfIgnoreCase]));

Что за Base64EncodeString? Нафига вы кодируете уже закодированную строку в Base64? Не надо.

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