Функция не определена при запуске usercript / из консоли - PullRequest
0 голосов
/ 24 января 2019

Я пытаюсь получить ссылку с URL http://kissasian.sh/Drama/My-Mister/Episode-1?id=36170 (конкретная страница) при запуске сценария пользователя из http://kissasian.sh/Drama/My-Mister (общая страница). Однако веб-сайт шифрует ссылку, к которой я пытаюсь получить доступ.

Выполнение следующего кода

var url = "http://kissasian.sh/Drama/My-Mister/Episode-1?id=36170";
var msg = $.ajax({type: "GET", url: url, async: false}).responseText;
console.log(msg);

предоставляет зашифрованную ссылку на видео в responseText в функции $kissenc.decrypt().

При запуске этой функции из консоли на определенной странице возвращается расшифрованная ссылка; однако эта функция не определена на общей странице, с которой запускается мой скрипт, как показано в приведенном ниже коде.

var url = "http://kissasian.sh/Drama/My-Mister/Episode-1?id=36170";
var decrypted = "";

var msg = "ui0uI3/FNJEDeMXFKFzBVr30Yc6w34jKMp2NWjnnv355ptM/1h5bostMEAZVqsyi";

$.support.cors = true;
$.ajax({type: "GET", url:url, async: false, crossDomain: true}).done(function(){decrypted = $kissenc.decrypt(msg)});

alert(decrypted);

Я не знаком с CORS и не уверен, что это может вызвать проблемы при попытке запустить функцию.

Аналогично, я не могу запустить функцию $kissenc.decrypt(), включив сценарии из домена kissasian.sh на общую или специальную страницу:

var rootUrl = "http://kissasian.sh/Scripts/";
$.ajaxSetup({async:false});

var jsS = [
    "common.js",
    "aes.js",
    "sha256.min.js",
    "subo.min.js?v=3.19"
];
console.log('Loading scripts ...');
for (var i=0; i < jsS.length; i++){
    console.log(jsS[i]);
   $.getScript(rootUrl + jsS[i]);
}

var msg = "ui0uI3/FNJEDeMXFKFzBVr30Yc6w34jKMp2NWjnnv355ptM/1h5bostMEAZVqsyi";
var decrypted = $kissenc.decrypt(msg);
alert(decrypted);

Оба эти метода основаны на успешном выполнении функции дешифрования. Приведенный ниже код выполняется на более конкретной странице без использования $kissenc.decrypt():

 $.ajax({
        url: "http://kissasian.sh/Drama/My-Mister/Episode-1?id=36170", 
        success: function(result) {
            var msg = document.getElementById('containerRoot').outerHTML;
            console.log(msg);
        },
        crossDomain: true,
        async:   false, 
        script:  true
    });

Однако, когда я пытаюсь найти ссылку, извлекая элементы из общей страницы, код снова не работает должным образом. Я ожидаю, что document.getElementById предоставит правильный containerRoot с определенной страницы, но вместо этого он предоставит тот для общей страницы, с которой он выполняется.

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

1 Ответ

0 голосов
/ 25 января 2019

Это немного сложно. Объект $kissenc определяется внутри скрипта subo.min, который запутывается и , зависит от четырех других уже загружаемых скриптов, , включая jquery.allofthelights-min.js. Поместите эти сценарии в массив, как вы делаете, и eval их.

После этой точки, window.$kissenc становится определенным, поэтому с ним можно взаимодействовать. Но есть и другая проблема: результаты его метода decrypt зависят не только от переданного параметра , но и от предыдущих вызовов свойств в $kissenc. $kissenc также зависит от определенного встроенного тега сценария в верхней части страницы эпизода, который был выполнен до запуска сценария subo, иначе decrypt вернет пустую строку. Итак, eval этот первый встроенный тег <script> перед загрузкой внешних скриптов.

Затем на странице есть куча других встроенных тегов встроенных скриптов. Сначала вам нужно eval каждый из них, пока вы не дойдете до того, который вызывает decrypt - затем вы можете сами decrypt позвонить и получить результат, который вы ищете.

var url = "http://kissasian.sh/Drama/My-Mister/Episode-1?id=36170";
var msg = "ui0uI3/FNJEDeMXFKFzBVr30Yc6w34jKMp2NWjnnv355ptM/1h5bostMEAZVqsyi";
var rootUrl = "http://kissasian.sh/Scripts/";
var jsS = [
  "common.js?v=3",
  'jquery.allofthelights-min.js?v=3',  // this was missing from your original code
  "aes.js",
  "sha256.min.js",
  "subo.min.js?v=3.19"
];
console.log('Loading scripts ...');
(async () => {
  const resp = await fetch(url);
  const text = await resp.text();
  const doc = new DOMParser().parseFromString(text, 'text/html');
  // Get all inline script tags
  const [first, ...inlineScripts] = doc.querySelectorAll('script:not([src])');
  // we'll eval the inlineScripts later, after the subo script runs (defines $kissenc)
  // but the first must be evaled before subo runs
  eval(first.textContent);

  // load the 5 external scripts
  for (let i = 0; i < jsS.length; i++) {
    const resp = await fetch(rootUrl + jsS[i]);
    const text = await resp.text();
    eval(text);
  }

  // window.$kissenc is now defined,
  // now we can iterate through the inlineScripts that look obfuscated and eval them:
  let textToDecode;
  for (const { textContent } of inlineScripts) {
    if (textContent.includes('decrypt')) {
      // we've gotten to the script that decrypts;
      // don't run it, instead call decrypt ourselves,
      // and break out of the loop:
      const match = textContent.match(/decrypt\('([^']+).+/);
      textToDecode = match[1];
      break;
    } else if (textContent.includes('\\x') || /^\s+_/.test(textContent)) {
      eval(textContent);
    }
  }
  console.log('Decrpyting ', textToDecode);
  var decrypted = $kissenc.decrypt(textToDecode);
  console.log(decrypted);
})();
...