赞
踩
Hook就是在这些流程任意环节插入自己的代码,让浏览器先执行自己的代码 然后再执行原本网站的
hook在以下流程中可以做的事情:
hook在以下流程中可以做的事情
上下文:表示一个环境(js上下文就是v8引擎,浏览器是不同的页签就是不同的上下文,js中的eval还是在一个上下文。只是虚拟机、)
作用域:控制变量所生效的位置。作用域是更小的一个级别 处于上下文中
var xuhss = 1;
function xx(){
var xuhss =2;
console.log(1,xuhss);
}
xx();
console.log(2,xuhss);
结果如下:
解释器是如何处理这段代码:
首先解释器知道var xuhss在内存中声明了一个全局变量数组保存了xuhss,以后用的话,就到这个数组中找。
如果数组中有,就拿出来,没有就再次定义。
当看到方法时,就将方法xx放到全局变量中,当调用xx方法的时候,就进入到xx的作用域里面。声明一个方法作用域变量数组,那么在函数里面的变量就都定义在这个方法作用域变量数组中。
当打印这个变量 就现在这个作用域变量数组找,如果没找到,就到全局变量数组中找,如果都没找到,就报错:当前变量没有被定义。
退出方法后,就设置当前作用域为全局作用域。这个时候,xuhss就在全局变量数组直接查找并输出。
var xuhss = 1;
function xx(){
var xuhss =2;
xuhss=3;
console.log(1,xuhss);
}
xx();
console.log(2,xuhss);
在不是全局作用域下,没有用var定义,直接赋值:先看当前和上级作用域有没有这个变量,有就直接赋值,没有就给全局作用域定义这个变量并且赋值。
在最外层输入this,全局作用域
this =window
function xxx()
{
console.log(this);
}
// window.xxx();
this.xxx();
在局部作用域
this=调用者
location.xxx=function ()
{
console.log(this);
}
location.xxx();
this = 类自己
var aaa=1;
location.xxx=function () // 假如在这里下断点hook 没有用
{
console.log(this);
}
location.xxx();
假如我想hookxxx方法。
可以如果你在这个方法定义之前hook它,那么hook不到,因为后面它的定义会覆盖你的hook。
在定义完成的后面下断点
就可以成功hook
var aaa=1;
location.xxx=function ()
{
console.log(this);
}
zzz = function(){
console.log(this);
}
zzz()
location.xxx();
var aaa = 1;
!(function(){
var bbb=2;
var zzzz=function(){
console.log(bbb);
}
})()
var aaaaaaaaaaa=1; // 在这里下断点hook
这种情况下 不能hook到zzz,因为它在函数的作用域里面,这个时候你在全局作用域里面,就hook不到。
如果想要hook 就需要到方法作用域里面定义完成后,hook才有效
这就是为什么我们之前要用
window.xuhss = zzzz
这样就可以将这个zzzz的局部作用域 赋值给window这个全局作用域
var aaa = 1;
!(function(){
var bbb=2;
var zzzz = function(){
console.log(bbb);
}
window.xuhss = zzzz
debugger
})()
var aaaaaaaaaaa=1; // 在这里下断点hook
所以hook就是改变原方法的执行流程。
XMLHttpRequest.prototype.send_ = XMLHttpRequest.prototype.send
XMLHttpRequest.prototype.send = function(){debugger;}
当我们百度翻页的时候 就可以看到 断点hook了
就实现了xhr断点的功能。
这里讲解的只影响hook完成后的操作。
浏览器初始化进行hook 借助插件
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。