首页
社区
课程
招聘
[原创]JS 盾(JS DUN PROTECT)加固小记
发表于: 2天前 936

[原创]JS 盾(JS DUN PROTECT)加固小记

2天前
936

作者: 人生导师
日期: 2025 年 6 月

结论先说:JS盾的设计思路很强——双层动态代码执行、VM指令集覆盖完整、虚拟方法表(X.$)的设计在国内JSVMP里算独一档。但它的强度核心在于膨胀而非精巧:13000+行的JSVMP、层层嵌套的短路混淆、壳产出的运行时检测代码。追了两天,摸清了整体结构,结论是除非有明确的业务需求,不要对抗这个东西,非常非常浪费生命。

下面从头拆。

测试代码很简单,就一段 console.log

加固产物膨胀得巨大,字节码满天飞,调用链乱成一锅粥。不过正因为源码简单,加固后不至于难上天际,正好拿来摸清整体结构。

VSCode 直接报废——括号全乱,格式化不可信,甚至直接报错。最后用 Vim 手动看。搞完 AKM 之后有个经验:对混淆严重的代码,先看括号闭合状态,看的是结构而不是变量名。

扣了一个小时后发现,这个加固不能按之前阿卡迈那种逐行扣法来搞。必须先通读一遍,理解整体结构,然后才能逐块分析。

整个文件是一个 eval 包裹的立即执行函数:

eval 里的函数 r 接收两个参数:n(字节码)和 Z(始终为 undefined,用于短路判断)。整个函数体就是一条 return 语句——用 &&|| 短路运算串起来的超长表达式链。

这条链按执行顺序做了三件事:

两轮 VM 之间的衔接点长这样:

拆开看:

这种 && 0 || expr 的写法在整个文件里到处都是。本质就是「先执行副作用,再跳到下一个表达式」——把顺序语句伪装成了一条表达式。

这是我目前没见别家用过的手法,也是整个加固里最有价值的部分。

这三行代码构造了一个数组,充当 VM 的操作原语表(vtable)。表里的每一项对应一个底层操作:

这个设计分三层来理解。

数组构造过程中有个前置副作用:

JS 函数本质是对象,可以挂任意属性。这里用字符串 key 把真实的函数引用藏了起来——你用 Object.keys 遍历根本看不到。

调度器里的核心表达式:

展开执行过程:

两层 .call 绕了一圈,本质就是 func.call(thisArg, ...args)。但静态分析工具看到的是 X.$[1][X.$[0]](...)——完全没法推断出实际调用了什么。

调度器通过参数 r 选择目标函数:

r 不是普通参数,而是函数 opcode。整个 VM 的栈操作和函数调用全部收敛到 X.$[8] 这一个入口。

破坏 AST 可读性:没有任何直接函数调用,全部变成数组索引访问加间接 call。AST 分析工具基本废了——它看到的是属性访问和函数调用,但完全不知道调用目标是什么。

统一执行入口:所有底层操作走一个调度器,方便做 hook 检测。如果有人 hook 了 pushcall,调度器层面可以感知到异常。

opcode 化:JS 的原生方法被编号成指令,跟 VM 的字节码指令集在同一个抽象层级。整个执行流都在 VM 的控制之下,没有逃逸到外部。

第二天的重心放在了壳的机制上。JS盾的壳跟 Android 加固的思路很像,只不过不需要 mmap 去开空间——JS 里直接 Function 构造器搞定。

整体流程:

我用模型辅助补了一下环境(documentnavigatorlocation 等),解密产物可以在 Node 上跑了。补环境的代码大概长这样:

补环境这块不算难——缺什么补什么,配合模型很快。

壳解密出来的 JSVMP 代码,格式化后 24000 行(原始 13000 行),是我见过最大的 JSVMP。

见过第一天的 VM 结构和 X.$ 设计之后,已经能判断这块的本质:用膨胀换安全。opcode 足够多、调用链足够乱、字节码足够长——但设计上没有超出第一天看到的那套框架。只是量变,不是质变。

所以没深入追。一些字符串可以通过 AST 直接看到明文。花时间进去能扣出来,但性价比太低。如果有业务需求——比如要过某个用了 JS盾的站的协议——那另说。纯研究角度,不值得。

这里有个坑:代码格式化后会触发壳的检测逻辑,导致拒绝执行。所以如果想自动化处理,要么不格式化直接补环境跑,要么自己写一个可靠的反混淆器(这条路的成本远超预期)。

拆完之后想了一下:如果让我自己实现一个类似的保护方案,应该怎么分层递进?以下是整理后的思路。

目的是熟悉代码隐藏→恢复→执行的完整流程。不涉及 VM。

支持几十条基础指令:

把简单 JS 编译成自己的字节码,再写解释器执行。到这一步就能理解「VM 怎么把 JS 变成字节码再执行回来」。

在第二阶段的基础上增加随机化:


[内核课程]《Windows内核攻防实战》!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。

最后于 1天前 被一只鸭子编辑 ,原因: 更新内容
收藏
免费 16
打赏
分享
最新回复 (5)
雪    币: 20
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
你的帖子非常有用,感谢分享!
1天前
0
雪    币: 158
活跃值: (5021)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
学习
1天前
0
雪    币: 289
活跃值: (130)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
感觉写的好水,好像说了什么内容但是又没说什么东西
1天前
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
5
学习
18小时前
0
雪    币: 104
活跃值: (8829)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
tql;
13小时前
0
游客
登录 | 注册 方可回帖
返回