阻止百度统计和嵌入窗口

使用Hook技术阻止百度统计和嵌入窗口

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         阻止百度统计和嵌入窗口
// @namespace    http://www.infosec-wiki.com/
// @version      1.3
// @description  使用Hook技术阻止百度统计和嵌入窗口
// @author       infosec-wiki
// @match        *
// @run-at       document-start
// @grant        unsafeWindow
// @noframes
// ==/UserScript==

(function() {
	'use strict';

	/**
	 Code by pnig0s[Knownsec&FreeBuf]
	 Date 20130214
	 一個通用的js任意函數鉤子
	 A simple hooks to Javascript functions

	 [bool]hook:params{
	realFunc[String|must]:用於保存原始的目標函數名,用於unHook;
	hookFunc[Function|must]:替換的hook函數;
	context[Object|opt]:目標函數實例的對象,用於hook非window對象下的函數,如String.protype.slice,carInstance1
	methodName[String|opt]:用於hook匿名函數eg:this.Begin = function(){....};
}
	 [bool]unhook:params{
	realFunc[String|must]:用於保存原始的目標函數名,用於unHook;
	funcName[String|must]:被Hook的函數名稱
	context[Object|opt]:目標函數實例的對象,用於hook非window對象下的函數,如String.protype.slice,carInstance1
}

	 **/

	function Hooks() {
		return {
			initEnv:function () {
				Function.prototype.hook = function (realFunc,hookFunc, run, context,funcName) {
					var _context = null; //函數上下文
					var _funcName = null; //函數名

					_context = context || window;
					//_context = context || unsafeWindow;

					_funcName = funcName || getFuncName(this);
					_context[realFunc] = this;

					if(_context[_funcName].prototype && _context[_funcName].prototype.isHooked)
					{
						console.log("Already has been hooked,unhook first");
						return false;
					}

					function getFuncName (fn) {
						// 獲取函數名稱
						var strFunc = fn.toString();
						var _regex = /function\s+(\w+)\s*\(/;
						var patten = strFunc.match(_regex);
						if (patten) {
							return patten[1];
						};
						return '';
					}

					try {
						if (run) {
							eval('_context[_funcName] = function ' + _funcName + '(){\n' +
								'var args = Array.prototype.slice.call(arguments,0);\n' +
								'var obj = this;\n' +
								'hookFunc.apply(obj,args)\n' +
								'return _context[realFunc].apply(obj,args);\n' +
								'};');
						}else {
							eval('_context[_funcName] = function ' + _funcName + '(){\n' +
								'var args = Array.prototype.slice.call(arguments,0);\n' +
								'var obj = this;\n' +
								'hookFunc.apply(obj,args)\n' +
								'};');
						}
						_context[_funcName].prototype.isHooked = true;
						return true;
					}catch (e)
					{
						console.log("Hook failed,check the params.");
						return false;
					}
				};
				Function.prototype.unhook = function (realFunc,funcName,context) {
					var _context = null;
					var _funcName = null;
					_context = context || window;
					_funcName = funcName;
					if (!_context[_funcName].prototype.isHooked)
					{
						console.log("No function is hooked on");
						return false;
					}
					_context[_funcName] = _context[realFunc];
					delete _context[realFunc];
					return true;
				};
			},
			cleanEnv:function () {
				if(Function.prototype.hasOwnProperty("hook"))
				{
					delete Function.prototype.hook;
				}
				if(Function.prototype.hasOwnProperty("unhook"))
				{
					delete Function.prototype.unhook;
				}
				return true;
			}
		};
	}
	var myHook = new Hooks();
	myHook.initEnv();

	var _createElement = null;
	function createElement_hook(tag_name){
		console.log("createElement: " + tag_name);
		if(tag_name.toLowerCase() == "script") {
			console.log("注意.....");
		}
	}
	Document.prototype.createElement.hook("_createElement", createElement_hook, true, Document.prototype);

	var _insertBefore = null;
	function insertBefore_hook(son, par){
		var tagName = son.tagName;
		if(tagName.toLowerCase() == "script"){
			var src = son.src;
			console.log("insertBefore: " + src);
			if(src.indexOf("hm.baidu.com") > -1){
			    console.log("阻止百度统计.... ");
                return false;
			}
		}
        HTMLElement.prototype["_insertBefore"].call(this, son, par);
	}
	HTMLElement.prototype.insertBefore.hook("_insertBefore", insertBefore_hook, false, HTMLElement.prototype);


	var _writeln = null;
	function writeln_hook(s){
		console.log("writeln: " + s);
		if(s.toLowerCase().indexOf("frameset") > -1 || s.toLowerCase().indexOf("iframe") > -1){
			console.log("阻止创建Frame窗口.....");
		}
		else{
			Document.prototype["_writeln"].call(document, s);
			//console.log(Document.prototype);
		}
	}
	Document.prototype.writeln.hook("_writeln", writeln_hook, false, Document.prototype);

	var _write = null;
	function write_hook(s){
		console.log("write: " + s);
		if(s.toLowerCase().indexOf("cnzz.com") > -1){
			console.log("阻止创建cnzz.com统计.....");
		}
		else{
			Document.prototype["_write"].call(document, s);
			//console.log(Document.prototype);
		}
	}
	Document.prototype.write.hook("_write", write_hook, false, Document.prototype);


	//myHook.cleanEnv(); //clear hooks

})();