
公司想尝试用 wasm 作为 js 代码保护的一种方式
如果确实不可行请敲醒我,我知道 wasm 本身不应该是这么用的
目前试了一下: https://github.com/Shopify/javy
按照他的教程编译后用 wasmtime 确实可以运行,但是用 JS 的 WebAssembly 接口调用就会报错:
WebAssembly.instantiateStreaming(fetch("xxxxxxx/index.wasm"), { wasi_snapshot_preview1: { fd_close: (e) => { console.log("fd_close", e); }, fd_write: (e) => { console.log("fd_write", e); }, fd_read: (e) => { console.log("fd_read", e); }, fd_seek: (e) => { console.log("fd_seek", e); }, environ_get: (e) => { console.log("fd_environ_get", e); }, environ_sizes_get: (e) => { console.log("fd_environ_sizes_get", e); }, clock_time_get: (e) => { console.log("clock_time_get", e); }, fd_fdstat_get: (e) => { console.log("fd_fdstat_get", e); }, proc_exit: (e) => { console.log("proc_exit", e); }, }, env: {}, }).then((obj) => { console.log(obj.instance.exports.main({ n: 100, bar: "test" })); }); RuntimeError: unreachable at xxxxxxx/index.wasm:wasm-function[193]:0x110ec at xxxxxxx/index.wasm:wasm-function[318]:0x1a4fc at xxxxxxx/index.wasm:wasm-function[28]:0x1489 at xxxxxxx/index.wasm:wasm-function[88]:0x728f at xxxxxxx/index.wasm:wasm-function[57]:0x38ab at xxxxxxx/index.wasm:wasm-function[287]:0x18880 at xxxxxxx/index.wasm:wasm-function[39]:0x1cb6 at xxxxxxx/index.wasm:wasm-function[193]:0x11422 at xxxxxxx/index.wasm:wasm-function[318]:0x1a4fc at xxxxxxx/index.wasm:wasm-function[28]:0x1489 1 mxT52CRuqR6o5 2022-09-19 11:53:50 +08:00 理论上没觉得哪里有问题,而且用 wasm 加密是一个很正常的用法 |
2 lmshl 2022-09-19 12:20:58 +08:00 via iPhone 不存在的 唯一最接近的是 AssemblyScript ,是一个 typescript 子集,限制了 ts 动态能力的语言。 如果确实有必要,可以考虑将系统核心逻辑用 rust 编写,比如抢红包或下单前的检查,签名生成等,最后在中调用这部分逻辑。 或者简单点,找个混淆器把 js 混淆一遍也够了 |
3 nomagick 2022-09-19 12:26:30 +08:00 在浏览器运行的代码有啥好保护的,敝帚自珍 移除一下注释和换行,加密好了 |
4 wdwwtzy 2022-09-19 12:29:59 +08:00 |
6 taowen 2022-09-19 14:39:28 +08:00 可以用 webassembly 编译一个 quickjs ,类似 https://github.com/taowen/define-function/blob/main/build.sh 然后用 https://openkraken.com/guide/advanced/use-quickjs-bytecode 把 js 转成 bytecode |
7 jones2000 2022-09-19 14:47:15 +08:00 用 c++写呗, 门槛高, 卷的人也少,做 ppt 的时候,这个功能还是一个亮点可以吹。 |
8 qrobot 2022-09-19 14:56:00 +08:00 思路很新奇, 但是反编译 wasm 难吗? 直接 wasm-decompile 反编译, 甚至比 js 的可读性还高 |
9 0o0O0o0O0o 2022-09-19 15:21:22 +08:00 via iPhone 如果公司就是想探索这方面,为了应付差事,可以考虑#6 的方案,不过最好修改一下 quickjs 的 opcode 。 因为最近分析过一个挺大的 wasm 应用,unity 编写 il2cpp 后再编译成了 wasm ,个人感觉,将足够复杂的 c/cpp 编写的运行时编译为 wasm 目前在保护方面还是很有用的。而且可以结合 c/cpp 的一些传统保护思路来做。 |
10 DingJZ 2022-09-19 15:46:03 +08:00 |
11 0o0O0o0O0o 2022-09-19 16:04:52 +08:00 via iPhone |
12 HFX3389 2022-09-19 16:52:02 +08:00 @0o0O0o0O0o #11 就怕前端代码保护的是:以下内容需要关注公众号回复“密码”,获取密码后才能继续观看;登录后可见 |
13 YuJianrong 2022-09-19 23:18:15 +08:00 #6 题主引用的这个“javy”就是基于 quickjs 的。 用于保护源代码也不是不行,不过从性能上看这样跑的 JS 慢了成百上千倍,还有一些本来其他虚拟机没有的问题(比如 quickjs 是用引用计数的,会循环引用造成泄漏)。quickjs 这个方案主要是用于在一个 JS 环境中安全地运行第三方的 JS 代码,不是用于加密客户端代码的。 现代 JS 工具链(比如 webpack+terser )会把几乎所有的可读函数名、变量名全部改掉并精简代码,可读性几乎为 0 了,用另一个虚拟机只是能更大程度增加破解困难度而已。 |
14 DingJZ 2022-09-20 12:07:00 +08:00 @0o0O0o0O0o #11 离谱,之前没看过前面这些,包括这个贴下面的评论,很好玩。 昨天看了一篇文章,找不到原文了,讲近两年前端的分享大会之类的,听众的想法都是这做的是啥,又 tm 用不到,我没有场景。 不如只关注技术,好玩最重要。 |
15 seakingii 2022-09-20 13:11:07 +08:00 推荐用其它语言,比如 RUST,GO,C#写 WASM 供 Javascript 调用,这些方案成熟点 用 JS 写 WASM 我倒是没怎么见过 |
16 humbass 2022-09-23 15:09:58 +08:00 按 OP 的说法,如果是为了保护代码,在 NODEJS 这边可以直接使用 V8 的虚拟机保护。只要指定 node 版本就可以了,浏览器的话只能使用 WASM 方案了,核心的逻辑部分改成 TS 写,就可以直接编译为 WASM 。 |