结局
我是🤡, wine-ge-custom-opt + lavfilter + 安装了一下游戏, 解决问题. 不去折腾这个破引擎了.
动机
打 gal ,想不安装来玩游戏,注意到反复
地址居然是同一个。
是读注册表错误。(简单解决方法是完整安装,不是很想)。开始有想法。
准备工具
工欲善其事,必先利其器。先啃掉了一本《有趣的二进制 软件安全与逆向分析》,有了基本大局观。
下了个 ida pro7.0 ,用 wine64 运行。
简单分析了下,发现自带了 debugger 检测器。人话:传统的断点会被识别。需要硬件断点。
契机
进度:大幅增加
tg 群某人指出是 椎名里緒(ShiinaRio),开始收集资料。发现这个引擎有点麻烦。
找到个教程
动工
下面操作环境均为 Arch Linux + wine64
WARC1.7
ida pro search text
WARC
, 找到函数主体
loc_44FFA0
多次
90 90 90
后再 convert codecode here
但是根据 readme, 这游戏有代码段校验。可能还需要绕过。
然后我先咕咕咕,把看雪论坛的某本书过一遍+ youtube ida pro 的入门教程。
目前一点体会:
汇编基本就是对寄存器的 + - * / 读写,以及 push call pop (参数先压栈再函数调用然后弹栈),以及 jmp jnz jz(控制语句),还有 nop,还有偏移(不管是结构体偏移还是数组偏移)
所以反出来的 c 代码。基本无法识别 struct or array,而且充满着 while ,do while,for,各种强制类型转换(用途是切换 step),为偏移作准备。
这一点都不抽象。太坏了。
识别壳的工具
《加密与解密》P83,84 缺
找到这俩地方。
check_reg_err_msg 是那条错误信息。所以 lstrcpyA 是复制错误信息。
猜测 return 0 是 error, 1 是?不太像。
RegQueryValueExA 函数,查文档得知成功是 ERROR_SUCCESS == 0 (wtf
所以改成 return 1
校验段,地址有可能是在
查看 xref, 找到
一堆异或看上去是校验。继续找 xref
看了下逻辑。if 校验成功,jz 到 start, 不然直接 return
地址,长度,原,现
hex
改掉 2 个闪退的地方
目测是引擎的 opengl 补丁。
注册表地址
键值
问题
转场动画无法播放(现在还没修好)
这个屑引擎的「对抗」措施:
1)花指令
2)字符串混淆
3)调试器检测
4)代码段校验
(这些是已知的)