Как я могу сделать эту функцию Wasm легко читаемой на ее родном языке? - PullRequest
1 голос
/ 24 апреля 2020

У меня есть следующая функция Wasm, которую я пытаюсь понять, и я считаю, что это какой-то фрагментный шейдер webgl:

func $frag_shader (param i32)
(local i32 i32 i32 i32 i32)
  global.get 0
  i32.const 32
  i32.sub
  local.tee 1
  global.set 0
  local.get 1
  i32.const 16
  i32.add
  i32.const 1049267
  i32.const 85
  call 23
  local.get 1
  i32.load offset=16 align=4
  local.set 2
  block
    block
      block
        block
          local.get 1
          i32.load offset=20 align=4
          local.tee 3
          local.get 1
          i32.load offset=24 align=4
          local.tee 4
          i32.ne
          br_if 0
          local.get 2
          local.set 5
          local.get 3
          local.set 4
          br 1
        end
        local.get 3
        local.get 4
        i32.lt_u
        br_if 1
        block
          local.get 4
          br_if 0
          i32.const 0
          local.set 4
          i32.const 1
          local.set 5
          local.get 3
          i32.eqz
          br_if 1
          local.get 2
          call 61
          br 1
        end
        local.get 2
        local.get 3
        i32.const 1
        local.get 4
        call 52
        local.tee 5
        i32.eqz
        br_if 2
      end
      local.get 1
      i32.const 8
      i32.add
      local.get 5
      local.get 4
      call 49
      local.get 0
      local.get 1
      i64.load offset=8 align=8
      i64.store offset=0 align=4
      local.get 1
      i32.const 32
      i32.add
      global.set 0
      return
    end
    i32.const 1049136
    call 25
    unreachable
  end
  local.get 4
  i32.const 1
  i32.const 0
  i32.load offset=1050388 align=4
  local.tee 1
  i32.const 1
  local.get 1
  select
  call_indirect 4
  unreachable
end

Я знаком с javascript, но для меня это невозможно расшифровать. Какая моя лучшая ставка, чтобы решить, как преобразовать ее в более «дружественный» javascript?

Есть ли инструмент, который поможет преобразовать в лучший формат? Или есть способ понять это легче?

Ответы [ 2 ]

0 голосов
/ 24 апреля 2020

Итак, у вас есть что-то похожее на WAT, который является текстовым форматом WASM. Однако это недопустимый WAT, поэтому я не уверен, что вы можете с ним сделать.

Если бы это был действительный WAT, вы могли бы использовать wat2wasm в WebAssembly Binary Toolkit , чтобы включить WAT в двоичный WASM, а затем wasm2 c, чтобы превратить его в C, который будет частично читаемым.

Однако способ, которым блоки BLOCK и END, как они определены, является нестандартным (AFAIK Я не эксперт WASM). И даже если я попытаюсь заменить BLOCK и END открытыми и закрытыми скобками, это все равно недопустимо. Поэтому у меня нет для вас ответа, за исключением попытки выяснить, в каком формате на самом деле находится файл, и использовать соответствующий набор инструментов. [В комментариях Андреас Россберг объясняет, что block и end действительно являются допустимыми ключевыми словами]

0 голосов
/ 24 апреля 2020

Похоже, что вы запрашиваете декомпилятор , инструмент, который превращает низкоуровневый код, сгенерированный компилятором, в исходный код. Декомпиляторы часто используются для реверс-инжиниринга.

Я не знаю ни одного декомпилятора, существующего в настоящее время для Wasm. Более того, вам сначала нужно знать или угадать исходный язык, на котором этот код был изначально разработан.

...