吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 7125|回复: 14
收起左侧

[原创] 记一次完整的RPG Maker MV游戏逆向系列第四篇

[复制链接]
简单メ传说 发表于 2021-2-27 20:37
本帖最后由 简单メ传说 于 2021-2-27 21:02 编辑

之前的传送门:
https://www.52pojie.cn/thread-1169825-1-1.html
https://www.52pojie.cn/thread-1169860-1-1.html
https://www.52pojie.cn/thread-1170415-1-1.html

前言

阅读本篇前请先看之前的几篇分析噢,不然可能会缺失一些前置知识

这篇还是讲 RPG Maker MV 的游戏分析,主要是如何分析一种通过 GameusQuestSystems.js 的加密手段

工具

  1. RPG Maker MV
  2. VS Code
  3. Edge 浏览器

正文

老套路,将游戏解压出来,用浏览器打开,注意到游戏一直处于加载状态,无法打开

image-20210227192304960.png

使用浏览器自带的开发人员工具,注意路径是非常奇怪的

image-20210227192459973.png

一个正常的网页打开开发人员工具,标题应当与域名是相同的,例如百度

image-20210227192548916.png

那我们猜测,这个游戏在代码中增加了一些条件,在浏览器打开的情况下会执行重定向,导致我们无法正常打开游戏,那么我们没有了调试工具的辅助,该如何找到是哪个文件进行了重定向呢?

因为 RPG Maker MV 的游戏特性,我们首先猜测是加载了某个插件来保护游戏的

打开游戏目录下的 plugin.js 通过如下方式关闭所有的插件,记得备份一份原版

image-20210227193251246.png

保存文件后再次打开游戏试试,发现可以打开了,不过游戏资源并不是真正的游戏资源

到这里,我们可以确认游戏确实是通过某个插件来进行保护的

image-20210227193458669.png

既然确认了确实是插件,那么我们通过看插件名或者二分测试法来定位究竟是哪个插件

所谓二分定位法即一次关闭一半的插件留下另一半,直到找到一个最终结果(其实就是二分搜索的思想)

查找过程略去不表,最终定位到是一个名叫 GameusQuestSystems.js 的文件进行了加密

ok,那我们就打开这个文件来康康,毫无意外,是一个混淆过的 js

image-202102271940274991.png

而且我们注意到图片中有非常奇怪的字符串,让我们怀疑是不是电脑坏了?其实不是的,这是很多的特殊字符造成的,处理这个也很简单

鼠标双击这个特殊字符后在键盘上使用 Ctrl + H 组合键,触发文本替换功能,将它替换掉就好啦

image-20210227194245717.png

文件中还有另一个这种类型的字符串,用同样的方法处理掉就好了

经过处理,我们依然看不懂这些混淆过的代码,接下来就是进行初步的反混淆了

粗略的看一下,文件中有非常多的地方在调用 _xmf('0x0','9txo') 这样的函数,根据经验,这个其实是对文本进行了加密,我们只要用这个函数把这些文本都处理一遍把结果替换回来,就可以了,至于到底怎么加密的我们并不关心(类似 hook 的思想,hook 在逆向中真的是非常重要的思想,包括正向开发也是,动态代{过}{滤}理,AOP 其实和 hook 做的是一样的事)

ok,既然说替换,那么两种方式,其一正则表达式,其二 AST

正则表达式:在文本处理中非常常用的一种模式匹配语法

AST:中文全称 抽象语法树,百度百科解释的非常专业,说人话就是让计算机分析每段代码分别是干啥的,有个将代码转换成语法树的网址各位自己搜一下,放点代码进去试一试就能理解了,论坛似乎不能放外链,辛苦各位自己动动手了

正则表达式代码大概是下边这样,其中 111.js 是抠出来的 _xmf 函数,222.txt 是加密的文件,333.js 是解密结果

import execjs
import re

with open('./111.js') as f:
    jsCode = f.read()
with open('./222.txt') as f:
    encryptTxt = f.read()

js = execjs.compile(jsCode)

pattern = re.compile(r'_xmf\("(.*?)","(.*?)"\)')

params = pattern.findall(encryptTxt)

for param in params:
    decodeTxt = js.call('_xmf', param[0], param[1])
    print(decodeTxt)
    encryptTxt = encryptTxt.replace(
        '_xmf("' + param[0] + '","' + param[1]+'")', '"' + decodeTxt+'"')

with open('./333.txt', 'w') as f:
    f.write(encryptTxt)

这里我们已经还原了字符串加密

image-20210227200903525.png

可以发现有形如 location["reload"]()window["close"]()["closeDevTools"]() 这样的代码,通过函数名,可以知道这就是作者给我们留的坑了,统统给它注释掉,再次通过浏览器打开游戏,发现一切正常了,之后的过程就和前面的文章一样了,按部就班的调试就能拿到资源加密方式和密钥了,各位可以自行尝试

逆向其实就是通过不断地猜测与尝试,很有可能很长时间都没有进展,适当的放松自己,做做别的事(比如逆向做烦了去搞搞开发?哈哈哈)也许某天就福至心灵了呢?

祝愿我们能保持初心,砥砺前行~~

本篇就酱啦,感谢各位阅读,撒花★,°:.☆( ̄▽ ̄)/$:.°★

免费评分

参与人数 2吾爱币 +2 热心值 +2 收起 理由
超无奥义 + 1 + 1 用心讨论,共获提升!
885082943 + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

vethenc 发表于 2021-2-27 21:29
手下留情,请多保护国产开发者
Yamitsuki 发表于 2023-10-27 22:09
大佬您好,最近玩儿个rpg游戏手动刷的太累又不想直接作弊改数据,就想挂个自动挂机插件,但是发现所有js文件打开都是乱码(后面才发现是因为这些.js后缀的文件其实是二进制文件改了后缀名,大概率是js文件通过nwjc编译的),发现能正常打开的只有两个html文件,看到pkg文件里声明入口和一个变量指向一个没有后缀名的文件,打开发现也是混淆过的,花时间把两个html和这个没有后缀名的文件解析后发现,这三个文件都只是在做一件事儿,通过nw去加载二进制文件,失败就reload,这时我才知道那些js文件其实是被编译的二进制文件,做到这一步我就黔驴技穷了,改过的html文件会过不去验证文件签名,而所有的js文件都是被编译成二进制的,这种情况下,下一步该怎么走,我想咨询下大佬您,寻个方向
Windows10 发表于 2021-2-27 21:22
PrincessSnow 发表于 2021-2-27 21:34
大佬牛皮 观摩学习
winson365 发表于 2021-2-27 21:46
大佬,太牛B了膜拜一下
 楼主| 简单メ传说 发表于 2021-2-27 21:53
vethenc 发表于 2021-2-27 21:29
手下留情,请多保护国产开发者

是的,这也是我没有给出解密结论的原因
我主要还是分享逆向思路
而且这个加密每次出来的函数都是不一样的,直接用我的代码是没法用的,能真正去实践的人本身就不多
在一个,即使能调试了,其实这后边还有一些小坑的
文章主要还是为了给大家打开思路
lyl610abc 发表于 2021-2-27 22:41
关于js逆向知识一片空白的萌新前来膜拜
橡鳄君 发表于 2021-2-28 12:11
学习到了,不过没法实践一下
nihao7758 发表于 2021-2-28 13:09
什么游戏这是??想玩~
shellrev 发表于 2022-3-6 13:13
本帖最后由 shellrev 于 2022-3-6 13:17 编辑

大佬真的强
膜拜大佬,如果有不懂的我再问吧。
先自己实践一下
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-23 01:29

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表