你可能感兴趣的开发商游戏
开发商信息
CBE software s.r.o.是一家专门研发android安卓游戏等游戏的开发商,CBE software s.r.o.的主要游戏开发类型包括等...
CBE software s.r.o. 游戏排行榜
顶级开发商
共13款游戏
共39款游戏
共23款游戏
共22款游戏
共15款游戏
共32款游戏
共44款游戏
共14款游戏
共43款游戏看雪安全论坛 -
【求助】破解某一游戏多开的艰难历程,各位大大给些思路!
(/index.php)
(/forumdisplay.php?f=20)
(/showthread.php?t=81224)
【求助】破解某一游戏多开的艰难历程,各位大大给些思路!&
某一游戏,无壳,无反调试、使用VC++编写的。但是只能双开,限制多开。
之前是使用如下方法限制多开的:
/MutexName
movs byte ptr es:[edi], byte ptr&; |
|InitialOwner =& FALSE
|pSecurity =& NULL
FF15 CCF07800 call
dword ptr [&&KERNEL32.CreateMute&; \CreateMutexA
dword ptr [ebx+14], eax
eax, dword ptr [esp+114]
|MaximumSizeLow
|MaximumSizeHigh =& 0
|Protection = PAGE_READWRITE
|pSecurity =& NULL
|hFile = FFFFFFFF
dword ptr [ebx+8], |保存申请的内存映像的大小
FF15 C8F07800 call
dword ptr [&&KERNEL32.CreateFile&; \CreateFileMappingA
判断是否创建文件映像成功,
dword ptr [ebx],
将文件映像的句柄保存到全局变量中,这是个申请的变量空间
short 00433E15
如果创建成功则跳转
dword ptr [ebx+10], esi
dword ptr [ebx+C], esi
创建失败,返回0
FF15 88F27800 call
dword ptr [&&KERNEL32.GetLastErr&; [GetLastError
3D B7000000
判断是否是之前已经创建一个实例
short 00433E2A
dword ptr [ebx+10],
之前已经创建了实例,则将[1AAB538+10]置1,否则为0
dword ptr [ebx+4],
[1AAB538+4]=0
dword ptr [ebx+C],
[1AAB538+C]=1
将00433E25
short 00433E2A
改为jmp short 00433E2A
就可以无限多开了。此时,还可以用多用户,沙盘等工具多开,
[COLOR=&Red&]但是最近游戏又进行了更新,在选择服务器后登陆游戏的时候,又增加了一个检测, 一直显示“登陆重试”,大概1分钟以后,提示处一个对话框“登陆客户端过多”。然后就关闭游戏了。
这样采用多用户、沙盘都不能多开了。
各位大大们能给提供个思路吗,后面它采取的是那种方法判断多开的,感觉不是根据mutex,findwindows,我用hidetoolz将游戏隐藏也是不可以的。
我现在的思路是,用OD断到了“登陆客户端过多!”对话框,然后根据堆栈,一步往前推,看是在那个父函数中进行多开判断的:结果到下面的这个函数就彻底晕了,没看明白意思:[/COLOR]
64:A1 0000000&mov
eax, dword ptr fs:[0]
保存FS到EAC
68 98CD7400
dword ptr fs:[0],
保存 ESP到FS
申请局部变量空间
ebx, dword ptr [esp+2C]
将第2个输入参数给EBX
压栈EBP,ESI EDI
edi, dword ptr [esp+34]
将第一个参数给EDI
ebp, dword ptr [edi+30]
EBP=[pam1+30] pam1为参数1
ebp第一个参数的30字节处的内容,是malloc空间
short 0044CB5C
判断parm2 是否为0,为0则跳转
将第一个参数传给ECX,作为输入参数
E8 EBE7FFFF
此函数根据[parm+10]的数值更改[parm+c]的值
判断返回值,如果为0则跳转
short 0044CB51
一般都跳转
E8 BEFFFFFF
short 0044CB24
B8 0A000000
ecx, dword ptr [esp+14]
64:890D 00000&mov
dword ptr fs:[0], ecx
eax, dword ptr [esi]
E8 E3E6FFFF
E8 D9D00800
short 0044CB51
ecx, dword ptr [esp+14]
64:890D 00000&mov
dword ptr fs:[0], ecx
eax, dword ptr [edi+44]
EAX=[parm1+44]
判断是否为0,为0则跳转
eax, dword ptr [edi+44]
一般不为0,再次判断
从函数入口处跳转过来,根据parm2的值,为0则跳转这里
short 0044CB6D
一般不跳转
esi, dword ptr [eax]
ESI=[parm1+44]
eax, dword ptr [eax+C]
EAX=[[parm1+44]+C]
dword ptr [edi+44],
[parm1+44]=[[parm1+44]+C]
short 0044CB86
可能是在进行链表的操作,感觉上是删除链表的节点
eax, dword ptr [ebp]
EAX=【EBP】=【[parm1+30]+8】
判断是否为0,不为0则跳转
short 0044CB7B
dword ptr [edi+44], eax
short 0044CB86
ecx, dword ptr [eax+C]
ECX=[[[parm1+30]+8]+C]
dword ptr [edi+44],
[parm1+44]=[[[parm1+30]+8]+C]
edx, dword ptr [ebp]
EDX=[[parm1+30]+8]
esi, dword ptr [edx]
ESI=[[[parm1+30]+8]]
跳转到这里 EBP=0 EBP可能是参数
E8 F311FDFF
EBP原来=【parm1+30】 ESI是返回值
EAX为返回值,是个根据系统时间除得到的数值
dword ptr [esp+14],
EDX也是返回值之1
0F84 C1010000 je
EBP原来是0,现在变为了1
81FD E8030000 |cmp
比较EBP和1000,小于等于则跳转
short 0044CBC8
E8 D711FDFF
ebp, dword ptr [esp+14]
0F8F B8010000 |jg
short 0044CBC6
3D E0930400
eax, 493E0
0F87 AB010000 |ja
eax, dword ptr [esi+4]
EAX=[[[parm1+30]+8] +4]
Switch (cases 0..19)
判断是否是分支19,大于则跳转
到这ECX没用了,清0
8A88 6CCE4400 |mov
cl, byte ptr [eax+44CE6C]
根据EAX的数值进行分支跳转
FF248D 54CE44&|jmp
dword ptr [ecx*4+44CE54]
Case E of switch 0044CBCB
68 A04D8100
e:\gbox\public\script\gobjscript.cpp
E8 1E13FCFF
语句错误:sentence_continue
E8 6114FCFF
E9 3E010000
68 9C040000
Case F of switch 0044CBCB
68 A04D8100
e:\gbox\public\script\gobjscript.cpp
E8 FA12FCFF
68 3C528100
语句错误:sentence_break
E8 3D14FCFF
E9 1A010000
ecx, dword ptr [esi+8]
Case C of switch 0044CBCB
0F85 6A010000 |jnz
short 0044CC49
dword ptr [edi+44], esi
E9 FC000000
esi, dword ptr [esi+10]
dword ptr [edi+44], esi
E9 F1000000
al, byte ptr [edi+4E]
Default case of switch 0044CBCB
判断[EDI+44]是否为0
short 0044CC63
eax, dword ptr [esi+14]
不为0,则EAX=[ESI+14]
判断AH是否等于40,不等则跳转
short 0044CC9A
eax, dword ptr [esi+14]
short 0044CC8B
edx, dword ptr [esi+18]
eax, dword ptr [esi+18]
ecx, dword ptr [edx+4]
dword ptr [esp+1C], ecx
edx, dword ptr [edx+8]
dword ptr [esp+20], edx
short 0044CC9A
eax, dword ptr [esp+38]
short 0044CC91
ecx, dword ptr [esp+38]
E8 39B60900
eax, dword ptr [esi+4]
EAX=[[[parm1+30]+8]]
Switch (cases 1..14)
EAX&13则跳转
dword ptr [eax*4+44CE88]
Case 1 of switch 0044CC9D
E8 1A8C0900
short 0044CD24
Case 2 of switch 0044CC9D
E8 108D0900
short 0044CD24
Case 4 of switch 0044CC9D
E8 D68D0900
short 0044CD24
Case 13 of switch 0044CC9D
0044CCCD &|.
E8 9C8E0900
short 0044CD24
(initial cpu selection)
Case 14 of switch 0044CC9D
short 0044CD24
Cases 7,8,9 of switch 0044CC9D
E8 B8950900
short 0044CD24
Case B of switch 0044CC9D
E8 8E970900
short 0044CD24
Case 3 of switch 0044CC9D
E8 D49A0900
short 0044CD24
Cases A,11,12 of switch 0044CC9D
E8 6A9F0900
short 0044CD24
Case D of switch 0044CC9D
E8 F0A00900
short 0044CD24
Case 5 of switch 0044CC9D
E8 A6A20900
short 0044CD24
Case 6 of switch 0044CC9D
E8 1CA40900
|.^ 0F84 DFFDFFFF |je
cl, byte ptr [edi+4D]
short 0044CD3C
0F85 FF000000 |jnz
0F84 F6000000 |je
eax, dword ptr [edi+44]
Cases 0,16,17,18 of switch 0044CBCB
short 0044CD5C
esi, dword ptr [eax]
edx, dword ptr [eax+C]
dword ptr [edi+44], edx
|.^ 0F85 3FFEFFFF \jnz
Case 19 of switch 0044CBCB
ecx, dword ptr [esp+14]
64:890D 00000&mov
dword ptr fs:[0], ecx
68 8E040000
68 A04D8100
e:\gbox\public\script\gobjscript.cpp
E8 9011FCFF
code run too match. over 3
E8 D312FCFF
ecx, dword ptr [esp+14]
64:890D 00000&mov
dword ptr fs:[0], ecx
68 A5040000
68 A04D8100
e:\gbox\public\script\gobjscript.cpp
E8 5C11FCFF
goto格式不匹配
E8 9F12FCFF
ecx, dword ptr [esp+14]
64:890D 00000&mov
dword ptr fs:[0], ecx
Case 10 of switch 0044CC9D
E8 1C990900
ecx, dword ptr [esp+14]
64:890D 00000&mov
dword ptr fs:[0], ecx
eax, dword ptr [esp+34]
Default case of switch 0044CC9D
E8 2D840900
eax, dword ptr [eax]
68 F8518100
未知语句:%s
dword ptr [esp+34], 0
E8 768A0900
68 2900DF00
E8 F912FCFF
ecx, dword ptr [esp+34]
C74424 2C FFF&mov
dword ptr [esp+2C], -1
E8 7562FBFF
ecx, dword ptr [esp+24]
B8 0B000000
64:890D 00000&mov
dword ptr fs:[0], ecx
rc3.0044CD45
分支表 被用于 0044CBDC
rc3.0044CC2B
rc3.0044CBE3
rc3.0044CC07
rc3.0044CD5C
rc3.0044CC54
分支 0044CE54 索引表
rc3.0044CCAE
分支表 被用于 0044CCA7
rc3.0044CCB8
rc3.0044CCF4
rc3.0044CCC2
rc3.0044CD12
rc3.0044CD1C
rc3.0044CCE0
rc3.0044CCE0
rc3.0044CCE0
rc3.0044CCFE
rc3.0044CCEA
rc3.0044CDF7
rc3.0044CD08
rc3.0044CDF7
rc3.0044CDF7
rc3.0044CDDC
rc3.0044CCFE
rc3.0044CCFE
rc3.0044CCCC
rc3.0044CCD6
这个游戏登陆的流程是这样的:
1、A.EXE 输入用户名和密码,然后登陆到服务器选择画面,这里没有多开限制
2、选择登陆后,运行B.EXE. 在B.EXE中进行多开限制。
b.exe运行过程中,会有个loading的显示。如果在这是立刻暂停OD,然后再开其他客户端,然后再在loading画面暂停OD,再运行,当开了自己想要上的号后,比如6个,然后再把之前暂停的那些客户端再运行是可以多开的。
你发的代码貌似不能看出来怎么限制多开的,你自己也分析得比较清楚,
还是找到的关键点不对,分析有点徒劳,
说到底多开还是要靠API还断判断,所以看看游戏的导入函数看看可有可疑的API
很想知道你这弄的什么游戏,我也研究研究外挂,有空一起学习啊,留个消息啊!
什么游戏啊 这么神秘 能说说不。。
给个游戏名
要不没有办法看
游戏叫《浪漫庄园》,如果谁弄到多开了,请在此分享一下方法,谢谢了。
所有时间均为北京时间, 现在的时间是 .
&&& 看雪学院()
| 提供带宽资源
|&微信公众帐号: