在JS逆向时如何hook属性?

admin 2026-04-16 04:46:02 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文详细讲解了在JS逆向中如何通过Object.defineProperty方法hook对象属性的技术原理与实战应用。以cookie属性为例演示了如何拦截属性的读取和设置操作,介绍了访问器描述符的使用方法,并提供了通过debugger语句或Error().stack获取调用堆栈的调试技巧。文章包含完整的代码示例和操作指导,为JS逆向工程提供了实用的技术方案。 综合评分: 85 文章分类: WEB安全,渗透测试,代码审计,逆向分析,安全工具


cover_image

在 JS逆向时如何 hook 属性?

原创

LLLibra146 LLLibra146

LLLibra146

2025年5月15日 08:02 北京

在小说阅读器读本章

去阅读

大家好,昨天讲过了如何 hook JS 中的方法,今天来讲讲如何 hook JS 中的属性。

在 JS 逆向时,比较常用的属性我第一想到的就是 cookie 了,cookie 有读取和写入两个动作,部分反爬方案就是在访问的时候先返回一个加密后的 JS,JS 会计算一个 cookie 然后重定向到首页,并且带上刚才计算出来的 cookie。如果 cookie 有效则正常显示页面,否则提示失败。下面就以 cookie 来举例,讲一下如何 hook cookie。

hook 属性

在 hook cookie 之前,先来讲一下在 JS 中如何 hook 属性。hook 属性和 hook 方法有点不一样,方法可以被重写,但是属性不行。要 hook 属性,就离不开一个方法,它就是:Object.defineProperty

image-20250514200914004

image-20250514201137882

这里只展示部分使用方式,更多内容请大家查看官方文档[1]。

hook 属性原理

hook 属性的原理其实就是重新定义属性,使用 Object.defineProperty 可以到达这个目的。

对象中存在的属性描述符有两种主要类型:数据描述符和访问器描述符。数据描述符是一个具有可写或不可写值的属性。访问器描述符是由 getter/setter 函数对描述的属性。描述符只能是这两种类型之一,不能同时为两者。在 hook 中,访问器描述符用的比较多,因为一般 hook 都是针对设置或者访问操作进行 hook。

image-20250514203536987

看文档有点枯燥,来看一个案例:

const o = {}; // 创建一个新对象

// 通过 defineProperty 使用访问器属性描述符添加对象属性的示例
Object.defineProperty(o, "b", {
get() {
      console.log('get...')
    returnthis.value;
  },
set(newValue) {
      console.log('new value:'+newValue)
    this.value = newValue;
  },
enumerable: true,
configurable: true,
});

image-20250514212217293

定义一个 o 对象,然后使用 Object.defineProperty 方法重新定义 o 对象的 b 属性,并且配置访问器属性描述符,在对应的位置打印日志。可以看到在首次访问的时候,value 的值为 undefined,设置值后可以正常获取到 b 属性的值,并且在获取和设置的时候也可以正常打印日志。

数据描述符在 hook 中用的比较少,我这里就不多解释了,大家可以自行查看文档。

hook cookie

原理讲完了,现在使用刚才学到的知识来 hook 一下 cookie 试试。

在 hook cookie 之前,要先知道 cookie 是如何使用的,查一下 MDN 的文档:

image-20250514213814601

尝试设置 cookie:

image-20250514213936308

可以正常的打印出 cookie,说明访问和获取 cookie 的用法是没错的。

下面来尝试 hook cookie 的读取和设置操作,使用以下代码:

let _cookie = document.cookie;
Object.defineProperty(document, 'cookie', {
configurable: true,
get() {
    console.log('[GET] Cookie:', _cookie);
    return _cookie;
  },
set(value) {
    console.log('[SET] Cookie:', value);
    _cookie = value;
    return value;
  }
});

先保存之前的 cookie 值,然后在设置 cookie 的时候覆盖原有的值,并且在获取 cookie 值的时候返回 cookie 即可。

image-20250514214228398

为什么这里设置了两个 cookie,但是只获取到了一个呢?上面也说过了,cookie 是一个变量,第二次设置的 cookie 覆盖了第一次的值,所以只获取到了一个。

使用一个变量值来模拟 cookie 的设置和获取,实际的 cookie 设置和获取是比较复杂的,使用单个的变量无法完全模拟 cookie 的行为,但是加上 debugger 语句用来查找 cookie 的设置和获取动作的调用位置已经足够了。

打印堆栈

如果不想使用 debugger 语句,则可以使用 new Error().stack 来获取调用堆栈,一样可以知道各个方法的调用关系。

image-20250514220418989

这样就可以在不打断点的情况下,获取到 cookie 的调用位置了。

总结

以上内容使用 cookie 作为示例演示了 hook 对象属性的方法,对于其他对象的其他属性,都可以使用这种方法来实现 hook,具体如何操作就留给大家去实战了。

注:以上内容根据我当前所了解的知识整理而成,如有疏漏或错误请大家指出,谢谢大家。

参考资料

[1]

官方文档: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

最近一直有小伙伴问我有没有交流群,为了能让大家更好的交流,我组建了一个逆向交流群,想要进群的小伙伴可以在后台点击“联系我”菜单或者扫码,添加微信并且备注“交流群”,我会拉你进群。

推荐阅读:

如何 “正确” hook JS方法

无需登录,满血版DeepSeek R1,很强!

一日一技:反爬虫的极致手段,几行代码直接炸了爬虫服务器

JS调试技巧:如何让时间和随机数“听你指挥”?

【Windows版】tcpdump + wireshark 联动 frida,实现APP无感抓取HTTPS数据包

AST 技巧:还在手动扣代码?AST技术帮你自动扣代码

AST 技巧:打印控制流混淆执行路径

JS逆向实战:加强版的 OB 混淆 AST 处理方法

alfred 使用技巧:一键自动格式化 JS 代码

JS逆向技巧:日志断点如何正确输出 JSON 而不报错

AST 技巧:如何让混淆后的 JS 变量名“好看些”


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:LLLibra146 LLLibra146 LLLibra146《在 JS逆向时如何 hook 属性?》

评论:0   参与:  0