这几天在破解リングプロテクト游戏,因为没有前辈研究,所以完全是自己在摸索,连续看了一个礼拜,也有了些经验,这里总结下,给后人留些灵感。
リングプロテクト加密,这是片假名写法,拉丁写法为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游戏都有破解,就不讨论了。
可以不错的,在看了,StarForce 劳资定要拿下你..
闲着无聊看到自己立过flag。。。。大致聊一点吧...
以游戏 avking(.SF 3.0....)为例子...思路就是
1,nop EDP4.dll的加载,
2,GetProcAddress 下面的eax,也nop,免得堆栈溢出... 有手就行了...应该可适用于 EDP4.dll,
----近现代
efdps.dll 之后的版本... 能解开这个,下面这个很快的也能解开,主要的话特征执行流程类似..
protect.dll 现代的版本,另外,由于大多数SF的资源在出炉时就被搞出来了,实际意义不是很大.,
.人生地不熟,滚回去玩别的好玩的.,.算是对SF完全回避了.。