怎样Hook 网页函数发生异常中所有的 JavaScript 函数

本文讲的是js调用父框架函数与弹窗调用父页面函数的方法,
iframe 父窗口和子窗口相互的调用方法集锦 一、父窗口调用iframe子窗口方法
1、HTML语法:&iframe name=&myFrame& src=&child.html&&&/iframe&
iframe 父窗口和子窗口相互的调用方法集锦 一、父窗口调用iframe子窗口方法
1、HTML语法:&iframe name="myFrame" src="child.html"&&/iframe&
2、父窗口调用子窗 口:myFrame.window.functionName();
3、子窗品调用父窗 口:parent.functionName();
onclick="window.parent.frames.aaa()"
function aaa()
alert(‘bbbbb’);
----------------------------------------------
frame框架里的页面要改其他同框架下的页面或父框架的页面就用parent
window.opener引用的是window.open打开的页面的父页面。
window.frames对象可以引用iframe里的页面,也可以引用frameset里的页面.
window.frames[0].document.getElementById(‘xx’);
window.frames[0].document.body.innerHTML;
frm = window.parent.window.frames[‘uploadFrame’];
frmDocument = frm.
frm.sb(3); //sb 是uploadFrame页面里的一个函数
对于firefox
如果你遇到报错:parent.document.frames has no properties
换为如下代码就可以了,这个代码IE,ff兼容. frm = window.parent.window.frames[‘uploadFrame’];其实 frames 集合并不是挂在 document 而是挂在 window 对象下.
注意这样修改frame里的页面有限制,就是必须是同域下的,否则无法访问
如果是同一域下,但是子域名不同,那么涉及到的js,html文件都加上一句。
document.domain =
[这里填写你的域名]
document.getElementById(‘iframeid’).contentWindow.document.getElementById(‘someelementid’);
js弹窗页面后调用父页面函数
(例如:调用父页面函数test2())
window.opener.test2();
框架子页面调用上一个页面方法
(例如:上一页面的框架frame名为menuBar,调用onhook()函数)
window.top.frames["menuBar"].onhook();
js弹窗页面调用父页面框架子页面函数
(如:弹窗页面调用,frame名为menuBar)
window.opener.top.frames['menuBar'].onhook();
完整的例子
  test.htm &HTML&
  &HEBD&
  &TITLE& Test Page &/TITLE&
  &script src="prototype-1.4.0.js"&&/script&
  &script language="javascript"&
  function show()
  window.frames["iframe_text"].document.getElementBy Id("myH1").innerHTML = "";
  &/script&
  &/HEBD&
  &BODY&
  &iframe height="350" width="600" src="iframe_test.htm" name="iframe_text"&&/iframe&
  &form action="" method="post"&
  &input name="haha" id="haha" type="text" maxlength="30" value="haha" /&
  &br /&
  &textarea cols="50" rows="5" id="getBttributeMethod"&&/textarea&
  &input type="button" onDlick="show();" value="提交"/&
  &/form&
  &h1 id="myH1"&d&/h1&
  &/BODY& &/HTML&
  frame_test.htm &!DODTYPE html PUBLID "-//W3D//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transition al.dtd"&
  &html xmlns="http://www.w3.org/1999/xhtml"&
  &head&
  &meta http-equiv="Dontent-Type" content="text/ charset=gb2312" /&
  &title&无标题&/title&
  &/head&
  &script language="javascript"&
  function show()
  parent.document.getElementById("myH1").innerHTML = http:// ;
  &/script& &body&
  &h1 id="myH1"&ha&/h1&
  &form action="" method="post"&
  &input name="abc" id="abc" type="text" maxlength="30" value="abc" /&
  &br /&
  &textarea cols="50" rows="10" id="text"&&/textarea&
  &br /&
  &input type="button" value="提交" onclick="show();"/&
  &/form&
  &/body& &/html&
  test.htm里面firefox下访问iframe 必须用name,不能用id,所以要改为name="iframe_test" 。
补充:如果碰到Error: Permission denied to access property "alertMsg"问题我们要解决的必须就是放在服务器上即可,如我本地打开的是这个地址
file:///C:/Documents%20and%20Settings/Administrator/桌面/8-9/index.html
调用页面的php程序用的是
http://192.168.1.118:9/pin89/a.php
那么怎么修改 &script&window.parent.alertMsg(1);&/script& 都是没有用的
解决办法就是
file:///C:/Documents%20and%20Settings/Administrator/桌面/8-9/index.html
http://192.168.1.118:9/pin89/index.html
http://192.168.1.118:9/pin89/a.php输出
&script&window.parent.alertMsg(1);&/script&
问题即可解决
以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索框架
弹窗调用主页面方法、弹窗框架、跨框架弹窗、js弹窗框架、easyui 弹窗框架,以便于您获取更多的相关知识。
为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效率,降低 IT 成本...
RDS是一种稳定可靠、可弹性伸缩的在线数据库服务。支持MySQL、SQL Server、PostgreSQL、高...
云栖社区()为您免费提供相关信息,包括
的信息,还有弹窗调用主页面方法、弹窗框架、跨框架弹窗、js弹窗框架、easyui 弹窗框架等
,所有相关内容均不代表云栖社区的意见!1429人阅读
最近看Dom Xss检测相关的Paper,涉及到Hook Javascript函数,网上翻了一下,貌似没有什么通用的函数钩子脚本,自己用就自己写一个吧。最后有代码地址,前面写下mind storm的过程。
最经典且简单的Javascript函数钩子的写法应该是下面这样了:
var _alert = alert;
window.alert = function(s) {
console.log(&Hooked!&);
_alert(s);
不过这种Hook方式跟闹着玩儿似的,用到实际生产上通用性不好,效率也不高。
国内比较早看到的介绍Javascript函数劫持的文章应该是安全焦点上luoluo写的《》,用Javascript函数钩子实现了一个简单的内联代码调试器。后来看到了大风在08年搞了一个的攻击平台,其中有一段能够hook任意Javascript函数的代码,看了下感觉有一些问题。这里贴出部分代码,有兴趣可以到看完整版:
hook: function(funcNameHooked, RealFuncAfterHooked, hookFunc){
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 = new Array();
// 先执行注入的函数; 需要返回被劫持后的参数,作为新参数传入原函数
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]);
return true;
} catch (e){
return false;
这段代码固定了被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。代码不长这里就贴出来了,也可以到上去看,有测试样例和参数说明。
function Hooks()
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&);
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 '';
eval('_context[_funcName] = function '+_funcName+'(){\n'+
'var args = Array.prototype.slice.call(arguments,0);\n'+
'var obj =\n'+
'hookFunc.apply(obj,args)\n'+
'return _context[realFunc].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;
hook.jsA hooks to any Javascript function.Notice[bool]hook:params{
realFunc[String|must]:用于保存原始函数的函数名称,用于unH
hookFunc[Function|must]:替换的hook函数;
context[Object|opt]:目标函数所在对象,用于hook非window对象下的函数,如String.protype.slice,carInstance1
methodName[String|opt]:匿名函数需显式传入目标函数名eg:this.Begin = function(){....};
[bool]unhook:params{
realFunc[String|must]:用于保存原始函数的函数名称,用于unH
funcName[String|must]:被Hook的函数名称
context[Object|opt]:目标函数所在对象,用于hook非window对象下的函数,如String.protype.slice,carInstance1
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:156347次
积分:1745
积分:1745
排名:千里之外
原创:18篇
转载:70篇
评论:11条
(1)(1)(1)(1)(2)(2)(1)(1)(2)(1)(2)(1)(1)(1)(6)(3)(1)(10)(10)(5)(10)(10)(2)(1)(4)(1)(1)(6)(1)(1)Hook Javascript Function(2)_最火下载站
您的位置: >
> Hook Javascript Function(2)
Hook Javascript Function(2)
要实现这样的东西,我们需要知道修改某一处的函数引用,对于这样的全局函数,我们知道它的所属对象是 window。如果对于类的成员函数,则应该是类.prototype.funName,对于实例的成员,我们可以通过在实例上添加函数来重写方法。
首先我们这个函数是所有函数的方法,所以它必须在 Function.prototyp 上添加一个新的函数Hook, 它的逻辑应该是首先查找函数的名称,如果得到了,则直接改写在指定对象上的函数实现。但如果这个函数是匿名函数,我们需要查找这个对象的所有属性,看哪个属性和这个函数相等,如果有一个,则取出第一个相等的进行Hook。当然,如果Hook时明确指定了属性,则找到这个属性进行Hook。
下面是实现的代码:
//这里我们改变输出方式
window.alert = function(msg)
tbVal.innerText += '\n' +
Function.prototype.hook = function(/*[context,]*//*[methodName,*/fnBefor /*[,fnAfter]*/) {
//提出函数名称
function getFunName(fn) {
var method = fn.toString();
var rgx = /function\s+(\w+)\s*\(/;
var r = method.match(rgx);
return r[1];
return '';
//加载参数
var context =
var methodName =
var argIndex = 0;
if (typeof (arguments[argIndex]) != 'function' && typeof (arguments[argIndex]) != 'string')
context = arguments[argIndex++];
if (typeof (arguments[argIndex]) == 'string')
methodName = arguments[argIndex++];
fnBefor = arguments[argIndex++] || function() { }
var fnAfter = arguments[argIndex++] || function() { }
//处理默认参数
context = context ||
var method =
var methodName = methodName || getFunName(method);
if (methodName == '') {
//找不到,可能是匿名函数,我们从对象中查找试试
var bFound =
var contextObject = context.constructor == Array.prototype.constructor ? Array.prototype :
for (var m in contextObject) {
// alert(m + ':' + context[m]);
if (context[m] == method) {
methodName =
if (!bFound) {
alert('请提供正确的函数所属对象使用有名函数');
//生成有参数名的新函数
eval('context[methodName] = function ' + methodName + '()\n' +
' var args = Array.prototype.slice.call(arguments,0);\n' +
' var ctx =\n' +
' try\n' +
' if(fnBefor.apply(ctx, args))\n' +
' return method.apply(ctx, args);\n' +
' finally\n' +
' fnAfter.apply(ctx, args);\n' +
不过写完了,发现不能Unhook一个函数,下次改进吧,写了一天了这个东西,得赶赶进度了。
上一篇: 下一篇:

我要回帖

更多关于 网页中的按钮如何调用函数 的文章

 

随机推荐