WASM反编译,WASM逆向

腾讯安全中心的一个"码上种树"活动里遇到了一道题,用的是WebAssembly。
放一个测试的wasm地址:test.wasm

之前没有接触过,上网查了一下之后发现都是通过wabt(WebAssembly二进制工具包)中的wasm2c进行转换:
在线转换地址

转换结果:

(module
  (type $t0 (func (param i32 i32) (result i32)))
  (import "Math" "min" (func $Math.min (type $t0)))
  (import "Math" "max" (func $Math.max (type $t0)))
  (func $Run (type $t0) (param $p0 i32) (param $p1 i32) (result i32)
    (local $l2 i32) (local $l3 i32) (local $l4 i32) (local $l5 i32) (local $l6 i32) (local $l7 i32)
    local.get $p0
    local.set $l2
    i32.const 10
    i32.const 1
    i32.sub
    local.tee $l4
    if $I0
      loop $L1
        local.get $l2
        local.set $l3
        i32.const 0
        local.set $l6
        i32.const 10
        local.set $l7
        loop $L2
          local.get $l3
          i32.const 10
          i32.rem_u
          local.set $l5
          local.get $l3
          i32.const 10
          i32.div_u
          local.set $l3
          local.get $l5
          local.get $l6
          call $Math.max
          local.set $l6
          local.get $l5
          local.get $l7
          call $Math.min
          local.set $l7
          local.get $l3
          i32.const 0
          i32.gt_u
          br_if $L2
        end
        local.get $l2
        local.get $l6
        local.get $l7
        i32.mul
        i32.add
        local.set $l2
        local.get $l4
        i32.const 1
        i32.sub
        local.tee $l4
        br_if $L1
      end
    end
    local.get $l2)
  (export "Run" (func $Run)))

用wasm2c转换之后还是比较复杂,看了WebAssembly官方文档之后发现了一个工具可以转换成可读性更好的伪代码:
wasm-decompile

通过wabt工具库编译出的wasm-decomplie进行转换,清晰多了

./wabt/bin/wasm-decompile test.wasm -o test.o
import function Math_min(a:int, b:int):int;
import function Math_max(a:int, b:int):int;
export function Run(a:int, b:int):int {
  var c:int = a;
  var e:int = b - 1;
  if (e) {
    loop L_b {
      var d:int = c;
      var g:int = 0;
      var h:int = 10;
      loop L_c {
        var f:int = d % 10;
        d = d / 10;
        g = Math_max(f, g);
        h = Math_min(f, h);
        if (d > 0) continue L_c;
      }
      c = c + g * h;
      e = e - 1;
      if (e) continue L_b;
    }
  }
  return c;
}

感谢阅读!欢迎关注微信公众号”混沌前端“,获取推送更新。

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
WebAssembly(Wasm)可以与FFmpeg集成,以在网页中进行视频处理和编解码操作。通过结合Wasm和FFmpeg,您可以在浏览器中实现强大的视频处理功能,如转码、剪辑、水印添加等。 以下是使用Wasm和FFmpeg进行视频处理的一般步骤: 1. 获取FFmpeg的Wasm版本:首先,您需要获取FFmpeg的Wasm版本。有一些项目在GitHub上提供了编译好的Wasm版本,您可以从这些项目中获取FFmpeg的Wasm文件。 2. 加载Wasm模块:将FFmpeg的Wasm文件加载到您的网页中。您可以使用JavaScript的WebAssembly API来加载和实例化Wasm模块。 3. 初始化FFmpeg:在Wasm模块加载完成后,您需要通过调用FFmpeg的初始化函数来初始化FFmpeg环境。这通常涉及到设置输入输出流、注册解码器和编码器等操作。 4. 执行视频处理操作:一旦FFmpeg成功初始化,您可以使用FFmpeg提供的各种函数执行视频处理操作。例如,您可以调用解码函数将视频解码为原始帧数据,然后对帧数据进行处理,最后调用编码函数将处理后的帧数据编码为目标视频格式。 5. 输出处理结果:根据您的需求,您可以将处理后的视频保存到本地文件或直接在网页上播放。 请注意,在使用Wasm和FFmpeg进行视频处理时,考虑到性能和资源的限制是非常重要的。视频处理通常是一项计算密集型任务,可能会对浏览器的性能产生一定的影响。因此,您应该仔细考虑处理的复杂性,并评估在特定设备和浏览器上的性能表现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一颗小行星!

恰饭ing

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值