一、hook的作用区域

    1、客户端的过程

        链接服务器
        拿回资源
        渲染(解析资源)资源
        初始化(自执行)
        页面逻辑
        等待用户输入
        加密数据
        提交数据

    2、hook的本质  

        在这些流程任意环节中插入自己的代码,让浏览器限制性自己的代码,然后再执行原本的网站代码。

        ①:链接服务器  hook能拿到服务器的IP地址,wss的话能后拿到向服务器发送前的参数

        ②:.拿回资源    hook能修改拿回的资源.

        ③:渲染    hook能够判定想渲染的东西

        ④:js初始化 hook能够修改windows的常见变量   浏览器的环境变量   loction.href    window.atob,    window.btoa

        ⑤:页面逻辑   在js 的某些内部函数写的    所以会有自己的作用域   作用域->变量生效的位置

        ⑥:等待用户输入    hook  拿到用户输入 ~ =  事件断点.

        ⑦:加密数据 hook      拿到明文参数和加密后的参数

二、hook基础

    1、上下文

        ①:同一个一个环境(js 中的v8虚拟机)

        ②:浏览器中 不同的新页面就是一个新的环境

        ③:但是js中使用eval执行虽然开了一个新的v8虚拟机,但是还是同一个上下文。

        ④:新的线程 webwork  v8虚拟机是开了多个的v8虚拟机,但是在浏览器看来是一个上下文

    2、变量的作用域(生命周期)

        

        ①:在同一个上下文环境中。

        ②:因为javascript是一个弱类型语言,所以在重复定义一个变量的时候不会报错,并且可以在定义变量的时候修改变量的被赋的值

        

            var zhiyuan = 1;
var zhiyaun = function(){
var zhiyuan = 2;
return zhiyaun
} //不会报错,控制台输入zhiyua 对输出对应函数体,输入zhiyuan()返回2

        ③:解释器执行流程(其实和其他的语言差不多),声明一个全局作用域变量和数组

        

                var zhiyuan = 1;
var zhiyaun = function(){
var zhiyuan = 2;
return zhiyaun ;
}
zhiyuan = 3
//解释器
var glArr = {}
glArr.zhiyuan = 1;
glArr.zz = “CODE”
//执行方法(glArr.zz);
//进入方法作用域
//声明一个“glArr.zz”方法作用域变量数组
glArr.zz.Arr = {}
glArr.zz.Arr.zhiyuan = 2;
//输出的时候取当前作用域的值,如果当前没有,那么去上一个作用域找。
//如是果一直没找到,那么就报错not defind
//退出方法
//设置当前作用域"Arr"
//然后再取当前的作用域

        ④:在不是全局作用域下  如果赋值语句没有使用var定义而直接赋值.

  

                var zhiyuan = 1;
var zhiyaun = function(){
var zhiyuan = 2;
zhiyuan1 = 2;
return zhiyaun ;
}
zhiyuan = 3

      3、this指向问题

        ①:全局作用域 this = window

        ②:在方法作用域(局部作用域) this = 调用者

        ③:在类(对象)的方法里面        this = 类自己

        ④:在所有方法下,只要this没有调用者,那么就是执行window

      

            function  xxx(){
console.log(this);
}
xxx();

三、hook实例

    1、网页中的js代码

        var = 1
loction.xxx = function(){
console.log(this);
} zzz = function(){
console.log(this);
}
zzz();
loction.xxx();

    2、hook方法

      如果在console中重新定义
      loction.xxx(){}
      这样并没有效果,因为当页面中的js代码再次被执行的时候就会再次定义xxx();

      所以在xxx()函数运行后,被调用前来进行hook可以hook到
      即在zzz处打断点,然后控制台重新定义xxx()

    3、自执行

    !(function(){
var bbb = 2;
var zzz = function(){
console.log(bbb)
}
var rrr = 1;
})()
var aaa = 111

    在var aaa 处打断点不能hook
    所以应该在自执行中,函数执行完,没被调用的时候hook
    所以断点打在 var rrr = 1

四、hook本质

    改变原方法或源代码执行流程

    1、覆盖原方法 

    2、ES6的语法

            Object.defineProperty

              给对象重新定义属性
              能够监听属性的设置值和获取值
            js Proxy
              给对象整体监听
              属性初始化
              属性的设置值和获取值
              构造函数相关的

    3、实例

            hook 发包 实现xhr断点的功能
            首先找到发包所在的函数
            XMLHttpRequests.prototype.send
            然后我们保存其原来的值
            XMLHttpRequests.prototype.send_ = XMLHttpRequests.prototype.send;
            然后我们对XMLHttpRequests.prototype.send改值
            XMLHttpRequests.prototype.send = function(){debugger;}
            然后进行翻页,就hook到了
            此例子是在刷新之后hook到的

    (function(){
"use strict";
var cooikeTemp = "";
Object.defineProperty(document,"cookie",{
set: function(val){
if (val.indexOf("v="))
console.log("hook捕获到cookie设置",val);
cookieTemp = val;
return val;
},
get: function()
{
return cookieTemp;
}
});
})();

     4、hook时机

        ①:一般只影响hook完成后的操作

        ②:整个浏览器初始化想进行hook,那么需要插件(油猴)

        ③:插件(油猴(浏览器插件监听接收数据的方法)、FD插件(代理的方式)修改原数据)

        ④:如果不想使用插件:首先找到最先运行的js文件,格式化,然后在第一行下断点,然后再在控制台进行手动hook(这样会导致插入的位置不确定)

        5、应用

          对于不好调试的函数,就可以使用hook进行。或者用来hook变量,扣js代码的时候作为函数的返回值

hook详解和应用的更多相关文章

  1. 【转】Android Hook框架Xposed详解

    1 Introduction 1.1  概述 Xposed 是 GitHUB 上 rovo89 大大设计的一个针对 Android 平台的动态劫持项目,通过替换 /system/bin/app_pro ...

  2. Android逆向之旅---Native层的Hook神器Cydia Substrate使用详解

    一.前言 在之前已经介绍过了Android中一款hook神器Xposed,那个框架使用非常简单,方法也就那几个,其实最主要的是我们如何找到一个想要hook的应用的那个突破点.需要逆向分析app即可.不 ...

  3. Android Hook框架Xposed详解

    1 Introduction 1.1  概述 Xposed 是 GitHUB 上 rovo89 大大设计的一个针对 Android 平台的动态劫持项目,通过替换 /system/bin/app_pro ...

  4. 服务器.htaccess 详解以及 .htaccess 参数说明(转载)

    htaccess文件(或者”分布式配置文件”)提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录.作为用户,所能使用的命令受到限 ...

  5. iOS开发——高级特性&Runtime运行时特性详解

    Runtime运行时特性详解 本文详细整理了 Cocoa 的 Runtime 系统的知识,它使得 Objective-C 如虎添翼,具备了灵活的动态特性,使这门古老的语言焕发生机.主要内容如下: 引言 ...

  6. jquery的css详解(二)

    jq的工具方法style用于设置样式,jq的实例方法css在设置样式时就是调用的它,接下来分析一下源码. jQuery.extend({ ............................ st ...

  7. jquery的css详解(一)

    通过阅读源码可以发现css是jq的实例方法.而在内部调用jq的工具方法access来实现的,对该方法不了解的朋友请点击 -> jquery工具方法access详解 在access的回调中做了一个 ...

  8. .htaccess详解及.htaccess参数说明【转】

    目录(?)[-] htaccess 详解 htaccess rewrite 规则详细说明 RewriteEngine OnOff RewriteBase URL-path RewriteCond Te ...

  9. Tomcat服务器原理详解

    [目录]本文主要讲解Tomcat启动和部署webapp时的原理和过程,以及其使用的配置文件的详解.主要有三大部分: 第一部分.Tomcat的简介和启动过程 第二部分.Tomcat部署webapp 第三 ...

  10. iptables 详解

    一:前言   防火墙,其实说白了讲,就是用于实现Linux下访问控制的功能的,它分为硬件的或者软件的防火墙两种.无论是在哪个网络中,防火墙工作的地方一定是在网络的边缘.而我们的任务就是需要去定义到底防 ...

随机推荐

  1. k8s上安装安装 Ingress Controller &卸载

    在 master 节点上执行 nginx-ingress.yaml文件内容 # 如果打算用于生产环境,请参考 https://github.com/nginxinc/kubernetes-ingres ...

  2. Prometheus与服务发现

    这种按需的资源使用方式对于监控系统而言就意味着没有了一个固定的监控目标,所有的监控对象(基础设施.应用.服务)都在动态的变化.对于Prometheus这一类基于Pull模式的监控系统,显然也无法继续使 ...

  3. Fluentd部署:如何监控Fluentd

    监控的目的是确保日志采集能稳定高效运行. Fluentd内部运行指标 Fluentd内部保存着一些运行指标,这些指标可通过REST api直接获取,也支持通过第三方工具,如Prometheus,来访问 ...

  4. 生产管理ERP哪一款比较好?

    生产管理用的是MES,企业管理用的才是ERP,这个得弄清楚!如果要谈生产管理,每家工厂的区别.差异性更大,在工厂甲用得很好的管理系统搬到工厂乙,大概率水土不服,不是软件本身的问题,而是生产的产品.部件 ...

  5. Java之POI导出Excel(二):多个sheet

    相信在大部分的web项目中都会有导出导入Excel的需求,之前我也写过一篇导出单个sheet工作表的文章,没看过的小伙伴可以去看哈,链接也给大家放出来了:导出单个sheet 但是在我们日常的工作中,需 ...

  6. NOIP 2013 洛谷P1966 火柴排队 (树状数组求逆序对)

    对于a[],b[]两个数组,我们应选取其中一个为基准,再运用树状数组求逆序对的方法就行了. 大佬博客:https://www.cnblogs.com/luckyblock/p/11482130.htm ...

  7. leetcode刷题记录之25(集合实现)

    题目描述: 给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表. k 是一个正整数,它的值小于或等于链表的长度.如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原 ...

  8. Java 求解自幂数(水仙花数)

    什么是自幂数 如果在一个固定的进制中,一个 n 位自然数等于自身各个数位上数字的 n 次幂之和,则称此数为自幂数. 例如:在十进制中,153 是一个三位数,各个数位的3次幂之和为 1^3+5^3+3^ ...

  9. Linux学习记录---(1、基本命令)

    文章目录 1 .基本命令 1.1.查看当前文件夹下的文件 1.2.进入某一个文件夹 1.3.一次进入多个文件夹 1.4.返回上一级 1.5.直接进入根目录 1.6.创建一个目录 2.Redis中的相关 ...

  10. 一天五道Java面试题----第八天(怎么处理慢查询--------->简述Myisam和innodb的区别)

    这里是参考B站上的大佬做的面试题笔记.大家也可以去看视频讲解!!! 文章目录 1.怎么处理慢查询 2.ACID靠什么保证的 3.什么是MVCC 4.mysql主从同步原理 5.简述Myisam和inn ...