Skype apre JavaScript con codifica Base64. Che cosa fa?

18

Mi sono imbattuto in un problema piuttosto insolito e non riesco a capire se si tratti effettivamente di un problema (o anche di un problema di sicurezza) o meno. All'apertura di Skype su MacOS, viene visualizzata una finestra popup (più volte, ma con lo stesso identico contenuto), che richiede di scegliere un'applicazione per l'apertura di quanto segue:

Ladecodificadelvalorebase64rivelaunosnippetJavaScriptall'internodiuntagscript,ilchemiportaacrederecheSkypestiacercandodiaprirequestoscriptall'internodiunbrowser.Eccoilvalorecompleto,abbellitoperlaleggibilità:

<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>

Ho invertito un po 'questo frammento di codice. Per quanto ho capito, ascolta l'evento message sull'oggetto window e quindi aggiorna alcuni valori. Inoltre chiama ripetutamente requestAnimationFrame , da cui i messaggi sono pubblicati.

Che cosa sta facendo questo codice? Perché Skype sta tentando di aprirlo?

    
posta NikxDa 27.02.2018 - 09:48
fonte

1 risposta

2

Ho iniziato rinominando alcune variabili per rendere le cose un po 'più comprensibili:

    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
    }

Questa è la prima funzione, quando eseguiamo la stringa oscura pdqvgvxFtpuj~tmmFscpi attraverso di essa, in effetti riceviamo la parola requestAnimationFrame come dimostrato in questo cestino (avviso in anticipo).

La funzione h() mi ha infastidito per un po ', quindi ho iniziato a cercare motivi per cui le persone usano la funzione requestanimationframe .

In quel momento ho trovato questa pagina :

Limiting the frame rate while using requestAnimationFrame can be a common want especially when coding Games where you want your animations and mechanics to not exceed a particular mark of frames per second. Let’s go through 2 ways of doing it.

Il primo modo in cui l'autore descrive è attraverso setTimeOut , ma poi scrive:

Ok, browsers cannot optimize setTimeout or setInterval. So it’s kinda better to do our own calculations and restrict the frame rate. Let’s see how.

E quindi procede con il seguente codice:

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();

Che assomiglia molto ai calcoli che vengono fatti nel nostro codice.

Ma perché appare su Skype senza che io faccia nulla?

Perché i browser e Javascript sono letteralmente ovunque. Ho appena avviato Skype e non mi ha dato un errore, ma mi sta mostrando annunci. Il mio istinto mi dice che il browser incorporato che carica l'annuncio non ha un gestore per gli URL di dati nel tuo caso, motivo per cui Skype sembra dare questo errore.

Il codice è in realtà solo l'aggiunta di un gestore di eventi e l'accertamento che FPS non venga interrotto ogni volta che viene chiamato l'evento. (Passare da una pubblicità all'altra, rendere gli annunci senza intoppi, rendere l'icona di caricamento senza intoppi, ...)

Se gli annunci superano o scendono al di sotto del tempo di visualizzazione su 1 000 000 di impressioni di 30 secondi, una differenza di 10 ms può ridimensionarsi in modo incredibilmente rapido e offrire agli inserzionisti tempi di visualizzazione inferiori o superiori a quelli per cui pagano.

Ma perché è oscuro?

Come per il commento di @dandavis, non c'è davvero nessuna ragione apparente per offuscare questo codice, è disponibile liberamente su Internet (come ho linkato sopra). Tuttavia, lo stesso browser incorporato che sta eseguendo questo codice, potrebbe anche ospitare un frame di accesso, ad esempio.

Non riscriveremo un gestore per codice oscuro e non oscuro quando è molto più semplice e meno incline a eseguire tutto il codice tramite un offuscatore se ne abbiamo bisogno una volta.

È probabile che sia probabile che la ragione per cui questo è offuscato sia solo una regola generale: offusca tutti i codici JS.

    
risposta data 18.05.2018 - 20:44
fonte

Leggi altre domande sui tag