跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
汇编大前端算法

WebAssembly 逆向分析:反编译与内存篡改实战

WebAssembly 逆向主要包含静态分析与动态调试两种手段。静态分析利用 wasm2wat 将二进制转为文本格式,配合 Ghidra 等工具还原逻辑;动态调试则通过浏览器控制台直接操作线性内存,模拟 Cheat Engine 搜索数值并篡改。针对关键数据,开发者应实施符号剥离、控制流平坦化及服务端校验以增强防护。

疯疯癫癫发布于 2026/3/15更新于 2026/7/2348 浏览
WebAssembly 逆向分析:反编译与内存篡改实战

前言

WebAssembly 是一种基于堆栈虚拟机的二进制指令格式,类似于汇编语言但更抽象。浏览器加载 .wasm 文件后将其编译为机器码运行。

逆向 Wasm 的核心思路主要有两种:

  1. 静态分析:将 .wasm 反汇编为 .wat (WebAssembly Text) 或伪 C 代码,分析逻辑。
  2. 动态调试:利用浏览器开发者工具挂载断点,或直接修改 WebAssembly.Memory(线性内存)。

流程图示意

[下载 game.wasm] -> [解码 Imports/内存] -> [JS 胶水代码实例化]
       |                                              |
       v                                              v
   [服务器]                                        [浏览器 Console]
       |                                              |
       +------------> [Wasm 模块] <-------------------+
                             |
                    [读写线性内存 / 反汇编 .wat]

一、工具准备

在开始之前,你需要准备以下工具:

  1. Chrome 浏览器:最强大的 Wasm 调试器。
  2. WABT (The WebAssembly Binary Toolkit):
    • wasm2wat: 将二进制转为人类可读的文本格式(S-表达式)。
    • wat2wasm: 将修改后的文本重新编译为二进制。
  3. Ghidra (可选):安装 Wasm 插件后,可以生成伪 C 代码辅助分析。

二、捕获与反编译

假设我们正在玩一个网页小游戏,每次点击按钮,金币 +1。我们要把它改成 +1000。

1. 获取 Wasm 文件

打开 Chrome DevTools -> Network 面板,刷新页面,过滤 .wasm。找到 game.wasm 并下载。

2. 转化为可读代码 (WAT)

使用 wasm2wat 工具:

wasm2wat game.wasm -o game.wat

打开 game.wat,你会看到类似这样的代码:

(module
  (import "env" "memory" (memory $0 1))
  (func $add_gold (param $p0 i32) (result i32)
    (local $l0 i32)
    local.get $p0      ;; 获取参数(当前金币)
    i32.const 1        ;; 加载常量 1
    i32.add            ;; 执行加法
    local.set $l0      ;; 存入局部变量
    local.get $l0      ;; 返回结果
  )
  (export "add_gold" (func $add_gold))
)

注:真实环境中的函数名通常被 stripped 掉了,只显示 ,你需要根据上下文推断。

func $f12

三、内存篡改 (Memory Hacking)

Wasm 的内存模型非常简单:它就是一个巨大的、线性的 JavaScript ArrayBuffer。这意味着,JS 可以随意读写 Wasm 的内存!这是最简单的破解方式。

1. 定位内存对象

在 Chrome Console 中,寻找 Wasm 的实例对象。通常在全局变量或者 imports 对象中。

// 假设游戏把实例挂载到了 window.gameInstance
const memBuffer = window.gameInstance.exports.memory.buffer;
const memView = new Int32Array(memBuffer);

2. 搜索数值 (CE 搜内存法)

就像使用 Cheat Engine 一样:

  1. 当前金币是 100。
  2. 在 Console 输入:
    memView.forEach((v, i) => { if(v===100) console.log(i) })
    
    得到索引 1024。
  3. 玩游戏,金币变成 101。
  4. 检查索引 1024 的值:memView[1024] -> 确实是 101。
  5. 找到地址了!

3. 修改数值

// 直接把金币改成 999999
memView[1024] = 999999;

页面上的金币瞬间暴涨。

四、二进制补丁 (Binary Patching)

如果金币逻辑没有暴露在全局内存中,或者是纯栈操作,我们就需要修改代码本身(Patch)。

1. 修改 WAT 代码

回到刚才反编译的 game.wat 文件。找到加法逻辑:

local.get $p0
i32.const 1      ;; <--- 这里是增加的数量
i32.add

我们将 1 修改为 1000:

local.get $p0
i32.const 1000   ;; <--- 修改为 1000
i32.add

2. 重编译为 Wasm

wat2wasm game.wat -o game_hacked.wasm

3. 替换运行 (浏览器端 Hook)

我们不能直接替换服务器文件,但我们可以通过 Chrome 的 Local Overrides 功能,或者写一个 TamperMonkey 脚本来拦截网络请求。

TamperMonkey 脚本思路:

const originalFetch = window.fetch;
window.fetch = async function(url, options) {
  if(url.includes('game.wasm')) {
    // 拦截请求,返回我们修改过的二进制数据
    const response = await originalFetch('http://localhost:8000/game_hacked.wasm');
    return response;
  }
  return originalFetch(url, options);
};

刷新网页,点击按钮,金币直接 +1000!

五、防御:开发者如何保护 Wasm?

看到这里,你可能会觉得 Wasm 在裸奔。作为开发者,如何防御?

  1. Strip Symbols:发布时务必去除调试符号(函数名、变量名),让逆向者面对 $func1, $func2 抓狂。
  2. 控制流平坦化 (Control Flow Flattening):使用 LLVM 的混淆插件(如 Obfuscator-LLVM),把清晰的 if-else 变成复杂的 switch 跳转,破坏代码结构。
  3. 服务器校验:永远不要相信客户端。 像金币这种关键数据,Wasm 只能做展示,计算和存储必须在服务器端完成。

总结

Wasm 逆向正处于一个蓝海阶段。它既不像 x86 汇编那样指令繁杂,也不像 JS 那样容易被混淆成乱码。掌握了 wasm2wat 和线性内存的原理,你就能看穿网页中那些'高性能黑盒'背后的秘密。

练习建议 找一个简单的在线 CTF 题目(WebAssembly 类),尝试不看 Writeup,使用 Chrome DevTools 的断点功能,追踪一个加密函数的输入输出,逆向出它的 Flag。

目录

  1. 1. 获取 Wasm 文件
  2. 2. 转化为可读代码 (WAT)
  3. 1. 定位内存对象
  4. 2. 搜索数值 (CE 搜内存法)
  5. 3. 修改数值
  6. 1. 修改 WAT 代码
  7. 2. 重编译为 Wasm
  8. 3. 替换运行 (浏览器端 Hook)
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 月薪 30K 以上程序员的必备特征与核心能力
  • Python Selenium 与 Chrome WebDriver 深度配置实战
  • 自进化医疗智能体:动态记忆与持续运行的 Python 架构设计
  • 基于宝塔面板的网站加载速度优化实战记录
  • AI 绘画工具崩溃排查与性能优化实战指南
  • AI Skills:前端开发的新效率工具与应用
  • 基于 AI 生成的在线考试系统全流程技术实现
  • C++ 类和对象进阶:默认成员函数与运算符重载
  • AI 辅助编程时代,新手能否替代资深开发者?实证研究给出答案
  • Java 基础:Spring Web MVC 核心注解与开发流程
  • Python 通达信数据接口实战:股票数据分析入门
  • 技术面试中高质量简历的编写指南与核心要素
  • 认知刷新,AI 时代,“人人都是产品经理” 的全新内涵
  • Trae 集成图片素描 MCP 工具实现多风格图像转换
  • Mac 版 Stable Diffusion 环境搭建指南
  • Spring AI Alibaba 快速搭建带对话记忆的智能客服聊天机器人
  • Topaz Video AI 视频画质增强与修复软件安装指南
  • Stable Diffusion v1.5 Archive 模型部署与使用指南
  • 8 款实用 AI 绘画工具推荐:从 Midjourney 到 Stable Diffusion
  • OpenCode 接入 Kimi K2.5 配置与实战指南

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online