• Js逆向教程20-Hook基础


    Js逆向教程19-Hook基础

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8mKcxbJk-1670250148241)(Js逆向教程19-Hook基础.png)]

    一、jshook

    Hook就是在这些流程任意环节插入自己的代码,让浏览器先执行自己的代码 然后再执行原本网站的

    hook在以下流程中可以做的事情:

    1.1 html流程

    1. 联机服务器:获取ip地址,ws获取参数
    2. 拿回资源:动态修改html代码
    3. 渲染或者解析资源:可以判定渲染的是什么

    1.2将js代码的执行流程:

    hook在以下流程中可以做的事情

    1. 初始化:修改window常见的浏览器环境变量:Location.href window.atob都可以被修改。就可以方便定位函数
    2. 页面逻辑:有可能在js内部函数中实现。改变作用域
    3. 等待用户输入:修改事件监听
    4. 加密数据:修改加密数据,拿到明文参数
    5. 提交数据:对提交的数据进行修改

    1.3 作用域

    上下文:表示一个环境(js上下文就是v8引擎,浏览器是不同的页签就是不同的上下文,js中的eval还是在一个上下文。只是虚拟机、)

    作用域:控制变量所生效的位置。作用域是更小的一个级别 处于上下文中

    var xuhss = 1;
    
    function xx(){
    	var xuhss =2;
    	console.log(1,xuhss);
    }
    xx();
    console.log(2,xuhss);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    结果如下:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0LQaUtd3-1670250148242)(02 - 副本.assets/image-20221201200022316.png)]

    解释器是如何处理这段代码:

    首先解释器知道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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在不是全局作用域下,没有用var定义,直接赋值:先看当前和上级作用域有没有这个变量,有就直接赋值,没有就给全局作用域定义这个变量并且赋值。

    二、this指向问题

    2.1 全局作用域

    在最外层输入this,全局作用域

    this =window
    
    • 1

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BR262iN4-1670250148243)(02 - 副本.assets/image-20221205191011142.png)]

    function xxx()
    {
    	console.log(this);
    }
    // window.xxx();
    this.xxx();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.2 局部作用域

    在局部作用域

    this=调用者
    
    • 1
    location.xxx=function ()
    {
    	console.log(this);
    }
    
    location.xxx();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.3 类下面

    this = 类自己
    
    • 1

    三、如何正确HOOK断点

    3.1 未定义下断点

    var aaa=1;
    location.xxx=function () // 假如在这里下断点hook 没有用
    {
    	console.log(this);
    }
    
    location.xxx();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    假如我想hookxxx方法。

    可以如果你在这个方法定义之前hook它,那么hook不到,因为后面它的定义会覆盖你的hook。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cK3tSe5l-1670250148244)(02 - 副本.assets/hook.gif)]

    3.2 定义完成后面下断点

    在定义完成的后面下断点

    就可以成功hook

    var aaa=1;
    location.xxx=function () 
    {
    	console.log(this);
    }
    
    zzz = function(){
    	console.log(this);
    }
    zzz()
    
    
    location.xxx();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1bb7b6tr-1670250148244)(02 - 副本.assets/image-20221205193625177.png)]

    3.3 自执行函数里面下断点

    var aaa = 1;
    !(function(){
    	var bbb=2;
    	var zzzz=function(){
    		console.log(bbb);
    	}
    })()
    
    var aaaaaaaaaaa=1; // 在这里下断点hook
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    这种情况下 不能hook到zzz,因为它在函数的作用域里面,这个时候你在全局作用域里面,就hook不到。
    如果想要hook 就需要到方法作用域里面定义完成后,hook才有效

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HFbGLPWp-1670250148245)(02 - 副本.assets/image-20221205194946475.png)]

    这就是为什么我们之前要用

    window.xuhss = zzzz
    
    • 1

    这样就可以将这个zzzz的局部作用域 赋值给window这个全局作用域

    var aaa = 1;
    !(function(){
    	var bbb=2;
    	var zzzz = function(){
    		console.log(bbb);
    	}
    	window.xuhss = zzzz
    	debugger
    })()
    
    var aaaaaaaaaaa=1; // 在这里下断点hook
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    所以hook就是改变原方法的执行流程。

    四、用Hook的方式实现xhr断点

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hGTc1RRg-1670250148246)(02 - 副本.assets/image-20221205200154471.png)]

    XMLHttpRequest.prototype.send_ = XMLHttpRequest.prototype.send
    XMLHttpRequest.prototype.send = function(){debugger;}
    
    • 1
    • 2

    当我们百度翻页的时候 就可以看到 断点hook了

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nj0p7JAZ-1670250148247)(02 - 副本.assets/image-20221205200644923.png)]

    就实现了xhr断点的功能。

    五、hook的时机

    这里讲解的只影响hook完成后的操作。

    浏览器初始化进行hook 借助插件

    • 油猴:是通过监听浏览器接收数据的方法hook
    • fd:通过代理的方式hook

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ed1QDWHX-1670250148247)(02 - 副本.assets/image-20221205201118121.png)]

  • 相关阅读:
    【JS】BMI身体质量指数计算工具
    (附源码)springboot基于微信小程序的超市收银系统 毕业设计 271611
    GIS实战应用案例100篇(七十九)-多规整合底图的制作要点
    Transformer8
    VPS2103 电流模式 PWM 控制器 4-50V IN /90V/0.1Ω功率管
    Python:乘积尾零
    SLM2110 600V 2A 逆变电源专用芯片替代IR2110S 移动储能解决方案
    【Python】Python 查询图片EXIF信息,获取地理位置
    如何简单上手清华AutoGPT并搭建到本地环境
    C++实现基于自动机的句子分词程序
  • 原文地址:https://blog.csdn.net/huangbangqing12/article/details/128194531