首页
社区
课程
招聘
OD脱轩辕剑五-StarForce
发表于: 2006-8-12 18:48 27984

OD脱轩辕剑五-StarForce

2006-8-12 18:48
27984

?蘩?伍:一?凌?山海情

PEiD探壳:StarForce V3.X -> StarForce Copy Protection System [Overlay] *

?蘩?伍繁体CD版是可以通过双机模拟iSCSI绕过STARFORCE的(参考游侠网上文章),脱壳前要先能双机进游戏,或者如果有正版也行

安装完后先观察目录,所有文件包括动画都有,而且只要一开始通过了StarForce验证后,即使拿出盘也可以玩,这就是说只要脱了壳就可免CD

OD加载swd5.exe,还没见到入口就挂了

注意游戏目录下有个文件binkw32.dll,这个显然是播放BIK动画的
STARFORCE再流氓总不能程序异常出错连个非法操作也不跳出来吧?抓住这个问题就可以把OD载进去
先修改binkw32.dll中有个函数_BinkOpen(从名字可以猜出来播放动画肯定要调用它),在此函数入口加个int3
运行游戏,一放开场动画果然非法,事先把OD设为默认调试器,这个时候点调试就可以乘虚而入了

大概调了一下发现F8,F7是不行的,会被SF发现,不过既然SF买int3的帐,当然就可以F2+F9,这样和F8也差不多,只是麻烦一点

利用binkw32.dll断下来后就可以DUMP了,抓下来IDA一看,没想到代码居然没有变过型,入口很清楚,就在0065D00E处,而且IDA还可以把VC库函数都识别出来,SF在这方面倒是挺安分的...

但这不是在OEP脱的,为什么非要在OEP呢?因为在OEP时全局变量没有被动过,这是非常重要的
举个例子,以上在binkw32.dll中断所DUMP的文件,即使把OEP,IAT修复还是会出错,这个错误出在EnterCriticalSection,因为VC的启动代码会初始化一个临界区全局变量,就是mlock.c中的PCRITICAL_SECTION _locktable[_TOTAL_LOCKS],而上面所DUMP文件中这个量并非为0,因此启动代码会认为已经初始化,从而跳过初始化过程,所以EnterCriticalSection时传递的就是无效临界区
程序一旦经历了后面的代码,全局变量也就不同了,人一旦经历了有些事,也就不再是原来那个人了,现在的尔玛再回山里放羊又焉能心境淡远如初?所以这么DUMP是不行的,就算可以把引起异常的变量都一一修复掉,那些不会引起异常的逻辑错误又怎么办?有些内在的东西一旦变了,不是那么容易就能变回去的

所以还是要在OEP处DUMP,OD根本无法在调试状态下运行游戏,怎么停在OEP呢?
别忘了SF发现没放光盘还会提醒放入后重试,乘此良机又可钻进去:
先拿出光盘,运行swd5.exe,此刻kernel32.dll等文件都已经加载到内存,用WinHex编辑内存,修改GetVersion最后一行ret为CC,我的机器上这个地址是7C8114DB,然后放入光盘,点重试,SF是很给CC面子的,于是乖乖的在GetVersion非法
此时DUMP的文件只要修正下入口点就算是在OEP处DUMP的了

然而IDA载入后却发现很多库函数都残废了,只有到运行时SF才会补上代码,想要精神和肉体都同时不受束缚怎么可能?现实总是充满矛盾
幸而在CPU里发生的事没有那么残酷,两全其美还是可能的
binkw32.dll处DUMP精神残废肉体健全,GetVersion处DUMP肉体残废精神正常,既然如此不妨各取其完好的地方重新拼装一个:
VC的全局变量段在IDA里很好识别的,swd5.exe的变量段就是006BD000处大小为297000的_brick段
将OEP处DUMP文件中的这个段保存下来并复制到binkw32.dll处DUMP的文件,这个文件就同时具有正确的代码和变量

但它仍然不健全,开两个OD加载DUMP的文件和在停在GetVersion的文件,打开内存镜像对比,会发现DUMP的文件少了很多快内存段
这些内存段是SF动态申请的,每次地址都不同,我脱壳时这种内存有57块,地址从1220000到02200000,大小各不相同,1000,10000,40000...
这些里面放的是SF初始化后的变量,大概是用了SDK的原因,因为全局变量中有指向这些动态内存的指针,试想在OEP时什么都没运行,怎么会有静态指针指向动态数据?可能的解释只能是一部分变量由SF初始化(这里面包括当前的游戏目录字符串)

这样的话只好写个loader修复了,内存段太多,不可能全保存到exe里,我写了个由ini配置文件载入段的loader,在附件中
在OEP处将57个段保存下来并DUMP修复全局变量段,同时保存IAT(addr=00697FFC size=340)这时用loader先载入内存段,加CC中断在OEP,再用OD载入调试,再载入IAT,这时F9已经可以免CD运行游戏了,SF所HOOK的IAT指向了那57个内存段,虽然没有识别出来,不过运行是没问题的

IAT没有识别毕竟遗憾,但这时的程序已经脱离了老流氓的魔抓,可以用OD正常调试,要修复IAT还会难吗?
imprec分析后大概有20多个函数未知,用OD载入一一修复,这些函数是SF模拟了部分系统代码,对比一下还是容易识别出来的
比如00698060这个IAT干脆没有调用任何API,不过其中有一行指令shrd eax,edx,18
只要在kernel32.dll模块中搜索这个指令很容易发现00698060就是kernel32.GetTickCount
再比如006980FC壳代码有一行mov eax,dword ptr ds:[7C88303C],搜索此行发现是IsBadReadPtr
后面有个把API指令不怎么特殊,搜索不管用了,可以让OD分析user32.dll,kernel32.dll,然后call到系统DLL里时根据交叉参考分析出来
比如006982D4这个IAT,壳代码先调用了77D184D0,进入user32.dll,OD中间的窗口显示有所有call到这里的来源,点开"显示全部跳转和局部调用"那个窗口,一一查看,因为壳代码调用完77D184D0接着就调用了77D1B65A,所以只要看哪一个下面有call 77D1B65A,很快就发现这是GetClientRect
比较邪的就是HeapAlloc/HeapFree这两个函数,如果系统是XP直接定向到ntdll里,在kernel32.dll里干脆没这个符号(感谢blackthink,DiKeN,Erika,bbbsl几位朋友的帮助)
另外,有好几个函数在IDA里可看到有库函数调用,这就更容易,只要打开VC6的库函数代码对比一下就发现了
附件中有一个完整的IAT

修完IAT后可以不用OD载入,直接用loader载入内存段就能运行,进一步处理懒得弄了(游戏目录被定死)

轩辕剑5是个好游戏,在大陆上市了我肯定会买正版的,如今象大宇这样还在做单机RPG的公司不多了,而且简体版马上要在大陆发行,各位朋友要是做出免CD补丁,烦请别放到网上,以保护正版

DonQuixote[CCG][iPB]
Email:DonQuixote@mail.nankai.edu.cn
2006/8/12


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 7
支持
分享
最新回复 (49)
雪    币: 234
活跃值: (370)
能力值: ( LV9,RANK:530 )
在线值:
发帖
回帖
粉丝
2
只能学习:)
2006-8-12 19:23
0
雪    币: 50161
活跃值: (20625)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
3
谢谢DonQuixote好文
论坛上的StarForce 相关文章不多,估计那些搞游戏破解的人很熟悉这块。

搜索了一下,论坛上找到2篇:

http://bbs.pediy.com/showthread.php?threadid=12704
http://www.pediy.com/bbshtml/bbs5/pediy50380.htm
2006-8-12 19:27
0
雪    币: 98729
活跃值: (201034)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
4
sustain.
2006-8-12 20:25
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
唉,牛人,防不胜防啊。
2006-8-12 20:39
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ToT
6
只能学习
2006-8-12 20:39
0
雪    币: 260
活跃值: (102)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
7
那个 Illustrator 的试用版好像也用StarForce加的壳
2006-8-12 21:01
0
雪    币: 304
活跃值: (82)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
8
高手啊,sf的壳我是想都没想过去脱~~~
国内认真研究StarForce的好象不多
感觉国外的多一些.

轩五出来了?我等了好久,想不到我消息这么不灵通,居然才知道~~~
自己bs一下
2006-8-12 22:08
0
雪    币: 338
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
收藏...慢慢学习!!
2006-8-12 22:10
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
楼主已经到了摘叶片花就能杀人的境界了
一个16进制winhex就楼主用得出神入化
并且很多思路都很经典,很启发,佩服佩服!!!
2006-8-12 22:23
0
雪    币: 135
活跃值: (226)
能力值: ( LV12,RANK:330 )
在线值:
发帖
回帖
粉丝
11
呵呵,感谢老大加精,五颗星了
不知是轩辕剑5的StarForce版本太老还是SDK运用不纯熟,这个驱动壳居然可以在3ring下蒙汗药做了
以此思路似乎可以写出脱壳机了,至少是半自动的脱机
2006-8-12 22:27
0
雪    币: 135
活跃值: (226)
能力值: ( LV12,RANK:330 )
在线值:
发帖
回帖
粉丝
12
轩5繁体版前几天在台湾上市了,有BT下载,不过必须要有两台机器或者有刻录机才能玩,很麻烦,简体版过几天会在大陆上市
2006-8-12 22:43
0
雪    币: 250
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
学习
2006-8-12 23:12
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
支持。。。。。
2006-8-13 01:24
0
雪    币: 417
活跃值: (475)
能力值: ( LV9,RANK:1250 )
在线值:
发帖
回帖
粉丝
15
好文收藏!
2006-8-13 06:14
0
雪    币: 325
活跃值: (97)
能力值: ( LV13,RANK:530 )
在线值:
发帖
回帖
粉丝
16
终于文章出了 昨天我整了一天都没有把轩辕剑5 安装好。。 顶死你
2006-8-13 11:38
0
雪    币: 172
活跃值: (212)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
膜拜中......
2006-8-13 12:02
0
雪    币: 254
活跃值: (126)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
18
精彩超乎想象

Erika是谁?
2006-8-13 12:14
0
雪    币: 398
活跃值: (343)
能力值: (RANK:650 )
在线值:
发帖
回帖
粉丝
19
功能如此强大
blackthink是谁?
2006-8-13 12:17
0
雪    币: 135
活跃值: (226)
能力值: ( LV12,RANK:330 )
在线值:
发帖
回帖
粉丝
20
晕啊。。。两位老大怎么没在iPB-Crypto的群里??
昨天被HeapFree弄的很烦,在OD里Ctrl+G HeapFree提示没这个符号,后来他们在群里解答了
2006-8-13 12:26
0
雪    币: 50161
活跃值: (20625)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
21
最初由 DonQuixote 发布
晕啊。。。两位老大怎么没在iPB-Crypto的群里??
昨天被HeapFree弄的很烦,在OD里Ctrl+G HeapFree提示没这个符号,后来他们在群里解答了


凭我感觉,说不定回答问题就是楼上2位
2006-8-13 12:28
0
雪    币: 135
活跃值: (226)
能力值: ( LV12,RANK:330 )
在线值:
发帖
回帖
粉丝
22
最初由 kanxue 发布
凭我感觉,说不定回答问题就是楼上2位

老大好厉害,果然是。。。群的名称和QQ名称不一样。。
2006-8-13 12:31
0
雪    币: 216
活跃值: (224)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
23
佩服~~~~~~~~
2006-8-13 14:35
0
雪    币: 207
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
24
唉我第一步就错了,连壳也没脱掉………………
2006-8-13 14:38
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
楼主强,膜拜一个。
多多学习。
2006-8-13 19:51
0
游客
登录 | 注册 方可回帖
返回
//