WebAssembly 逆向分析:如何反编译 Wasm 二进制文件,修改游戏里的“金币数量”?

WebAssembly 逆向分析:如何反编译 Wasm 二进制文件,修改游戏里的“金币数量”?

标签: #WebAssembly #ReverseEngineering #Security #Wasm #GameHacking #CTF


🕵️‍♂️ 前言:Wasm 不是加密,只是二进制

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

逆向 Wasm 的两种核心思路:

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

Wasm 加载与逆向流程 (Mermaid):

逆向攻击路径

Wasm 运行环境

1. 下载 game.wasm

解码

Imports (函数/内存)

读写

工具: wasm2wat

工具: Console

服务器

浏览器

Wasm 二进制

Wasm 模块

JS 胶水代码

实例化对象 (Instance)

线性内存 (ArrayBuffer)

可读汇编代码 (.wat)

直接修改数值


🛠️ 一、 兵器库:逆向工具准备

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

  1. Chrome 浏览器:最强大的 Wasm 调试器。
  2. WABT (The WebAssembly Binary Toolkit)
  • wasm2wat: 将二进制转为人类可读的文本格式(S-表达式)。
  • wat2wasm: 将修改后的文本重新编译为二进制。
  1. 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.gameInstanceconst memBuffer = window.gameInstance.exports.memory.buffer;const memView =newInt32Array(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=asyncfunction(url, options){if(url.includes('game.wasm')){// 拦截请求,返回我们修改过的二进制数据const response =awaitoriginalFetch('http://localhost:8000/game_hacked.wasm');return response;}returnoriginalFetch(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 和线性内存的原理,你就能看穿网页中那些“高性能黑盒”背后的秘密。

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

Read more

【AIGC】结构化的力量:ChatGPT 如何实现高效信息管理

【AIGC】结构化的力量:ChatGPT 如何实现高效信息管理

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]本文专栏: AIGC |ChatGPT 文章目录 * 💯前言 * 💯结构化的定义 (Structuration: Definition) * 1. 结构化的定义 * 2. 结构化的示例 * 3. 技术领域中的结构化数据 * 💯有序的规则的重要性 (Importance of Orderly Rules) * 1. 信息的组织和转变 * 2. 字典中的例子 * 3. 规则的有序性 * 4. 生活中的例子 * 💯结构化的实际应用 (Practical Applications of Structuration) * 1. 结构化的广泛应用 * 2. 现代科技领域中的重要性 * 3. 结构化的意义 * 💯小结 💯前言 在人工智能生成内容(AIGC)的浪潮中,信息的高效组织和管理成为突破瓶颈的关键能力。结构化,作为一种通过明确规则和逻辑对信息进行处理的方法,不仅奠定了高效信息管理的基础,

By Ne0inhk
从 Copilot 到工程化 Agent 执行框架:基于OpenCode + OpenSpec 的企业级 AI Coding 落地实践

从 Copilot 到工程化 Agent 执行框架:基于OpenCode + OpenSpec 的企业级 AI Coding 落地实践

引言:AI Coding 进入规范驱动自动化时代         当前,许多开发者在使用 AI 编程助手时正普遍面临—个痛点:在处理大型项目时, AI 似乎会“遗忘”上下文,导致代码回归、引入新 Bug 或生成不符合项目规范的混乱代码。正如研发同学反复出现的挫败感:  “代码库越大, AI 弄得越乱”。         这种被称为“Vibe Coding”的模式,是 AI 辅助工程必要的、但也是原始的第—步。它更像—种不可预测的艺术,而非可重复、可扩展的科学。要真正释放 AI 的生产力,我们必须迎来—次范式的进化:从凭感觉的“Vibe Coding” ,转向由规范驱动的(Spec-Driven Development)专业化 AI 工程新范式。         本文将深入探讨如何将强大的

By Ne0inhk
一次性搞懂什么是AIGC!(一篇文章22个基本概念)

一次性搞懂什么是AIGC!(一篇文章22个基本概念)

全新的时代,AIGC(Artificial Intelligence Generative Content,即人工智能生成内容)正在重新塑造着内容创作生态。当常识能被机器识别,当艺术被重新定义,当创意不再需要人工,广告营销行业将迎来一场生产变革巨浪。数英将持续聚焦AIGC领域,通过资讯分享、认知科普、方法总结、深度访谈等,带领大家多方位了解AIGC。 本期内容,我们将梳理22个AI基础概念,带你搞清楚。 以ChatGPT、Midjourney为首的AIGC软件出现至今,不过短短半年时间,已经从方方面面浸入到人们的生活里,与此同时,大量专业术语涌入我们视野。 AI、AIGC、AGI、Bing AI,ChatGPT……这些字母缩写到底是什么?有什么区别?和广告营销有什么关系? 本文将尽可能用最直白通俗的语言,结合广告营销案例,帮你搞清楚互联网上常见的AI术语。 一、基本概念/理论 1、AI 工作原理 AI,全称Artificial Intelligence,人工智能。顾名思义,

By Ne0inhk

彻底关闭Win10中烦人的365 Copilot弹窗的6种方法

快速体验 1. 打开 InsCode(快马)平台 https://www.inscode.net 2. 点击'项目生成'按钮,等待项目生成完整后预览效果 输入框输入如下内容 帮我开发一个Windows系统优化小工具,用于帮助普通用户一键禁用各类系统弹窗和推送功能。系统交互细节:1.提供常见弹窗类型选择 2.显示当前系统状态 3.一键禁用功能 4.支持恢复默认设置。注意事项:需要管理员权限运行 最近很多Win10用户在系统升级后都遇到了Microsoft 365 Copilot频繁弹窗的问题,这个功能虽然智能,但频繁的打扰确实影响工作效率。经过实测,我总结了6种有效的关闭方法,从简单隐藏到彻底禁用一应俱全。 1. 任务栏临时隐藏是最简单的解决方案,只需右键任务栏取消勾选相关选项。但这个方法只是隐藏入口,Copilot功能仍在后台运行。 2. 组策略彻底禁用是最推荐的方式,通过系统内置的组策略编辑器可以完全关闭Copilot。操作时需要管理员权限,设置完成后需要重启生效。这个方法禁用后连快捷键都会失效,

By Ne0inhk