wasm为前端做防护,防止逆向

813 阅读2分钟

wasm为前端做防护,防止逆向

1.什么是WebAssembly

WebAssembly是什么?WebAssembly即WASM, WebAssembly是一种新的编码格式并且可以在浏览器中运行,WASM可以与JavaScript并存,WASM更类似一种低级的汇编语言。

WebAssembly(又名wasm)是一种高效的,低级别的编程语言。 它让我们能够使用JavaScript以外的语言(例如C,C ++,Rust或其他)编写程序,然后将其编译成WebAssembly,进而生成一个加载和执行速度非常快的Web应用程序。

Wasm 具有运行高效、内存安全、无未定义行为和平台独立等特点,经过了编译器和标准化团队多年耕耘,目前已经有了成熟的社区。

(网络复制)

2.为什么使用wasm

由于wasm是一种汇编语言,使得项目逆向更难逆向和破解,并且可以与js共存和兼容jsruntime,使得这个混淆方案很流行。

下图是写的demo生成的js代码,大家可以look look

3.JS混淆都有什么

目前js混淆里面比较好的防护就是下面两种

  • jsvmp
  • wasm2js

4.推荐rust编写wasm

原因是因为rust生成出来的二进制代码会比c和c++更复杂一点,去除符号更难理解,而且rust对于wasm的生态更好。

5.rust项目demo

  • 使用cargo,创建一个普通的rust项目
  • cargo.toml添加下面内容,lib作用是.wasm,profile.release作用是让二进制更小
[lib]
name = "demo"
crate-type = ["cdylib"]

[profile.release]
debug = false
debug-assertions = false
opt-level = 'z'
lto = true # "fat", "thin" true
codegen-units = 1
incremental = false
overflow-checks = false
panic = 'abort'
rpath = false
strip = true
  • lib.rs编写一些签名算法或者加解密
// 结论,返回值尽量用String
#[wasm_bindgen]
pub struct Result {
    status: bool,
    sig: String,
}

#[wasm_bindgen]
impl Result {
    #[wasm_bindgen(getter)]
    pub fn status(&self) -> bool {
        self.status
    }
    #[wasm_bindgen(getter)]
    pub fn sig(&self) -> String {
        self.sig.clone()
    }
}

// 算法
// data: 数据
#[wasm_bindgen]
#[inline(always)]
pub fn sig(data: String) -> Result {
   return Ant { status: true, sig: data };
}
  • 运行下面命令 编译生成wasm
rustup run nightly wasm-pack build --release --no-pack --no-typescript --target web --out-dir target/pkg
  • 编译完后就可以在target/pkg获取到demo_bg.wasm和demo.js,怎么使用大家还是去系统学习一下
  • 接下来就是把wasm转换成js文件,运行下面代码
wasm-opt -Oz --strip-debug -o target/pkg/demo_bg_1.wasm target/pkg/demo_bg.wasm
wasm2js -O4 --strip-debug --optimize-level=3 --shrink-level=2 -o target/pkg/demo_bg.js target/pkg/demo_bg_1.wasm
  • 运行完之后一共有两个js文件,demo.js和demo_bg.js,核心在于demo_bg.js
  • 自己的项目根据demo.js去重新加载demo_bg.js
  • 剩下的内容就不公开了,后面会做一期更详细的,然后把项目发到github