Página 5 de 6

Re: Obtener la URL de un vídeo embebido

Publicado: 16 Dic 2016, 23:13
por tormund
Han vuelto a hacer un cambio en Powvideo pero esta vez no veo cuál ha sido el cambio, la URL que captura Firebug y la que obtendo tras el unpack no se parecen en nada. No es como la última vez que sólo había que quitar un carácter. ¿Sabéis en qué ha cambiado? La función packed sigue siendo la misma, ¿tendrá algo que ver con la función jjdecode? Actualmente no la aplico, por eso me hace pensar que ahí esté el cambio.

Saludos.

Re: Obtener la URL de un vídeo embebido

Publicado: 16 Dic 2016, 23:40
por robalo
Te he puesto en la pregunta del otro hilo el JS sin ofuscar para que lo entiendas mejor.
Ahora mismo lo que hecen es invertir el hash y eliminar el segundo caracter. Puedes hacerlo así de simple o intentar reproducir el script por si le dan por continuar con el método y eliminar caratares aleatorios.

Tanto como powvideo como streamplay están usando el mismo método; jjencode para tratar las urls y aaencode para las urls. El script que se obtiene con el jjdecode es el mismo en los dos servidores.

Re: Obtener la URL de un vídeo embebido

Publicado: 17 Dic 2016, 12:18
por tormund
La función jjdecode la tienes en java o javascript? Anoche intenté entenderla en python pero mis conocimientos sobre este lenguaje son muy limitados.

Saludos.

Re: Obtener la URL de un vídeo embebido

Publicado: 17 Dic 2016, 14:34
por robalo
Tengo dos versiones, una con 'ScriptEngine' y otra como la de python pero algo mejor, los '\xnn' lo representa tal y como son, en pyrho los representa como 'xnn'.
versión ScriptEngine

Código: Seleccionar todo

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class jjdecode1 {

	String jj_decode;

	jjdecode1(String jj_encode) {

		ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");

		jj_encode = jj_encode.replaceAll("\\w\\.\\$\\((\\w\\.\\$\\()", "$1");
		jj_encode = jj_encode.replace(")();", ";");
		try {
			engine.eval("var res = " + jj_encode);
		} catch (ScriptException e) {
			e.printStackTrace();
		}

		jj_decode = (String) engine.get("res");

	}
}
Versión como la python

Código: Seleccionar todo

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class jjdecode {

	String jj_decode;

	jjdecode(String jj_encode) {

		String j = "";
		Matcher matches = Pattern.compile("^([^=]+)=").matcher(jj_encode);
		while (matches.find()) {
			j = matches.group(1);
		}

		jj_encode = jj_encode.replace(j + ".", "j.").replace("\\\\", "\\") + "+\"\"";
		jj_encode = jj_encode.replaceAll("^.*?\"\\\\\"\"\\+(.*?)\\+\"\\\\\"\".*?$", "$1");

		jj_encode = jj_encode.replace("(![]+'')[j._$_]", "\"l\"");
		jj_encode = jj_encode.replace("j._$+", "\"o\"+");
		jj_encode = jj_encode.replace("j.__+", "\"t\"+");
		jj_encode = jj_encode.replace("j._+", "\"u\"+");

		matches = Pattern.compile("(j\\.[^\\+]+\\+)").matcher(jj_encode);
		while (matches.find()) {
			String match = matches.group(1);
			jj_encode = jj_encode.replace(match,match.replace("_", "0").replace("$", "1"));
		}

		matches = Pattern.compile("j\\.(\\d{4})").matcher(jj_encode);
		while (matches.find()) {
			String match = matches.group(1); 
			jj_encode = jj_encode.replace("j." + match + "+","\"" + Integer.toHexString(Integer.parseInt(match, 2)) + "\"+");
		}

		matches = Pattern.compile("\\\"\\+j\\.(001)\\+j\\.(\\d{3})\\+j\\.(\\d{3})\\+").matcher(jj_encode);
		while (matches.find()) {
			String m1 = matches.group(1); 
			String m2 = matches.group(2); 
			String m3 = matches.group(3); 
			jj_encode = jj_encode.replace("\\\"+j." + m1 + "+j." + m2 + "+j." + m3 + "+",Character.toString((char) Integer.parseInt(m1+m2+m3, 2)) + "\"+");
		}

		matches = Pattern.compile("\\\"\\+j\\.(\\d{3})\\+j\\.(\\d{3})\\+").matcher(jj_encode);
		while (matches.find()) {
			String m1 = matches.group(1); 
			String m2 = matches.group(2); 
			jj_encode = jj_encode.replace("\\\"+j." + m1 + "+j." + m2 + "+",Character.toString((char) Integer.parseInt(m1+m2, 2)) + "\"+");
		}

		matches = Pattern.compile("j\\.(\\d{3})").matcher(jj_encode);
		while (matches.find()) {
			String m1 = matches.group(1); 
			jj_encode = jj_encode.replace("j." + m1,"\"" + Integer.parseInt(m1, 2) + "\"");
		}

		jj_encode = jj_encode.replaceAll("\"\\+\"", "").replace("\\\\\"", "\"").replace("\\\\", "\\");
		jj_encode = jj_encode.replaceAll("^\"(.*?)\"$", "$1");

		jj_decode = jj_encode;

	}
}

Re: Obtener la URL de un vídeo embebido

Publicado: 17 Dic 2016, 19:13
por tormund
He podido integrar la función que me pasas con éxito y tras una prueba esta es la salida que obtengo:

Código: Seleccionar todo

var _0xa425=["\x73\x69\x7A\x65","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x66\x69\x6C\x65","\x72\x65\x76\x65\x72\x73\x65","","\x73\x70\x6C\x69\x74","\x73\x70\x6C\x69\x63\x65","\x6A\x6F\x69\x6E","\x72\x65\x70\x6C\x61\x63\x65","\x6D\x61\x70","\x6C\x65\x6E\x67\x74\x68"];Array[_0xa425[1]][_0xa425[0]]= function(){var _0xf328x1=this;_0xf328x1= $[_0xa425[9]](_0xf328x1,function(_0xf328x2){_0xf328x2[_0xa425[2]]= _0xf328x2[_0xa425[2]][_0xa425[8]](/[0-9a-z]{40,}/i,function(_0xf328x3){var _0xf328x4=_0xf328x3[_0xa425[5]](_0xa425[4])[_0xa425[3]]();_0xf328x4[_0xa425[6]](1,1);return _0xf328x4[_0xa425[7]](_0xa425[4])});return _0xf328x2});return _0xf328x1[_0xa425[10]]}
Para mi al menos es completamente ilegible, ¿como interpretas esto?

Saludos.

Re: Obtener la URL de un vídeo embebido

Publicado: 18 Dic 2016, 21:56
por robalo
Ahí cada maestrillo tiene su librillo :) yo por ejemplo lo veo como code sin ofuscar (como code escrito por una tia o tio raro) e intento leerlo.

Comolll!!!??? Pues sí :lol: :lol: :lol:
El que enrede con JS en el desarrollo o mantenimiento de aplicaciones web debería saber interpretarlo, lo hago yo que soy un pardillo así que el que se dedique a eso ni te cuento la de recursos de su invento que debe de tener :lol:

vamos al comolll!?

Lo primero que hago como buen hijo de vecino, es comparar la entrada y la salida.
En este caso se ve con claridad que se reemplaza el hash invirtiendo e eliminando un caracter del mismo.

Con eso ya sé que como mínimo se usa s.replace(a,b), s.inverse() y un método o más que tengo que consultar cuando evalue la variable "_0xa425".
En este caso el s.replace(a,b) es fundamental, sólo existe uno, así que sin miramiento alguno, todo lo que hay entre el primer ";" y "_0xf328x2[_0xa425[2]]=_0xf328x2[_0xa425[2]][_0xa425[8]]" lo elimino. Al eliminarlo me obliga a eliminar lo que le sobra al final del script; "return _0xf328x2});return _0xf328x1[_0xa425[10]]}".
A lo que me queda le elimino (lo que es de cajón, al menos para mí) los "[_0xa425[2]]" ya que sería un elemento que sólo funcionaría en la página web y sólo quiero s.replace(a,b) y no s.algo.replace(a,b).
Elimino los dos que hay y me queda algo que puedo evaluar y clarificar por si quiero recrearlo

Código: Seleccionar todo

_0xa425= ["\x73\x69\x7A\x65","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x66\x69\x6C\x65","\x72\x65\x76\x65\x72\x73\x65","","\x73\x70\x6C\x69\x74","\x73\x70\x6C\x69\x63\x65","\x6A\x6F\x69\x6E","\x72\x65\x70\x6C\x61\x63\x65","\x6D\x61\x70","\x6C\x65\x6E\x67\x74\x68"];_0xf328x2= _0xf328x2[_0xa425[8]](/[0-9a-z]{40,}/i,function(_0xf328x3){_0xf328x4=_0xf328x3[_0xa425[5]](_0xa425[4])[_0xa425[3]]();_0xf328x4[_0xa425[6]](1,1);return _0xf328x4[_0xa425[7]](_0xa425[4])});
Para evaluarlo de forma rápida inicializo la variable "_0xf328x2" con una url y añado un alert("url:" + _0xf328x2 + "\nmétodos: " + _0xa425) para ver de forma rápida la nueva url y los métodos que se usan.

Código: Seleccionar todo

_0xa425= ["\x73\x69\x7A\x65","\x70\x72\x6F\x74\x6F\x74\x79\x70\x65","\x66\x69\x6C\x65","\x72\x65\x76\x65\x72\x73\x65","","\x73\x70\x6C\x69\x74","\x73\x70\x6C\x69\x63\x65","\x6A\x6F\x69\x6E","\x72\x65\x70\x6C\x61\x63\x65","\x6D\x61\x70","\x6C\x65\x6E\x67\x74\x68"];

_0xf328x2= "http://1.2.3.4:1234/a0b1c2d3e4f5g6h7i8j9k0l1m2n3o4p5q6r7s8t9u0v1w2x3y4z5a6b7c8d9e/l.ext";

_0xf328x2= _0xf328x2[_0xa425[8]](/[0-9a-z]{40,}/i,function(_0xf328x3){_0xf328x4=_0xf328x3[_0xa425[5]](_0xa425[4])[_0xa425[3]]();_0xf328x4[_0xa425[6]](1,1);return _0xf328x4[_0xa425[7]](_0xa425[4])});

alert("url:" + _0xf328x2 + "\nmétodos: " + _0xa425);
A partir de aquí es fácil sustitur los _0xa425[x] con el valor que le corresponda.

Al resultado de todo le he renombrado todas las variables "_0xf328xn" por "var_n" con lo que se me queda un code más mono por si quiero reproducirlo en lo que sea :)

Código: Seleccionar todo

var_2= "http://1.2.3.4:1234/a0b1c2d3e4f5g6h7i8j9k0l1m2n3o4p5q6r7s8t9u0v1w2x3y4z5a6b7c8d9e/l.ext";

var_2= var_2.replace(/[0-9a-z]{40,}/i,function(var_3){var_4=var_3.split("").reverse();var_4.splice(1,1);return var_4.join("")});

alert("url:" + var_2);
Puede parecer que se tarde mucho, todo lo contrario. En un script tan pequeño la diversión se acaba muy pronto :lol:

Re: Obtener la URL de un vídeo embebido

Publicado: 19 Dic 2016, 12:17
por tormund
Waw, me has dejado alucinando. Entonces cada vez que realicen un cambio va a estar reflejado en esta función. Lo que tengo que hacer es pasarle el jjdecode y a partir de la salida que me dé éste montarme un pequeño script que me muestre qué cambios se están haciendo en la URL obtenida del unpack.

Maestro, a sus pies.

Re: Obtener la URL de un vídeo embebido

Publicado: 20 Dic 2016, 02:17
por robalo
A ver si te gusta esto

jjhexdecode.java

Código: Seleccionar todo

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class jjhexdecode {

	String jj_hexdecode;

	jjhexdecode(String jj_hexencode) {

		String jj_methods = jj_hexencode.replaceAll("^[^\\=]+\\=\\[([^\\]]+)\\];.+$", "$1");
		String jj_script = jj_hexencode.replaceAll("^[^\\=]+\\=\\[[^\\]]+\\];(.+)$", "$1");

		String var_methods = "";
		String patron = "(\")([^\"]*)(\")((?:,|$))";
		String patron2 = "\\\\x(\\w+)";
		Matcher matches = Pattern.compile(patron).matcher(jj_methods);
		while (matches.find()){
			var_methods += matches.group(1);
			Matcher matches2 = Pattern.compile(patron2).matcher(matches.group(2));
			while (matches2.find()){
				char d = (char) Integer.parseInt(matches2.group(1), 16);
				var_methods += d;
			}
			var_methods += matches.group(3);
			var_methods += matches.group(4);
		}

		String[] var_0 = var_methods.split(",");

		jj_script = jj_script.replaceAll("_\\d+x\\w+x(\\d+)", "var_$1");
		jj_script = jj_script.replaceAll("_\\d+x\\w+", "var_0");

		for ( int i= 0;i < var_0.length; i++ ){
			if (var_0[i].length() == 2)
				jj_script = jj_script.replace("var_0[" + i + "]", var_0[i]);
			else
				jj_script = jj_script.replace("[var_0[" + i + "]]", "." + var_0[i].replace("\"", ""));
		}
		
		jj_hexdecode = jj_script;

	}
}
Creo que se puede mejorar un poco más y cuando se nos presente código del mismo estilo ver si necesita algo más y meter en la caja de herramientas otra librería útil hecha :)

Re: Obtener la URL de un vídeo embebido

Publicado: 21 Dic 2016, 20:46
por tormund
Espectacular.

He visto que en Streminto también han introducido la función packed, es de esperar que terminen haciendo cambios de este tipo, así que esto vendrá de lujo para encontrar rápidamente el cambio.

Saludos y muchas gracias.

Re: Obtener la URL de un vídeo embebido

Publicado: 21 Ene 2017, 01:08
por ChollyStanton
Hola!

Ha vuelto a fallar powvideo en java. Algún arreglo reciente? gracias