这几天在破解リングプロテクト游戏,因为没有前辈研究,所以完全是自己在摸索,连续看了一个礼拜,也有了些经验,这里总结下,给后人留些灵感。

リングプロテクト加密,这是片假名写法,拉丁写法为RingProtect

RingProtect1.0
加密的动态链接库是Udpvl.dll,加密函数为UdpCall
破解方法:
看到汇编代码
push ASCII "CompFile.dat"
push ASCII "RingFile.dat"
push 0x64
call <jmp.&Udpvl.UdpCall>

大部分游戏jmp到以下代码上就OK了
pop edi
mov eax,0x1

少部分游戏没有以上代码,但是只有一个跳转,直接jmp过retn就可以了。

RingProtect2.0
RingProtect3.0
RingProtect4.0

加密的动态链接库是EDD2.dll EDD3.dll EDD4.dll 加密函数为ProtectCheck,验证正确话返回值是eax寄存器等于1
破解方法:
确保LoadLibraryA GetProAddress FreeLibrary 三个函数不被跳过。
进入LoadLibraryA函数加载EDP.dll
进入GetProAddress函数调用EDP.dl里的ProtectCheck函数
GetProAddress函数下面一个调用寄存器地址的call,直接NOP掉,否则会堆栈溢出。
并进入FreeLibrary函数卸载EDP.dll
中途遇到MessageBoxA函数或MessageBoxW函数,直接跳过。
一般来说这样就破解了,但是因为只要返回值是eax寄存器等于1就可以,所以破解方法可以更简单
把调用EDP.dll的LoadLibraryA GetProAddress FreeLibrary 三个函数所在的父级调用
call XXXXXXXX
改成
mov eax,0x1
直接可以实现破解,两个都是5个字节的命令,所以可以完美替代。


Digital Romance System 引擎游戏
特征:包含GGD SE Voice WMSC .suf等文件。
EDP.dll返回值是al寄存器等于1则验证通过。
实质上每个该引擎的游戏,都包含这样相同的代码:

mov ecx,esi
call XXXXXXXX
cmp eax,0x1
jnz  YYYYYYYY
mov ecx,esi
call ZZZZZZZZ
cmp al,0x1
je AAAAAAAA

这里的代码看了看子函数过程,发现了其实际意义
call XXXXXXXX
里面是GetDriveTypeA等函数,用来验证卷的种类和卷的名称,全对的话会返回值eax等于1
call ZZZZZZZZ
里面是LoadLibraryA函数加载EDP.dll,GetProAddress函数验证正确的话返回值al等于1
所以把jnz YYYYYYYY改成jmp AAAAAAAA

即可破解所有RingProtect加密的Digital Romance System 引擎游戏

实际上半数游戏RingProtect加密到Setup.exe等安装程序上了,打开游戏程序查看每个LoadLibraryA函数,发现没有一个是加载EDP.dll的,纯属是阴天晒衣服,感觉智商受到了侮辱,游戏完全没被加密,笑死。

从RingProtect4.0开始改名为StarForce
实际上游戏同时带有RingProtect和StarForce的双重加密
表现为同时带有EDP4.dll和edpsf.dll
实质上加密主力放到StarForce(edpsf.dll)上了,EDP4.dll加密除了个别游戏,加密力度甚至不如RingProtect1.0,代码十分弱智,所以绝大部分RingProtect4.0游戏都有破解,就不讨论了。