@ismailnakkar / vite-obfuscator
一个插件,用于混淆所选条目的块 javascript-obfuscator,可以选择
通过其Pro VM运行标记的函数,并且在受保护的代码发布时构建失败
可读,否则VM标记将丢失或移动。
安装
npm i -D @ismailnakkar/vite-obfuscator
8 .和 javascript-obfuscator 5.8.1+是对等体。虚拟机需要进行模糊处理。io Pro API令牌。
使用
import obfuscator from '@ismailnakkar/vite-obfuscator';
import {defineConfig} from 'vite';
export default defineConfig({
plugins: [
process.env.OBFUSCATE === 'true' && obfuscator({
include: ['src/widget/index.js', 'src/widget/embed.js'],
islandRoots: ['src/widget'],
apiToken: process.env.OBFUSCATOR_API_TOKEN ?? '',
vmObfuscation: true,
}),
],
});
如上所述,将其闸门跳过;Vite忽略一个虚假的插件。
当一个块至少有一个条目到达它时,它就会被混淆 每一个 到达它的条目是in
include. 一个 islandRoots 仅绑定到可读块中的模块在构建时失败。
当几个HTML页面加载相同的脚本时,Vite删除每个页面自己的块,以便页面匹配
没有条目。将该脚本添加到 build.rolldownOptions.input 和 include.
| 选项 | 默认的 | |
|---|---|---|
include | 要求 | 写入的条目源路径 vite.config,不是条目名,不是 ./. 作为整段后缀匹配的: 'app.js' 每一个匹配 app.js 条目。 |
islandRoots | 要求 | 要保护的代码目录,相对于Vite的目录 root. |
vmObfuscation | false | 通过Pro虚拟机运行标记的功能。如果出现以下情况,则构建失败 apiToken 是空的。 |
apiToken | '' | Pro API令牌。忽略不 vmObfuscation. |
vmObfuscationThreshold | 1 | VM。锁定在0-1。 |
timeout | 上游的 | VM。Pro API请求超时(毫秒)。 |
version | 最新的 | VM。Pro API运行的混淆器版本。 |
rehash | true | 以其新字节的散列重命名每个混淆块。 false 用于在固定URL上提供的脚本。 |
maxGzipBytes | 0 | 当被混淆的块压缩到超过此值的字节数时,构建失败。 0 是关闭的;每个块的原始大小和gzip大小都会被记录下来。 |
optionsPreset | 'high-obfuscation' | javascript-obfuscator 预设,在插件自己的设置下。 |
overrides | {} | javascript-obfuscator 选项,最后合并。 |
high-obfuscation 打开 debugProtection (一个4000毫秒调试器循环)和 disableConsoleOutput.
用 overrides: {debugProtection: false, disableConsoleOutput: false}.
VM标志
在函数上方的行上用法律注释标记一个函数:
/*! javascript-obfuscator:vm */
export function detect() { … }
一个标记可以作为函数声明的前导 const/let/var 握着一个函数或箭头
函数、方法的导出、对象属性或包含一个方法的类字段。这些都是
插件接受的位置,而不是针对Pro VM验证的位置。有标记的模块可以
外 islandRoots.
插件集 build.rolldownOptions.output.comments 来 {legal: true} 所以标记存活了下来
缩小;以后的插件不能覆盖它。构建仍然可以移动一个标记:
- 光交叉连接 (默认的minifier)在a上移动1
const/let/var; - 要简洁 内联一个被调用一次的标记函数;
- 利差无论是否缩小,都可以内联一次性对象并移动其属性标记。
标记函数声明,oxc和Rolldown将其保留。用简洁,还是留记号
在 const/let/var,设置 build.minify: false 并减少插件没有的块
在你自己的插件中混淆。
当在源和块之间丢失标记时,构建失败,没有导致自己的功能,或者
标记在声明的地方导出函数(export function f, export const f =)那是
tree-shaken。未检测到:标记落在未标记的函数上,无论minifier是否移动了它
或者删除了标记的函数,但没有在声明的地方导出它。删除已标记的函数
停止使用。
构建失败
在写入任何内容之前,每次检查都会使构建失败,并显示一条指定原因的消息。两个 需要更多:
… bundled but NOT obfuscated:将导入条目添加到include,或将模块移出islandRoots.… is in an import cycle between obfuscated chunks打破这个循环。
输出
进口商,每一次排放 .html,和 build.manifest, build.ssrManifest 和
build.chunkImportMap 文件被重写为重新命名的名称。混淆块的源映射为
加上一个警告:它 sourcesContent 将发送可读的代码。
该插件以后顺序运行 generateBundle,所以你自己的正常顺序是可读的
块。
轻快地清空 outDir 在此运行之前:with emptyOutDir 因此,就地构建不提供任何资产
在整个过程中(使用虚拟机的时间为几分钟),并在出现故障后将该目录清空。构建成
另一个目录并交换它,或者设置 build.emptyOutDir: false 自己修剪陈旧的资产。
测试
插件只运行在 vite build,所以应用测试不需要伪造或设置。这个包的套件:
npm test.
升级
从4.倍
5.0忽略这些选项(TypeScript将它们报告为多余属性);删除:
enable剩下的人enable: false现在混淆。将调用改为Gate(参见 使用)。vmTargetFunctionsMode,vmTargetFunctions,vmExcludeFunctions:用/*! javascript-obfuscator:vm */,现在是唯一的模式。overrides仍然到达上游的根 模式,无保护,并且只有带有标记的块到达虚拟机。mustContain:按正常顺序检查chunk内容generateBundle你自己的。