Index
背景
玩单机游戏玩的不爽,想搞个 wemod 玩玩。可惜 wemod 今年年初开始付费使用,免费用户只有俩小时。 本人非常不爽开始搞事。
免责声明:本 blog 仅记录搞事的过程,不提供学习手段,请支持正版(doge)
信息收集
先看 wemod 目录,看到一个 app.asar
,可以大致确定是个 electron 程序。自己从零开始成本太高,
看看前人有没有什么成果。
看到前人有搞学习版的,大致浏览了一下都是打包好的 app.asar
提供下载,不过版本都太老了。继续搜索,
发现贴吧有人搞,时间还挺新,那么就开始研究这个。看到截图里的名字,开始搜索发现 github 被 dmca 了,
但是在 google 的搜索中发现 rust 公开仓有这个东西,遂开始读代码。
electron patch 逻辑
rust 仓里对 app.asar
进行 patch,主要 patch 了以下几个地方:
app-bundle.js
对 app-bundle.js
的访问请求进行 patch,对结果是 json 格式的且访问的 URL 以 /account
结尾的
覆盖其订阅信息为 pro 版本 {subscription: { type: 'pro'}}
。
这个效果就是将 wemod 获取用户信息的接口变更,始终返回 pro 版本订阅。
代码如下:
if ("application/json" === e.headers.get("Content-Type")) {
if (new URL(e.url).pathname.endsWith('/account')) {
var originalData = await e.json();
return {
...originalData,
subscription: {
type: 'pro'
},
...{
username: 'Pro Unlocker'
}
}
}
return e.json()
}
return e.text()
除了更改订阅,作者还对创作者身份进行了更改。众所周知,wemod 加入创作者需要申请和审核,因此这里修改后直接可以 使用创作者的对 cheat 的 debug 功能。
修改也非常简单,把 get 方法始终返回 true 即可:
content.replace("get isCreator(){", "get isCreator(){return true;")
vendor.js
对 vendor.js
文件新增一个逻辑,将所有的 pro 版本的 promotion 信息以及手机远程操作的功能入口进行关闭。
这个是因为远程操作的功能是需要远程服务器支撑的,我们不能暴露自己(doge),因此进行了防误触删除。
代码如下:
;(()=>{
console.info("Pro Unlocker")
let trig = () => {
document.querySelectorAll('promotion-banner').forEach(element => element.remove());
document.querySelectorAll('remote-button').forEach(element => element.remove());
};
setInterval(() => trig(), 1000);
trig();
})();
index.js
最后,为了我们 debug 方便,这个脚本还修改了 index.js,开启了 wemod 的 debug console,但是这里,作者的 版本不是最新的,最新的更换了写法:
content = content.replace(
"devMode:process.defaultApp", "devMode:process.argv.includes('-dev')")
这样,当我们运行 wemod 时加个 -dev
的参数就可以开启 debug console 了。
完整性校验
当我们 patch 完,满心欢喜打开 wemod,却发现什么反应也没有。用终端打开看看有什么信息,果不其然,是 app.asar
的完整性校验没过:
[20068:1001/195046.954:FATAL:asar_util.cc(163)] Integrity check failed for asar archive (xxx vs xxx)
无奈之下我选择了:
原神启动!(不是
在 IDA 里打开 app
目录里带的 WeMod.exe
,我们可以直接搜这个字符串:Integrity check failed for asar archive
,只有一个函数:
注意,这里不能打开外面那一层的 exe,那个只是一个入口,实际有功能实现的是 app
目录里的 exe
。

这里没啥想法,也不好 patch,再四处搜寻一下。。。
看到这个函数头有打 log,发现函数名 ValidateIntegrityOrDie
,然后就能找到相应的源码:
https://github.com/electron/electron/blob/main/shell/common/asar/asar_util.cc
看到这个函数返回值是 void
,就可以直接把这个函数 patch 成 ret
就好:

尾声
最后运行程序就会弹 pro 激活了

整体来说不是很难,核心就是在客户端读订阅信息的时候改成 pro 就能轻松学习。就是对 exe
打 patch 这里
还需要琢磨一下怎么搞成自动化的。