Reverse engineering, WebAssembly, WebAssembly Reversing

WebAssembly Reversing: как ломать браузерные игры и крипто-майнеры

Привет, друг!

WebAssembly (WASM) — это низкоуровневый байткод для браузера, который работает почти со скоростью нативного кода. Разрабы используют его для игр, обработки видео, криптографии… и для майнинга в браузере. Проблема в том, что WASM сложнее реверсить, чем JavaScript, но не невозможно. Давай научимся вскрывать эти чёрные ящики.

Анатомия WASM: что внутри .wasm файла

WASM модуль — это бинарный файл с несколькими секциями:

  • Type — сигнатуры функций (параметры и возвращаемые типы)
  • Function — индексы типов для каждой функции
  • Memory — линейная память (как массив байт)
  • Export — что доступно из JavaScript
  • Code — сам байткод функций
  • Data — инициализация памяти (константы, строки)

В отличие от JavaScript, WASM компилируется из C/C++/Rust, поэтому логика более «низкоуровневая» — циклы, указатели, прямая работа с памятью.

Инструменты для реверсинга

Базовый набор:

  • wasm2wat (из WABT) — конвертирует бинарный WASM в текстовый WebAssembly Text Format
  • wasm-decompile — декомпилирует WASM в псевдо-C код
  • Ghidra — мощный дизассемблер с поддержкой WASM
  • IDA Pro — если есть деньги, лучший инструмент
  • Chrome DevTools — для динамического анализа

Установка WABT:

Кейс #1: Взлом браузерной игры

Представь, что у тебя есть игра, где нужно фармить виртуальную валюту. Логика подсчёта монет спрятана в WASM. Задача — найти функцию, которая отвечает за начисление монет, и модифицировать её.

Шаг 1: Извлечение WASM файла

Открываем DevTools → Network → фильтруем по .wasm. Качаем файл.

Шаг 2: Дизассемблирование

Получаем текстовый формат:

Видим функцию addCoins, которая берёт текущее количество монет, добавляет amount и сохраняет обратно.

Шаг 3: Модификация

Меняем логику — умножаем на 100 вместо простого добавления:

Шаг 4: Компиляция и подмена

Теперь подменяем файл через Burp Suite или локальный прокси:

Запускаем игру — монеты начисляются в 100 раз больше. Профит!

Кейс #2: Анализ скрытого крипто-майнера

Некоторые сайты подгружают WASM майнеры (Coinhive, CryptoLoot), которые жрут CPU в фоне. Задача — найти майнер, понять, что он майнит, и заблокировать.

Шаг 1: Поиск подозрительного WASM

Открываем DevTools → Sources, ищем .wasm файлы. Обычно они имеют невзрачные названия типа worker.wasm или закодированные в Base64.

Декодируем Base64:

Шаг 2: Декомпиляция с помощью Ghidra

Загружаем miner.wasm в Ghidra:

  • File → Import File → выбираем WASM
  • Анализируем (Auto Analyze)

В декомпилированном коде ищем характерные паттерны майнеров:

  • Функции хеширования (SHA256, Scrypt, CryptoNight)
  • Nonce iteration (перебор значений)
  • WebSocket соединения (отправка шар на пул)

Шаг 3: Поиск pool адреса

Майнеры обычно хранят адрес пула в секции data. Смотрим через wasm2wat:

Бинго! Майнер подключается к Monero пулу.

Шаг 4: Блокировка

Создаём Content Script для браузера:

Или используем uBlock Origin с правилом:

Продвинутые техники реверсинга

Динамический анализ через Chrome DevTools:

Ставим breakpoint на функции WASM:

Дампинг памяти WASM:

Патчинг на лету:

Обход обфускации

Некоторые WASM модули используют обфускацию:

  • Name mangling — функции названы как $func123 вместо calculateDamage
  • Dead code — тысячи пустых функций для запутывания
  • Control flow flattening — превращение if/else в switch с множеством case

Способы борьбы:

  1. Анализ export/import — начинай с публичных функций
  2. Cross-reference — следи за вызовами через Ghidra/IDA
  3. Эмуляция — запускай подозрительные функции с разными параметрами
  4. Статистический анализ — большие функции (> 1000 инструкций) обычно важные

Автоматизация через скрипты

Ghidra script для поиска crypto функций:

Frida для runtime hook:

Ресурсы для углубления

  • wasmdec — декомпилятор WASM в C (github.com/wwwg/wasmdec)
  • wasm-reverse — набор инструментов для анализа
  • r2 (radare2) — командная альтернатива Ghidra
  • awesome-wasm-reversing — список ресурсов на GitHub
WebAssembly Reversing: как ломать браузерные игры и крипто-майнеры

На этом все. Всем хорошего дня!