夏日口袋gal逆向
[GalGame]summer pocket破解区域限制和光盘验证
我们如果直接打开游戏,发现打不开,显示有区域限制(必须是日本)

工具
- 🧠
- Cheat Engine
- x32dbg
- IDA
part1 区域限制
1. CE
用CE打开文件

使用CE自带的搜索字符串的功能

得到分析结果

我们查找This Game is Japan only

得到对应的地址0059CB69,双击定位到相应的位置

我们需要把 JNE(判断跳转)改成 JMP(无论如何全部都跳转 )

因为刚才查找到了三处,所以要一一更改,不再赘述

改好之后,点击开始运行程序

然后就可以进去了

2. x32DBG
但是这样的更改是一次性的,下面我们要用x32dbg来持久化更改

开始运行,到弹出地区错误窗口的地方,搜索字符串

搜索需要改的位置

把对应的每个jne改为jmp


然后导出

可以发现地区验证被解除了

part2 光盘检测
1. x32Dbg
再度打开已经解除了地区限制的exe

检查光盘验证,一般是名为GetLogicalDrives和GetDriveType的API


找到了,双击点进去,到了这里

是一个跳转,跳进去到了这里

然后运行程序,这个断点被命中好多次,而且每命中一次,右边的参数就会改变,它从 A:\ 改变到 Z:\,最后游戏弹出了警告框

因此我们可以作出合理推断,游戏对电脑上的每一个盘都进行了某种判断,如果没有发现符合要求的盘,则会报错
然后选择“执行到返回”,此时 EIP 会停在一个 return 上面,再按 F7 执行一条命令:

这时 EIP 返回到了游戏主程序的领空,并且上面那一条 call edi 就是呼叫了 GetDriveType。
地址是00583F4A

2. IDA
用IDA打开

查看基地址,是0x320000

设置正确的基地址

成功找到刚才说的代码

右键,点 Graph view,进入路线图模式。


可以看到,在进行 GetDriveType 之后,根据结果不同程序分为两条路,如果返回值不等于 5,则会走绿色那条路,如果等于 5,则会走红色那条路。(如果返回值是 5,那么表示这个盘是一个光盘)
在堆栈窗口右键,然后跟随 EBP(栈帧指针),可以看到目前堆栈的情况。


观察发现,一个叫做0x540A64的地方调用了这个光盘验证函数。
 在 IDA 打开这个地址。

在光盘验证返回的地方下一个断点,然程序停在 dummy 判断的函数,然后观察堆栈。

在IDA里搜索0x540EFD,打开


那我们直接给 bl 塞一个非零值就差不多完事了,
接下来要把 mov bl, al 改成 mov bl, 1 直接塞个 1 进去。

然后patch保存
就可以了


| 1 | 参考: | 

.gif)
.gif)
.gif)
.gif)
.gif)