Skype abre JavaScript codificado en base64. ¿Qué hace?

18

Acabo de encontrar un problema bastante inusual, y no puedo entender si realmente es un problema (o incluso un problema de seguridad) o no. Al abrir Skype en MacOS, aparece una ventana emergente (varias veces, pero con el mismo contenido exacto), solicitando elegir una aplicación para abrir lo siguiente:

Ladecodificacióndelvalorbase64revelaunfragmentodecódigoJavaScriptdentrodeunaetiquetadesecuenciadecomandos,loquemellevaacreerqueSkypeestáintentandoabrirestasecuenciadecomandosdentrodeunnavegador.Aquíestáelvalorcompleto,embellecidoparafacilitarlalectura:

<script>(function(){functiong(a){varc,b;c="";
            for (b = 0; b < a.length; b++) c += String.fromCharCode(a.charCodeAt(b) + 2 - b % 14);
            return c
        }

        function h(a) {
            d = a - k;
            k = a;
            if (!(350 < d))
                for (a = 0; a < b.length; a++) b[a] && b[a].postMessage && b[a].postMessage({
                    fps: 1E3 / d,
                    slot: e,
                    timeDelta: d || 0
                }, "*");
            window[g(f)](h)
        }
        var k = 0,
            d, b = [],
            e, f;
        f = "pdqvgvxFtpuj~tmmFscpi";
        window.addEventListener("message", function(a) {
            var c = a.data;
            c && c.slot && (a = a.source, -1 < b.indexOf(a) || (b.push(a), void 0 === e && (e = c.slot)))
        });
        window[g(f)](h)
    })();
</script>

He invertido un poco la ingeniería de este fragmento de código. Según tengo entendido, escucha el evento message en el objeto window y luego actualiza algunos valores. También llama repetidamente a requestAnimationFrame , desde donde se publican los mensajes.

¿Qué está haciendo este código? ¿Por qué Skype está intentando abrirlo?

    
pregunta NikxDa 27.02.2018 - 09:48
fuente

1 respuesta

2

Comencé cambiando el nombre de algunas variables para hacer las cosas un poco más comprensibles:

    function obscurify(function_input) {
        var returnstring, local_counter;
        returnstring = "";          
        for (local_counter = 0; local_counter < function_input.length; local_counter++) 
        {
            returnstring += String.fromCharCode(function_input.charCodeAt(local_counter) + 2 - local_counter % 14);

        }

        return returnstring
    }

Esta es la primera función, cuando ejecutamos la cadena oscura pdqvgvxFtpuj~tmmFscpi a través de ella, recibimos la palabra requestAnimationFrame como se muestra en esta bandeja (alertbox por delante).

La función h() me molestó un poco, así que empecé a buscar por razones por las que la gente usa la función requestanimationframe .

Fue entonces cuando encontré esta página :

  

Limitar la velocidad de fotogramas mientras se utiliza requestAnimationFrame puede ser una   deseo común, especialmente cuando codificas juegos donde quieres tu   Animaciones y mecánica para no exceder una marca particular de cuadros por   segundo. Veamos dos formas de hacerlo.

La primera forma que describe el autor es a través de setTimeOut , pero luego escribe esto:

  

Ok, los navegadores no pueden optimizar setTimeout o setInterval. Así que es un poco   mejor hacer nuestros propios cálculos y restringir la velocidad de fotogramas. Vamos a   mira cómo.

Y luego procede con el siguiente código:

var fps = 30;
var now;
var then = Date.now();
var interval = 1000/fps;
var delta;

function draw() {

    requestAnimationFrame(draw);

    now = Date.now();
    delta = now - then;

    if (delta > interval) {
        // update time stuffs

        // Just 'then = now' is not enough.
        // Lets say we set fps at 10 which means
        // each frame must take 100ms
        // Now frame executes in 16ms (60fps) so
        // the loop iterates 7 times (16*7 = 112ms) until
        // delta > interval === true
        // Eventually this lowers down the FPS as
        // 112*10 = 1120ms (NOT 1000ms).
        // So we have to get rid of that extra 12ms
        // by subtracting delta (112) % interval (100).
        // Hope that makes sense.

        then = now - (delta % interval);

        // ... Code for Drawing the Frame ...
    }
}

draw();

Que se parece mucho a los cálculos que se realizan en nuestro código.

Pero, ¿por qué aparece esto en Skype sin que yo haga nada?

Porque los navegadores y Javascript están literalmente en todas partes. Acabo de iniciar Skype y no me dio ningún error, pero me muestra anuncios. Mi instinto me dice que el navegador integrado que carga el anuncio no tiene manejador de URL de datos en su caso, por lo que Skype parece dar ese error.

El código es simplemente agregar un administrador de eventos, y asegurarse de que el FPS no se rompa cada vez que se llama al evento. (Cambiar entre anuncios, hacer que los anuncios se ejecuten sin problemas, hacer que el icono de carga se ejecute sin problemas, ...)

Si los anuncios superan o superan su tiempo de visualización en 1 000 000 impresiones de 30 segundos, una diferencia de 10 ms puede escalar increíblemente rápido y, por lo tanto, otorga a sus anunciantes más o menos tiempo de visualización del que pagan.

Pero, ¿por qué está oscuro?

Según el comentario de @dandavis, de hecho no hay ninguna razón aparente para ofuscar este código, está disponible de forma gratuita en Internet (como he vinculado anteriormente). Sin embargo, el mismo navegador integrado que ejecuta este código, también podría albergar un marco de inicio de sesión, por ejemplo.

No vamos a volver a escribir un controlador para el código oscuro y el no oscuro cuando es mucho más fácil y menos propenso a errores simplemente ejecutar todo el código a través de un ofuscador si lo necesitamos una vez.

Es muy probable que la razón por la que se ofusque esto sea una Regla general: ofuscar todo el Código JS.

    
respondido por el Nomad 18.05.2018 - 20:44
fuente

Lea otras preguntas en las etiquetas