首页
论坛
课程
招聘
[原创]一个大型网游多开实例
2007-2-25 19:27 26257

[原创]一个大型网游多开实例

2007-2-25 19:27
26257
找到一个没加壳的半免费网游(网游的名字就不说了),分析其双开方式。
大概“某人们”早就对它动过手脚了,只是没看到有人公布。
经过几天的试用,至今没有发现这种破法有问题。(由于是几天以前破的,现在回忆起来可能会有点出入,还是希望读者以实际为准,灵活应变^_^)
本文仅仅作为研究用,不可作其他用途……
///////////////////////////////////

经过简单的观察,猜测执行桌面快捷方式后打开的是一个自动Update的程序,该程序每天更新其核心。
继续观察,发现Update程序完成后直接用CreateProcess之类的方法运行那个核心文件。核心文件通过分析命令行参数来指定登陆服务器(官服,不是私的)。

于是开始下手:

首先自己写一个程序 ShowCmdLine.asm :

.386
.model flat, stdcall
option casemap :none

include windows.inc
include user32.inc
include kernel32.inc
include masm32.inc

includelib user32.lib
includelib kernel32.lib
includelib masm32.lib
include macro.asm
.data
mytitleA db 'GetCmdLine()',0
.data?
        buffer        db 100 dup(?)
       
.CODE
START:
       
        invoke GetCommandLine
        invoke MessageBox,NULL,eax,offset mytitleA,MB_OK
        invoke ExitProcess,0
       
end START

编译它,重命名成网游的核心文件名,放到网游目录下。正常步骤运行之…………
Oh,Ja!事实证明了猜想。选择任意一个服务器测试,记下那个服务器所对应的参数(我玩的服务器参数是1rag21,这个字眼熟悉吧~应该有许多人知道这是什么网游了,我也不能多说,不知道的自己google一下吧)。

打开IDA,分析原来的核心(文件满大的~要有耐心)。在等待IDA分析的时候多看看import table,找找看有什么可疑的函数……
大多人首先会找FindWindow之类的……没错!
从IDA的Imports中看到

CreateMutexA 和 FindWindowA

不管怎样,这两个不可不防。
改之!
在FindWindowA上按下'X',得到FindWindowA函数的xrefs(嘻嘻,只有一处):

..........
.....       call FindWindowA
.text:0064CFCF                 test    eax, eax
.text:0064CFD1                 jz      short loc_64CFDC
.......

如果没有FindWindow到,就注册个窗体类,再建立一个窗口。
没话说,改成 xor eax,eax (只改动了一个字节的机器码,不能改长度)。

然后处理CreateMutexA:
同样按下'x',得到xrefs
这里的CreateMutexA的调用大概有5处左右。
每处的代码类似:

.text:006517F2                 call    ebx ; CreateMutexA
.text:006517F4                 mov     esi, eax
.text:006517F6                 test    esi, esi
.text:006517F8                 jnz     .....

jnz到的每个地方(只有两个实例,其他都是重复的)一开始都是GetLastError,如:

.text:00651843                 call    ds:GetLastError
.text:00651849                 cmp     eax, ERROR_ALREADY_EXISTS

这里有个技巧,把 cmp eax, ERROR_ALREADY_EXISTS 改成比如 cmp eax,00000001 之类的其他错误代码,建议直接修改机器码,否则要注意不能改变文件长度,或者应该用nop填充……

保存修改完的结果。

为了绕过Updater,迅速启动游戏,由于那个核心文件不是.exe为后缀的。写个程序来调用它:
.386
.model flat, stdcall
option casemap :none

include windows.inc
include user32.inc
include kernel32.inc
include masm32.inc

includelib user32.lib
includelib kernel32.lib
includelib masm32.lib
include macro.asm
.data
ErrorTitle db 'Error',0
ErrorMsg db '不能运行',0
.data?
        buffer        db 100 dup(?)
.CODE
START:
        invoke StdIn,offset buffer,100
        invoke lstrlen,offset buffer
        dec eax
        mov BYTE PTR buffer[eax],0
        dec eax
        mov BYTE PTR buffer[eax],0
        invoke WinExec,offset buffer,SW_SHOW
        cmp eax,31D
        jg @f
        invoke MessageBox,NULL,offset ErrorMsg,offset ErrorMsg,MB_OK
@@:        invoke ExitProcess,0
end START

link的时候加上 /subsystem:console。

通过这个程序间接调用游戏核心程序(其实应该说成是主程序),别忘了加上参数指定服务器(否则……)。

…………
………………
……………………
……………………………
…………………………………
…………………………………………
………………汗~~还是不能双开。

别着急,来动态调试它。
我用OllyDebug,主要因为它和Tc的快捷键基本相同,以前TC用了相当长的时间……
我用的计算机速度相当慢(P3-667,15G硬盘)。
有经验的无产阶级们不必等着OllyDbg分析完整个程序,在OD进度调缓慢移动的时候按下空格,阻止OD分析。
(虽然本菜鸟没有经验,但是由于计算机配置的限制,也只能加载完不等分析把它停了。)如果实在对动态加载显示的Call来Call去摸不着头脑,可以对照着刚才IDA的分析结果。但是相信只要稍微熟悉VC6的rtl就不会有大问题。

大可在很后面的地方按下F4,因为前面的障碍在静态分析的时候都已经扫除了!

跳跃着动态F4在其中一个可疑的地方停下(似乎应该是这里,记得不是很清楚了。不过,既然本菜鸟都可以一眼看出来,相信大家……)

.text:0064E1E9                 call    ds:CreateMutexA
.text:0064E1EF                 push    eax             ; hHandle
.text:0064E1F0                 call    ds:WaitForSingleObject
.text:0064E1F6                 test    eax, eax               ;!!!!!!!!!!!
.text:0064E1F8                 jz      short loc_64E208

大概是刚才分析CreateMutexA的时候漏了这里,把这里也补成 xor eax,eax
再运行一遍……Gut!成功了。
顺便针对玩家(不是为了研究的那种)说一下,该文件每天更新,如果用旧版本则无法进入游戏,写个程序打打补丁吧。

总共Patch了4个字节,应该算是改动比较少的,其他几组核心程序改法也类似。

总结:
这个程序利用了普遍应用的CreateMutex以及FindWindow来保证程序只运行一个实例。该破解过程属于简单类型。

!!!再次声明,本文仅为讨论技术,作者不承担任何责任。

/*
跋:
打完字后没校对,用拼音打的,若有错别字自己估摸一下。
大一下半个没计算机课的学期马上要开学了,计算机水平上个学期里一点也没有长进,还是停留在高中阶段。趁寒假没结束,独立crack一次做个纪念。
Auf Wiedersehen!
2007年2月下旬
*/

【看雪培训】《Adroid高级研修班》2022年夏季班招生中!

收藏
点赞0
打赏
分享
最新回复 (33)
雪    币: 200
活跃值: 活跃值 (11)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
wuchuanren 活跃值 2 2007-2-25 19:39
2
0
这个论坛怎么这么多限制,
昨天注册的用户到今天才能发帖……
而且今天还只能在新兵论坛里发帖……
晕了。。。

上面那个是我在2月22日破解的。到今天一直很好用。

如果看完后仍然没有弄清楚,或者跟帖怕违规,
请联系邮箱: wuchuanren@gmail.com

//////////////////////////////
趁寒假没有结束再写个万能界面库。(所称做万能,是因为可以加载到大部分代码上,甚至可以动态用在手头没有代码的已编译好的可执行文件上)
现在网上的skin lib都要收费,或者就是弹出广告。

今天下午开始写,把"Button"类WM_PAINT消息的核心完成了,剩下WM_MOUSEMOVE/WM_LBUTTONDOWN/WM_LBUTTONUP/WM_MOUSELEAVE/WM_FOCUS 之类的似乎很复杂。

欢迎提示与指教
雪    币: 521
活跃值: 活跃值 (151)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
笨笨雄 活跃值 14 2007-2-25 20:01
3
0
限制已经很少了。。。
雪    币: 200
活跃值: 活跃值 (11)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
wuchuanren 活跃值 2 2007-2-25 20:26
4
0
感谢版主了
雪    币: 246
活跃值: 活跃值 (11)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
Isaiah 活跃值 10 2007-2-25 23:50
5
0
RO能这样轻松的调试??
雪    币: 521
活跃值: 活跃值 (151)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
笨笨雄 活跃值 14 2007-2-26 08:54
6
0
大概是那些游戏保护程序和更新程序一起启动吧,他自己写加栽器,就绕过了?
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
沙漠绿水 活跃值 2007-2-26 09:02
7
0
写得非常详细呀,谢谢,
雪    币: 200
活跃值: 活跃值 (11)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
wuchuanren 活跃值 2 2007-2-26 14:22
8
0
最初由 Isaiah 发布
RO能这样轻松的调试??


就是因为没有加壳又可以轻松调试才想到patch的。
可能Sdo对它放弃了……
雪    币: 200
活跃值: 活跃值 (11)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
wuchuanren 活跃值 2 2007-2-26 14:39
9
0
至于那个万能界面库~
今天在GDI中钻得一头雾水……没有完全完成。并且在已经写好的代码中还有许多BUG。都是对GDI不熟悉引起的。

节约点空间,帖个release,只子类化了普通的button,重画BUTTON的时候不知道用什么函数去除原来的Rectangle
并且想知道怎样既不影响正常的"BUTTON"类处理消息,又可以不让默认函数画出丑陋的按钮
陷入矛盾中……

http://wuchuanren.googlepages.com/Try2.rar
雪    币: 202
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
caifox 活跃值 2007-2-27 07:05
10
0
写得非常详细呀,谢谢,
雪    币: 207
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kissyll 活跃值 2007-5-14 09:18
11
0
楼主比我厉害多了
雪    币: 207
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kissyll 活跃值 2007-5-14 09:28
12
0
创建原子的方法也可以防止多开
雪    币: 104
活跃值: 活跃值 (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lsylmxl 活跃值 2009-8-3 09:59
13
0
  试试 看~~
雪    币: 237
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Macdef 活跃值 2009-8-6 09:48
14
0
支持楼主的原创
雪    币: 105
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
helyna 活跃值 2009-8-6 14:50
15
0
挖坟
雪    币: 42
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zzxxaa 活跃值 2009-8-6 15:11
16
0
不错学习学习嘿嘿
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
liuyes 活跃值 2009-8-8 20:40
17
0
多开就可以互刷了吧,呵呵
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zclmoon 活跃值 2009-8-13 09:07
18
0
很好很强大
雪    币: 222
活跃值: 活跃值 (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
serverking 活跃值 2009-8-17 15:40
19
0
学习了,,顶一顶!!!
雪    币: 0
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
chuchu 活跃值 2009-8-20 09:15
20
0
截个图才好
雪    币: 244
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
valenjason 活跃值 2009-8-22 16:06
21
0
是RO游戏?
雪    币: 208
活跃值: 活跃值 (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
foresee 活跃值 2 2009-8-28 08:53
22
0
mark,过时了
雪    币: 38
活跃值: 活跃值 (33)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
DarkFirer 活跃值 2009-8-30 17:33
23
0
貌似地下城就可以这样破解了。该多爽!
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
gumao 活跃值 2009-9-2 14:40
24
0
大家对破解网游热情很高嘛~
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
晶晶天河 活跃值 2009-9-11 14:48
25
0
我是菜鸟 看的不怎么明白
游客
登录 | 注册 方可回帖
返回