
























《HackHub》,大概是一款等了些个年头的游戏,终于进入 EA 阶段,首发购入体验了一番。
作为黑客模拟器,对于尝鲜来说的确做到了相当程度的拟真,但如果要较真起来,讨论沉浸感,那我对于游戏整体或许会得出游玩体验不佳的结论,甚至觉得不列出几页测试反馈清单,都显得游玩的时间有些缺乏价值。
不讨论剧情内容,讲讲我遇到的其中一个「设计」,并稍稍探索了一下逃课方法。
主线中,需要向某个账号转账 $100 以完成任务。
由于游戏中的转账是一个开放操作,金额及转入账户都需要自己填写,且似乎只做了基础的有效性检验。于是,趁着这次「数值变动」,我试图增加自己的游戏货币,并针对这个任务目标简单做个测试。
打开 Cheat Engine,向对方账户转账 $1,但并未检测到该数值在内存中的存储位置,分别以不同金额尝试了多次依旧不成功。最后,稍有不耐烦,把剩下正好到 $100 的数额全部转了过去,这下好了,内存没扫出来,任务也没有完成。
得试试邪道。
游戏使用 Electron 开发,从 Steam 打开游戏文件目录,可以看到 resources 下包含一个 app.asar.unpacked 目录以及一个 app.asar 文件。
安装 asar 解包 app.asar 得到 app 文件夹:
pnpm install -g asar
asar extract app.asar app或许因为还在 EA 阶段,Fuse 机制暂未启用,将 app.asar 重命名为备份名称后,游戏将优先读取 app 目录下的内容。因此,直接修改 app 中的代码,效果就会直接反应在游戏中。
app 目录包含 dist 和 dist-electron 两个目录,前者是前端代码,后者是 Electron 主进程代码。在 dist/assets 下的大量 JavaScript 文件中,搜索 account balance amount - 等关键词,就可以找到转账相关的代码,最后发现位于 dist/assets/index-BhK6uC38.js 的第 81685 行。
代码经过压缩混淆,美化后如下:
/**
* 转账功能函数
* @params state - 全局状态
* @params action - 转账动作相关数据
*/
function addBankTransaction(state, action) {
// 根据发送方的 IBAN 查找账户索引
const fromAccountIndex = state.accounts.findIndex(account => account.IBAN === action.payload.from.IBAN);
// 根据接收方的 IBAN 查找账户索引
const toAccountIndex = state.accounts.findIndex(account => account.IBAN === action.payload.to);
// 将交易记录存入历史
state.transactions.push(action.payload);
// 减少发送方余额
if (fromAccountIndex >= 0) {
state.accounts[fromAccountIndex].balance -= action.payload.amount;
}
// 增加接收方余额
if (toAccountIndex >= 0) {
state.accounts[toAccountIndex].balance += action.payload.amount;
}
return state;
}可以看到转出账户通过 -= action.payload.amount 的语句扣款,那么修改这一步就能实现钱越转越多。
起初我只是将 -= 改为 +=,但是这样余额的增速还不够快,于是在句末加上了 * 1000。多进行这样的几次操作后,账户中的余额足够在游戏里横着走了。
同样,代码体现出对方也存在账户,转账并不是虚空的数值变换,那么也可以相同操作,直接将转出语句改为 state.accounts[toAccountIndex].balance = 0,把泼出去的钱收回来(坏心眼魅力时刻🤧)。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。