[hook.js]通用Javascript函数钩子及其他
2013.02.16<:article id=post_content>
最近看Dom Xss检测相关的Paper,涉及到Hook Javascript函数,网上翻了一下,貌似没有什么通用的函数钩子脚本,自己用就自己写一个吧。最后有代码地址,前面写下mind storm的过程。
最经典且简单的Javascript函数钩子的写法应该是下面这样了:
var _alert = alert;
window.alert =function(s){
console.log("Hooked!");
_alert(s);}
不过这种Hook方式跟闹着玩儿似的,用到实际生产上通用性不好,效率也不高。
国内比较早看到的介绍Javascript函数劫持的文章应该是安全焦点上luoluo写的《浅谈javascript函数劫持》,用Javascript函数钩子实现了一个简单的内联代码调试器。后来看到了大风在08年搞了一个anehta的攻击平台,其中有一段能够hook任意Javascript函数的代码,看了下有一些问题,不过毕竟钩子只是anehta其中一个功能。这里贴出部分代码,有兴趣可以到这里看完整版:
hook:function(funcNameHooked,RealFuncAfterHooked, hookFunc){try{
setTimeout(function(){//alert("hook before: "+window[funcNameHooked]);// 保存原函数
window[RealFuncAfterHooked]= window[funcNameHooked];//window[funcNameHooked] = window[hookFunc];// 参数个数可以根据需要进行调整
window[funcNameHooked]=function(param1,param2,param3,param4,param5,param6,param7){// 劫持参数var newParam =newArray();// 先执行注入的函数; 需要返回被劫持后的参数,作为新参数传入原函数
newParam = window[hookFunc](param1,param2, param3, param4, param5, param6, param7)//alert("newParam= "+newParam);// 再执行原函数
window[RealFuncAfterHooked](newParam[0], newParam[1], newParam[2], newParam[3],
newParam[4], newParam[5], newParam[6]);// 不注入参数,直接执行原函数; //window[RealFuncAfterHooked](param1,param2,param3,param4,param5,param6,param7); }//alert("hook after: "+window[funcNameHooked]);},10);returntrue;}catch(e){returnfalse;}},
这段代码固定了被Hook的函数所在对象是window,这样对于自定义对象中的函数及原型对象中的函数(String.prototype)就没办法进行Hook了。而且参数param[1-7]是写死在函数里的,通用性不太好,其实可以用arguments对象来实现变参。
因为要做的是函数钩子,函数又都是Function对象的实例,那么直接给Function.prototype添加hook和unhook函数就可以了。
按照这个思路自己写了一个,简单封装了一下,能够对普通的全局函数(eg:alert),自定义类中的函数(eg:cat.Eat()),以及原型对象中的函数(eg:String.prototype.slice)进行hook。可以防止函数被二次hook而导致的callback in callback。代码不长这里就贴出来了,也可以到github上去看,有测试样例和详细的参数说明。
functionHooks(){return{
initEnv:function(){Function.prototype.hook =function(realFunc,hookFunc,context,funcName){var _context =null;//函数上下文var _funcName =null;//函数名
_context = context || window;
_funcName = funcName || getFuncName(this);
_context[realFunc]=this;if(_context[_funcName].prototype && _context[_funcName].prototype.isHooked){
console.log("Already has been hooked,unhook first");returnfalse;}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{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'+'};');
_context[_funcName].prototype.isHooked =true;returntrue;}catch(e){
console.log("Hook failed,check the params.");returnfalse;}}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");returnfalse;}
_context[_funcName]= _context[realFunc];delete _context[realFunc];returntrue;}},
cleanEnv:function(){if(Function.prototype.hasOwnProperty("hook")){deleteFunction.prototype.hook;}if(Function.prototype.hasOwnProperty("unhook")){deleteFunction.prototype.unhook;}returntrue;}};}

[hook.js]通用Javascript函数钩子及其他的更多相关文章
- JS:javascript 函数后面有多个小括号是怎么回事?f( )( )( )...
有时我们看见js函数后面跟着多个小括号是怎么回事?f( )( )( )... f()意思是执行f函数,返回子函数 f()()执行子函数,返回孙函数 f()()()执行孙函数 ()()表示定义并执行,使 ...
- JS通用表单验证函数,基于javascript正则表达式
表单的验证在实际的开发当中是件很烦琐又无趣的事情今天在做一个小项目的时候,需要JS验证,寻找到一个比较好的东西 地址如下: http://blog.csdn.net/goodfunman/archiv ...
- JS通用事件监听函数
JS通用事件监听函数 版本一 //把它全部封装到一个对象中 var obj={ readyEvent:function (fn){ if(fn==null){ fn=document; } var o ...
- html css <input> javaScript .数据类型 JS中的函数编写方式 BOM总结 DOM总结
Day27 html css div 块标签. 特点: 独占一行,有高度和宽度 span 行元素. 特点:在同一行显示,当前行满了自动去下一行显示. 不识别高度和宽度 1.1.1.1 2.输入域标签 ...
- 通用javascript脚本函数库
/* 名字:Common.js 功能:通用javascript脚本函数库 包括: 1.Trim(str)--去除字符串两边的空格 2.XMLEncode(str)--对字符串进行XML编码 3.Sho ...
- JavaScript基础11——js的全局函数
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- VC与JavaScript交互(三) --- CWebPage类调用javascript函数(给js函数传参,并取得返回值)
①需要一个别人写好的类CWebPage,将其对于的两个文件WebPage.h和WebPage.cpp添加到工程中. ②添加WebBrowser控件,在视图/对话框类的头文件中#include &quo ...
- JavaScript函数认识,Js中的常见函数
JavaScript函数: 也称为方法,用来存储一块代码,需要的时候调用. 函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块. 函数需要包含四要素:返回类型,函数名,参数列表,函数体 拓展: ...
- 【JS小技巧】JavaScript 函数用作对象的隐藏问题
用户反馈 @消失的键盘 在论坛反馈了一个问题,在 AppBoxMvc 中的 Title 模型中,如果将 Name 属性改名为小写的 name 属性,就会报错: 因为这是一个 ASP.NET MVC 的 ...
随机推荐
- Hadoop系列-HDFS基础
基本原理 HDFS(Hadoop Distributed File System)是Hadoop的一个基础的分布式文件系统,这个分布式的概念主要体现在两个地方: 数据分块存储在多台主机 数据块采取冗余 ...
- 我一个自己的关于II和&&的逻辑判断(傻逼型)
原因 首先概述下起始原因:本来埋点的数据中传递来的URL只有http://开头的数据,所以上一个编写此程序的人在定义产品ID和出发口岸时加了这样的判断 然后...悲剧(傻逼)开始了 因为业务需求,埋点 ...
- Python爬虫——Scrapy整合Selenium案例分析(BOSS直聘)
概述 本文主要介绍scrapy架构图.组建.工作流程,以及结合selenium boss直聘爬虫案例分析 架构图 组件 Scrapy 引擎(Engine) 引擎负责控制数据流在系统中所有组件中流动,并 ...
- GUN交叉工具链各模块的作用
名称 归属 作用 arm-linux-as binutils 编译ARM 汇编程序 arm ...
- python 银行系统
目前代码只写到这 主要部分已经实现 功能部分展现 首先我们需要五个类 用户类 : 成员属性 name id 以及 card 卡类: 成员属性 卡号 密码 余额 锁 界面类: 管理员界 ...
- Python3爬虫(十八) Scrapy框架(二)
对Scrapy框架(一)的补充 Infi-chu: http://www.cnblogs.com/Infi-chu/ Scrapy优点: 提供了内置的 HTTP 缓存 ,以加速本地开发 . ...
- PHP base64转换成图片
获取base64文件 $image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASIAAAEiCAYAAABdvt+2AAAgAElEQV ...
- 20155236 《Java程序设计》实验一(Java开发环境的熟悉)实验报告
20155236 <Java程序设计>实验一(Java开发环境的熟悉)实验报告 一.实验内容及步骤 (一)使用JDK编译.运行简单的java程序 命令行下的程序开发 因为我用的是windo ...
- Hadoop守护进程的作用(转)
概述: <ignore_js_op> Hadoop是一个能够对大量数据进行分布式处理的软件框架,实现了Google的MapReduce编程模型和框架,能够把应用程序分割成许多的 小的工作单 ...
- Objective-C 方法交换实践(一) - 基础知识
一.Objective-C 中的基本类型 首先看下 Objective-C 的对象模型,每个 Objective-C 对象都是一个指向 Class 的指针.Class 的结构如下: struct ob ...