The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Разработчики V8 представили декомпилятор для WebAssembly

29.04.2020 10:47

Разработчики JavaScript-движка V8 представили утилиту wasm-decompile, позволяющую декомпилировать промежуточное бинарное представление WebAssembly в читаемый псевдоязык, напоминающий JavaScript и Си. Предложенный псевдоязык существенно проще для восприятия и более пригоден для ручного разбора, чем текстовое представление WebAssembly в формате ".wat", который ближе к ассемблеру, чем к высокоуровневым языкам. При этом декомпиляция по возможности полностью отражает представление Wasm.

Декомпилятор включён в состав инструментария WABT, обеспечивающего трансляцию между бинарным и текстовым представлениями WebAssembly, а также разбор, обработку, модификацию и проверку wasm-файлов. В составе WABT также развивается утилита wasm2c, позволяющая декомпилировать файлы wasm в эквивалентный код на языке Си, который может быть скомпилирован Си-компилятором, но в плане читаемости мало чем отличается от текстового представления "wat".

Например, скомпилированная в wasm исходная Си-функция


   typedef struct { float x, y, z; } vec3;

   float dot(const vec3 *a, const vec3 *b) {
       return a->x * b->x +
           a->y * b->y +
           a->z * b->z;
   }
будет декомпилирована утилитой wasm-decompile в псевдоязык

   function dot(a:{ a:float, b:float, c:float },
             b:{ a:float, b:float, c:float }):float {
     return a.a * b.a + a.b * b.b + a.c * b.c
   }
в то время как преобразование в текстовый формат ".wat" будет выглядеть следующим образом

   (func $dot (type 0) (param i32 i32) (result f32)
     (f32.add
       (f32.add
         (f32.mul
           (f32.load
            (local.get 0))
           (f32.load
             (local.get 1)))
         (f32.mul
           (f32.load offset=4
             (local.get 0))
           (f32.load offset=4
             (local.get 1))))
       (f32.mul
         (f32.load offset=8
           (local.get 0))
         (f32.load offset=8
           (local.get 1))))))


  1. Главная ссылка к новости (https://v8.dev/blog/wasm-decom...)
  2. OpenNews: Mozilla начинает внедрение технологии изоляции библиотек RLBox
  3. OpenNews: Red Hat развивает JIT-компилятор MIR
  4. OpenNews: Первый выпуск wasm3, быстрого интерпретатора WebAssembly
  5. OpenNews: W3C придал WebAssembly статус рекомендованного стандарта
  6. OpenNews: Mozilla, Fastly, Intel и Red Hat продвигают WebAssembly, как платформу для универсального применения
Лицензия: CC-BY
Тип: Программы
Короткая ссылка: https://opennet.ru/52833-webassembly
Ключевые слова: webassembly, decompile, wasm
При перепечатке указание ссылки на opennet.ru обязательно
Обсуждение (28) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Аноним (1), 11:17, 29/04/2020 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Этот .wat как Лисп какой-то.
     
     
  • 2.2, Аноним (2), 11:41, 29/04/2020 [^] [^^] [^^^] [ответить]  
  • +6 +/
    Потому что этот формат называется S-выражения, а Lisp полностью состоит из них
     
     
  • 3.4, Crazy Alex (ok), 12:07, 29/04/2020 [^] [^^] [^^^] [ответить]  
  • +21 +/
    Я давно подозревал, что Lisp  надо декомпилировать прежде чем читать ;-)

    А если серьёзно - WASM так и разрабатывался, чтобы байткоды были более-менее понятным для человека (в том числе поэтому там AST), и чтобы бинарный и текстовый форматы были полностью эквивалентны. Так что даже странно, что до сих пор подобных инструментов не было.

     
     
  • 4.11, Аноним (11), 13:47, 29/04/2020 [^] [^^] [^^^] [ответить]  
  • +/
    На любом языке можно так написать что потом придётся декомпилировать что бы прочитать, есть даже специальные программы приводящие исходный код к нечитаемому виду.
     
     
  • 5.14, Crazy Alex (ok), 15:13, 29/04/2020 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Конечно. Но на одних языках надо прилагать некие усилия, чтобы вышло что-то читаемое, на других - наоборот. Впрочем, весь мейнстрим, как водится, здесь посередине.
     

  • 1.3, Коровавирус (?), 12:06, 29/04/2020 [ответить] [﹢﹢﹢] [ · · · ]  
  • –2 +/
    Wat гораздо понятнее, ибо Лисп :)
     
     
  • 2.6, Аноним (6), 12:32, 29/04/2020 [^] [^^] [^^^] [ответить]  
  • +1 +/
    offset=4, offset=8 - такой себе лисп :)
     
     
  • 3.12, Ordu (ok), 14:09, 29/04/2020 [^] [^^] [^^^] [ответить]  
  • +2 +/
    В лиспе бы порядок аргументов был бы другим (&key аргументы после обязательных), и выглядело бы несколько иначе:

    (f32.load (local.get 0) :offset 4)

    Но сути это не меняет. Преобразовать из того синтаксиса в lisp'овый можно даже не вдаваясь в заморочные штуки типа reader macro.

     

  • 1.5, Аноним (5), 12:31, 29/04/2020 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    Какой wat. Лучше WWWHAT???? :)
     
     
  • 2.9, Аноним (9), 13:22, 29/04/2020 [^] [^^] [^^^] [ответить]  
  • +2 +/
    wat? https://i.kym-cdn.com/photos/images/newsfeed/000/173/576/Wat8.jpg
     

  • 1.7, pin (??), 13:00, 29/04/2020 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    Ждем, когда все эти кодонедогенераторы начнут генерировать код в метры кубические.
     
     
  • 2.8, Аноним (9), 13:20, 29/04/2020 [^] [^^] [^^^] [ответить]  
  • +5 +/
    Кодогенераторы кодогенерировали, кодогенерировали, да не выкодогенерировали.
     
  • 2.17, Аноним (1), 17:09, 29/04/2020 [^] [^^] [^^^] [ответить]  
  • +/
    В барели
     
  • 2.24, nearestmilkyway (?), 13:37, 30/04/2020 [^] [^^] [^^^] [ответить]  
  • +/
    ...в меры кубитческие
     

  • 1.10, Аноним (10), 13:36, 29/04/2020 [ответить] [﹢﹢﹢] [ · · · ]  
  • +5 +/
    > представление WebAssembly в формате ".wat"

    Странно, что не ".wtf"

     
  • 1.15, Аноним (15), 16:02, 29/04/2020 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Почему jvm байт-код декомпилируется в абсолютно читаемый и понятный исходный код, а из webassebly получается... ужас какой-то
     
     
  • 2.16, Аноним (16), 17:08, 29/04/2020 [^] [^^] [^^^] [ответить]  
  • +/
    Потому что jvm байткод неоптимизирован.
     
  • 2.22, КО (?), 11:32, 30/04/2020 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Потому, что он декомпилируется в тот же язык, на котором писали. И потому этот язык понятен.
    А тут декомпиляция идет в выдуманные языки с которыми почти никто не работает. Поэтому он и не понятен - ибо НЕХ.
     
  • 2.23, Аноним (23), 13:15, 30/04/2020 [^] [^^] [^^^] [ответить]  
  • +/
    Потому что jvm взаимодействует с высокоуровневыми джавовскими объектами, а wasm жонглирует байтиками как CPU — на низком уровне.
     
  • 2.26, Аноним (26), 15:04, 30/04/2020 [^] [^^] [^^^] [ответить]  
  • +/
    Если в ProGuard включили нужные настройки, то после декомпиляции получится каша.
    Так же и с C# всякими.
     

  • 1.18, Вы забыли заполнить поле Name (?), 19:44, 29/04/2020 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    > чем текстовое представление WebAssembly в формате ".wat", который ближе к ассемблеру, чем к высокоуровневым языкам

    Ну такое себе заявление, натянуто. S-выражения понятнее как мне кажется. Достаточно было заменить

    (f32.load (local.get 0)) на какой-нибудь (a), т.к. это первый аргумент.

     
  • 1.19, Аноним (19), 20:22, 29/04/2020 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Псевдоязык похож на typescript с сишными типами.
     
     
  • 2.20, Аноним (10), 21:25, 29/04/2020 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Это замаскированный паскаль. Современные погромисты уже не в состоянии декомпилировать в си, поэтому выбрали паскаль.
     
     
  • 3.21, Аноним (19), 22:47, 29/04/2020 [^] [^^] [^^^] [ответить]  
  • +/
    Да где там паскаль-то? Тип после имени переменной в миллионе языков. А управление потоком там вообще ни на что не похоже, по сути, два варианта goto ;)
     
  • 3.29, Вы забыли заполнить поле Name (?), 13:56, 02/05/2020 [^] [^^] [^^^] [ответить]  
  • +/
    > Это замаскированный паскаль. Современные погромисты уже не в состоянии декомпилировать
    > в си, поэтому выбрали паскаль.

    Никлаус, залогинтесь.

     

  • 1.25, Аноним (-), 14:51, 30/04/2020 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    >Например, скомпилированная в wasm исходная Си-функция
    >typedef struct { float x, y, z; } vec3;
    >a->y * b->y +

    Это примеры из языка Си плюс-плюс, это не чистый Си. Автор новости садись, два!

     
     
  • 2.27, Аноним (27), 19:32, 30/04/2020 [^] [^^] [^^^] [ответить]  
  • +/
    Где тут плюс плюс? Автор коммента, у тебя что, переполнение?
     
     
  • 3.28, Аноним (-), 21:44, 01/05/2020 [^] [^^] [^^^] [ответить]  
  • +/
    Вот тут

    >Например, скомпилированная в wasm исходная Си-функция

     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Спонсоры:
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2021 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру