当前位置:   article > 正文

Js逆向教程20-Hook基础_js hook入门

js 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)]

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/90571
推荐阅读
相关标签
  

闽ICP备14008679号