Página 1 de 2

Ayuda en canal con código javascript

Publicado: 14 Ene 2016, 00:01
por Cmos
Resulta que llevo unos días planteando un canal para la web descargasmix la cual creo que está muy bien surtida en contenido. Mi problema viene con que, una vez entras en una película o serie en concreto, los enlaces, ya sea de descarga u online (en los torrents no ocurre, son directos), vienen encapsulados dentro de un código javascript con una llamada a Jquery, por ejemplo:

Código: Seleccionar todo

onclick=jQuery('#mirror2_ul>p>a').each(function(){this.onclick()});show_mirror('mirror2_ul')
He mirado y remirado para ver si la pagina utiliza alguna API o entrar por AJAX, pero no he encontrado nada. El script que utiliza más o menos lo he localizado, pero con mi nivel de javascript la mitad ni lo entiendo xD No sé si habrá alguna manera de solucionarlo, porque creo que sería un canal interesante, y aunque se podría publicar únicamente para utilizarlo por torrent, hay contenido que solo está en descarga u online, además de que no estaría del todo aprovechado...

Algún crack en javascript en la sala? :mrgreen:

Re: Ayuda en canal con código javascript

Publicado: 14 Ene 2016, 08:07
por SeiTaN
Sin ser un master en javascript, ¿puedes poner la pagina y el codigo al que haces referencia? A ver si te puedo echar un cable.

Saludos.

Re: Ayuda en canal con código javascript

Publicado: 14 Ene 2016, 12:10
por Cmos
SeiTaN escribió:Sin ser un master en javascript, ¿puedes poner la pagina y el codigo al que haces referencia? A ver si te puedo echar un cable.

Saludos.
La página es descargasmix.net. Y este el código del script (en la página viene ofuscado):

Código: Seleccionar todo

var _0x1e03 = ["", "length", "charCodeAt", "substr", "hostname", "location", "descargasmix", "www.descargasmix", "fromCharCode"];
function dm(h) {
  var copies = _0x1e03[0];
  i = 0;
  for (;i < h[_0x1e03[1]];i++) {
    copies = copies + String[_0x1e03[8]](h[_0x1e03[2]](i) ^ 123 * ~~(window[_0x1e03[5]][_0x1e03[4]][_0x1e03[3]](0, 12) == _0x1e03[6] || window[_0x1e03[5]][_0x1e03[4]][_0x1e03[3]](0, 16) == _0x1e03[7]));
  }
  return copies;
}
var _0x1808 = ["ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", "", "replace", "charAt", "indexOf", "_keyStr", "fromCharCode", "length", "charCodeAt"];
var c = {
  _keyStr : _0x1808[0],
  a : function(m) {
    var a = _0x1808[1];
    var r20;
    var restoreScript;
    var bits;
    var enc1;
    var enc2;
    var _0x5fffx9;
    var o3;
    var cursor = 0;
    m = m[_0x1808[2]](/[^A-Za-z0-9\+\/\=]/g, _0x1808[1]);
    for (;cursor < m[_0x1808[7]];) {
      enc1 = c[_0x1808[5]][_0x1808[4]](m[_0x1808[3]](cursor++));
      enc2 = c[_0x1808[5]][_0x1808[4]](m[_0x1808[3]](cursor++));
      _0x5fffx9 = c[_0x1808[5]][_0x1808[4]](m[_0x1808[3]](cursor++));
      o3 = c[_0x1808[5]][_0x1808[4]](m[_0x1808[3]](cursor++));
      r20 = enc1 << 2 | enc2 >> 4;
      restoreScript = (enc2 & 15) << 4 | _0x5fffx9 >> 2;
      bits = (_0x5fffx9 & 3) << 6 | o3;
      a = a + String[_0x1808[6]](r20);
      if (_0x5fffx9 != 64) {
        a = a + String[_0x1808[6]](restoreScript);
      }
      if (o3 != 64) {
        a = a + String[_0x1808[6]](bits);
      }
    }
    a = c._d(a);
    return a;
  },

  _d : function(data) {
    var utftext = _0x1808[1];
    var i = 0;
    var c = c1 = c2 = 0;
    for (;i < data[_0x1808[7]];) {
      c = data[_0x1808[8]](i);
      if (c < 128) {
        utftext += String[_0x1808[6]](c);
        i++;
      } else {
        if (c > 191 && c < 224) {
          c2 = data[_0x1808[8]](i + 1);
          utftext += String[_0x1808[6]]((c & 31) << 6 | c2 & 63);
          i += 2;
        } else {
          c2 = data[_0x1808[8]](i + 1);
          c3 = data[_0x1808[8]](i + 2);
          utftext += String[_0x1808[6]]((c & 15) << 12 | (c2 & 63) << 6 | c3 & 63);
          i += 3;
        }
      }
    }
    return utftext;
  }
};
Aquí un ejemplo de llamada al script para sacar el enlace:

Código: Seleccionar todo

dm(c.a('Ew8PCwhBVFQOCB4JCBgXFA4fVRgUFlRKCBQLSwseDx8ZAhY='));
Gracias por tomarte la molestia SeiTaN ;)

Re: Ayuda en canal con código javascript

Publicado: 14 Ene 2016, 12:52
por SeiTaN
Me has dado coba, no dijiste nada del ofuscado jajaja, es más el tiempo de "traducirlo" que otra cosa, luego te lo miro con más calma xD

Re: Ayuda en canal con código javascript

Publicado: 14 Ene 2016, 14:46
por Cmos
SeiTaN escribió:Me has dado coba, no dijiste nada del ofuscado jajaja, es más el tiempo de "traducirlo" que otra cosa, luego te lo miro con más calma xD
:lol: Se me pasó mencionarlo xD. Sin problemas, échale un ojo cuando puedas, no hay prisa por supuesto, y si es mucho lío pues nada. En todo caso, muchas gracias de nuevo ;)

Re: Ayuda en canal con código javascript

Publicado: 14 Ene 2016, 20:26
por SeiTaN
https://gist.github.com/SeiTaN80/faefb72d028d23d9502c

Ya está todo, tan solo un error puñetero, "numeraco" se sale del limite para int y no se puede hacer el char(int)

Código: Seleccionar todo

def dm(h):
    copies = ""
    i = 0

    while i < len(h):
        numeraco = ord(h[i]) ** 123 * ~~ True
        print (numeraco)
        copies += chr(numeraco)
        i += 1

    return copies
Un saludo.

Re: Ayuda en canal con código javascript

Publicado: 14 Ene 2016, 23:56
por Cmos
Pero qué puto crack :shock: :lol:

Yo vi tu mensaje hace unas horas y me lié con la conversión a python a ver si la sacaba, llegué hasta aquí justo cuando he visto tu solución:

Código: Seleccionar todo

def dm(h):
    h = a (h)
    copies = ""
    i = 0
    while (i < len(h)):
        str = ord(h[i]) ^ 123 * math.floor(True)
        copies = copies + unichr(int(str))
        i += 1
    return copies

def a(m):
    keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
    a = ""
    cursor = 0
    m = re.sub(r"/[^A-Za-z0-9+/=]", "", m)
    while cursor < len(m):
        cursor += 1
        enc1 = keyStr.index(m[cursor])
        enc2 = keyStr.find(m[cursor])
        cadena = keyStr.find(m[cursor])
        o3 = keyStr.find(m[cursor])
        r20 = enc1 << 2 | enc2 >> 4
        restoreScript = (enc2 & 15) << 4 | cadena >> 2
        bits = (cadena & 3) << 6 | o3
        a = a + unichr(r20)
        if (cadena != 64):
            a = a + unichr(restoreScript)
        if (o3 != 64):
            a = a + unichr(bits)
    a = d(a)
    return a

def d(data):
    utftext = ""
    i = 0
    c = c1 = c2 = 0
    while i < len(data):
        c = data[i]
        if (ord(c) < 128):
            utftext += unichr(ord(c))
            i += 1
        else:
            if (ord(c) > 191) & (ord(c) < 224):
                c2 = data[i + 1]
                utftext += unichr((ord(c) & 31) << 6 | ord(c2) & 63)
                i += 2
            else:
                c2 = data[i + 1]
                c3 = data[i + 2]
                utftext += unichr((ord(c) & 15) << 12 | (ord(c2) & 63) << 6 | (ord(c3) & 63))
                i += 3
    return utftext
Comparando con el tuyo, veo que mi fallo estaba en los incrementadores de la variable cursor, que se me fue la olla y solo puse uno :mrgreen: Y por lo que veo unichr hace lo mismo a simple vista que chr, no? Y también que no es necesario el math.floor que hago con el númeraco, creía que python no admitía la doble negación :?
Pues eso, que ha quedado la mar de chulo xD Muchísimas gracias por todo el curro, sin ti desde luego hubiera sido imposible sacarlo. Ahora estos días me pondré para perfilar y terminar el canal y ponerte una estatua :D

Re: Ayuda en canal con código javascript

Publicado: 14 Ene 2016, 23:58
por SeiTaN
subnormal que es uno, no está mal es que he quitado lo que no tenía que quitar.

^ es un Bitwise Operator, no la potencia :oops:

Ya está subido bien :)

Re: Ayuda en canal con código javascript

Publicado: 15 Ene 2016, 11:32
por robalo
Buenos días, són las 11 menos cuarto y aún no soy persona, estoy con el primer café :)

En primer lugar buen trabajo, es un buen ejercicio el que habéis hecho del cual aprendemos todos. Pero... :)

Sólo se necesita saber lo que se cuece en la función dm() (str-ecode64 ^ 123) con lo que esl scrape se hace más fácil. Depués solo hay que usar el módulo base64 de python.

Ejemplo con lo hecho hasta ahora:

Código: Seleccionar todo

def dm(h):
    import base64
    h = base64.decodestring(h)

    copies = ""
    i = 0
    while i < len(h):
        copies += chr(ord(h[i]) ^ 123 * ~~ True)
        i += 1

    return copies
Con sólo eso sería suficiente

Re: Ayuda en canal con código javascript

Publicado: 15 Ene 2016, 12:10
por SeiTaN
robalo

Código: Seleccionar todo

def dm(h):
    import base64
    h = base64.decodestring(h)

    copies = ""
    i = 0
    while i < len(h):
        copies += chr(ord(h[i]) ^ 123 * ~~ True)
        i += 1

    return copies
SeiTaN

Código: Seleccionar todo

def dm(h):
    copies = ""
    i = 0

    while i < len(h):
        copies += chr(ord(h[i]) ^ 123 * ~~ True)
        i += 1

    return copies
No haría falta, con lo último que puse en el gist ya funciona, ¿o te refieres a algo con las 3 funciones?

Saludos.