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函数钩子及其他的更多相关文章

  1. JS:javascript 函数后面有多个小括号是怎么回事?f( )( )( )...

    有时我们看见js函数后面跟着多个小括号是怎么回事?f( )( )( )... f()意思是执行f函数,返回子函数 f()()执行子函数,返回孙函数 f()()()执行孙函数 ()()表示定义并执行,使 ...

  2. JS通用表单验证函数,基于javascript正则表达式

    表单的验证在实际的开发当中是件很烦琐又无趣的事情今天在做一个小项目的时候,需要JS验证,寻找到一个比较好的东西 地址如下: http://blog.csdn.net/goodfunman/archiv ...

  3. JS通用事件监听函数

    JS通用事件监听函数 版本一 //把它全部封装到一个对象中 var obj={ readyEvent:function (fn){ if(fn==null){ fn=document; } var o ...

  4. html css <input> javaScript .数据类型 JS中的函数编写方式 BOM总结 DOM总结

    Day27  html css div 块标签. 特点: 独占一行,有高度和宽度 span 行元素. 特点:在同一行显示,当前行满了自动去下一行显示. 不识别高度和宽度 1.1.1.1 2.输入域标签 ...

  5. 通用javascript脚本函数库

    /* 名字:Common.js 功能:通用javascript脚本函数库 包括: 1.Trim(str)--去除字符串两边的空格 2.XMLEncode(str)--对字符串进行XML编码 3.Sho ...

  6. JavaScript基础11——js的全局函数

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. VC与JavaScript交互(三) --- CWebPage类调用javascript函数(给js函数传参,并取得返回值)

    ①需要一个别人写好的类CWebPage,将其对于的两个文件WebPage.h和WebPage.cpp添加到工程中. ②添加WebBrowser控件,在视图/对话框类的头文件中#include &quo ...

  8. JavaScript函数认识,Js中的常见函数

    JavaScript函数: 也称为方法,用来存储一块代码,需要的时候调用. 函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块. 函数需要包含四要素:返回类型,函数名,参数列表,函数体 拓展: ...

  9. 【JS小技巧】JavaScript 函数用作对象的隐藏问题

    用户反馈 @消失的键盘 在论坛反馈了一个问题,在 AppBoxMvc 中的 Title 模型中,如果将 Name 属性改名为小写的 name 属性,就会报错: 因为这是一个 ASP.NET MVC 的 ...

随机推荐

  1. Spring框架中用到的设计模式(转)

    主要参考这篇文章 http://blog.didispace.com/spring-design-partern/

  2. 请简述以下两个for 循环的优缺点

    今天笔试时候遇到一个问题,找到相似的. ; i<N; i++) { if (condition) DoSomething(); else DoOtherthing(); } if (condit ...

  3. IAR升级之后,编译stm32官方工程报错的解决办法

    IAR升级之后,打开stm32官方例程,编译时提示如下错误: Error[Pe147]: declaration is incompatible with "__nounwind __int ...

  4. GD32F450 200M时USB不稳定

    使用GD32F450的demo修改usb驱动,发现120M和168M时正常,200M时很不稳定.怀疑USB时钟分频有问题,一查果然是,记录如下: 200M是库函数主时钟分频代码如下 static vo ...

  5. 项目开发设计模式理解之MVC模式

    项目开发设计模式之MVC模式: M model 模型层 V view 视图层 C control 控制器 MVC模式在B/S架构下使用很广泛的软件设计模式,分成三个相对独立的模块构成,model+vi ...

  6. React with webpack - part 1

    http://jslog.com/2014/10/02/react-with-webpack-part-1/

  7. 20155226 2016-2017-2 《Java程序设计》第3周学习总结

    20155226 2016-2017-2 <Java程序设计>第3周学习总结 教材学习内容总结 认识对象 类类型 Java可区分为基本类型和类类型两大类型系统,其中类类型也称为参考类型.s ...

  8. 20155308&20155316 2017-2018-1 《信息安全系统设计基础》实验三

    20155308&20155316 2017-2018-1 <信息安全系统设计基础>实验三 并发程序-1 学习使用Linux命令wc(1) 基于Linux Socket程序设计实现 ...

  9. 20155320 2016-2017-2《Java程序设计》课程总结

    20155320 2016-2017-2<Java程序设计>课程总结 (按顺序)每周作业链接汇总 预备作业1:第一次写随笔,回答了老师的一些问题,写下了期望和目标 预备作业2:总结了一下自 ...

  10. 20145209 实验四 《android开发基础》 实验报告

    20145209 实验四 <android开发基础> 实验报告 实验内容 Android Stuidio的安装测试: 参考<Java和Android开发学习指南(第二版)(EPUBI ...