首页
社区
课程
招聘
[原创]X舞团某外挂简单分析
发表于: 2007-10-28 23:54 28547

[原创]X舞团某外挂简单分析

2007-10-28 23:54
28547

X舞团某外挂简单分析
这个游戏曾经外挂泛滥。自从用了HS后,随着HS的进化。外挂逐渐消失。前段时间突然发现出现一个能连P.而且分数相当BT的外挂。最重要的是它能在HS的淫威下生存.对其工作方式十分感兴趣。遂IDA之。

外挂据说是在美国的TW留学生写的。aspack的壳。无anti,无花,无VM.在这个VM横行的时代.看上确实不像国人的作品.:-)

1.侦查
要分析当然先要用用.看看什么情况.这一步我没有亲自做.就问问了身边玩这款游戏的朋友.
外挂工作的时候.无论按得结果如何.在其他玩家那里都是perfect的效果.分数也是正常.(在不开启BT功能情况下).如果开了BT功能则miss一次有500W分.

从上面的信息,凭直是修改了封包,而且应该是挂在send上改的.如果是改游戏的代码.他完全可以把本地显示的效果也改了.当时HS已经是全代码段效验了.所以修改游戏代码的可能性不大.(不是不可能.有点麻烦.这个挂的作者可能比较懒).
2.验证
IDA HooK.dll.(附件里面有下载)
看导出表.有个名为HookProc的函数.

里面有个CallNextHookEx.可以判断这个外挂是通过window hook注入的游戏.

CODE:00445E04                   ; LRESULT __stdcall HookProc(int,WPARAM,LPARAM)
CODE:00445E04                                   public HookProc
CODE:00445E04                   HookProc        proc near      
CODE:00445E04
CODE:00445E04
...
CODE:00445E12
CODE:00445E14 E8 FF FE FF FF                    call    sub_445D18
...                        
...
CODE:00445E3A E8 49 08 FC FF                    call    CallNextHookEx
CODE:00445E3F 5D                                pop     ebp
CODE:00445E40 C2 0C 00                          retn    0Ch

看看注入后干了什么.进入sub_445D18

CODE:00445D18                   InstallSendHook proc near               ; CODE XREF: HookProc+10p
CODE:00445D18 53                                push    ebx
CODE:00445D19 56                                push    esi
CODE:00445D1A 51                                push    ecx
CODE:00445D1B BE 48 88 44 00                    mov     esi, offset unk_448848
CODE:00445D20 E8 1B 06 FC FF                    call    GetCurrentProcess
CODE:00445D20
CODE:00445D25 A3 64 88 44 00                    mov     ds:CurProcessHandle, eax
CODE:00445D2A 68 9C 5D 44 00                    push    offset LibFileName ; "ws2_32.dll"
CODE:00445D2F E8 CC 06 FC FF                    call    LoadLibraryA
CODE:00445D2F
CODE:00445D34 8B D8                             mov     ebx, eax
CODE:00445D36 68 A8 5D 44 00                    push    offset s_Send   ; "send"
CODE:00445D3B 53                                push    ebx             ; hModule
CODE:00445D3C E8 3F 06 FC FF                    call    GetProcAddress_1
CODE:00445D3C
CODE:00445D41 A3 60 88 44 00                    mov     ds:pWS_SEND, eax
CODE:00445D46 C6 06 B8                          mov     byte ptr [esi], 0B8h
CODE:00445D49 C6 46 05 FF                       mov     byte ptr [esi+5], 0FFh
CODE:00445D4D C6 46 06 E0                       mov     byte ptr [esi+6], 0E0h
CODE:00445D51 C6 46 07 00                       mov     byte ptr [esi+7], 0
CODE:00445D55 54                                push    esp             ; lpNumberOfBytesRead
CODE:00445D56 6A 08                             push    8               ; nSize
CODE:00445D58 68 50 88 44 00                    push    offset opcodebuffer ; lpBuffer
CODE:00445D5D A1 60 88 44 00                    mov     eax, ds:pWS_SEND
CODE:00445D62 50                                push    eax             ; lpBaseAddress
CODE:00445D63 A1 64 88 44 00                    mov     eax, ds:CurProcessHandle
CODE:00445D68 50                                push    eax             ; hProcess
CODE:00445D69 E8 CA 06 FC FF                    call    ReadProcessMemory
CODE:00445D69
CODE:00445D6E B8 F8 59 44 00                    mov     eax, offset SendProc
CODE:00445D73 89 46 01                          mov     [esi+1], eax
CODE:00445D76 54                                push    esp             ; lpNumberOfBytesWritten
CODE:00445D77 6A 08                             push    8               ; nSize
CODE:00445D79 56                                push    esi             ; lpBuffer
CODE:00445D7A A1 60 88 44 00                    mov     eax, ds:pWS_SEND
CODE:00445D7F 50                                push    eax             ; lpBaseAddress
CODE:00445D80 A1 64 88 44 00                    mov     eax, ds:CurProcessHandle
CODE:00445D85 50                                push    eax             ; hProcess
CODE:00445D86 E8 15 07 FC FF                    call    WriteProcessMemory
CODE:00445D86
CODE:00445D8B A1 60 88 44 00                    mov     eax, ds:pWS_SEND
CODE:00445D90 A3 44 88 44 00                    mov     ds:WS_SEND, eax
CODE:00445D95 5A                                pop     edx
CODE:00445D96 5E                                pop     esi
CODE:00445D97 5B                                pop     ebx
CODE:00445D98 C3                                retn

很清楚吧.一看就是挂接的send函数.注意一下挂接的方式.不是E8 E9.是
mov reg32,imm32
jmp reg32
这种挂接不太容易检测.因为reg32就有好几个.而且mov 和最后jmp之间可以插垃圾.模式匹配的检测方式不太好用了.
这个值得学习.

这下可以肯定这个挂是挂接在send上修改游戏数据来作弊的.所以别人能看见效果.而本机看不见.

只要跟入SendProc看看挂怎么解密游戏的封包和看看修改了哪些字段就知道是如何工作的了.

关于怎么在HS的淫威下生存,现在很清楚了.HS只保护了游戏.这个挂只挂接了send.而且是jmp reg32式的hook.所以Hs没有检测.
就算HS检测.也检测不到jmp reg32这种hook.
记得NP从10XX版开始就开始保护socket函数了.而且检测了jmp reg32这种hook.
HS还有待改进.

对封包的算法感兴趣的可以自己看IDA.
下面直接给出结果

byte[] RawPacketBuffer={xxxxx}//这个就是send的数据.

            int KeyLength=RawPacketBuffer[2]=Convert.ToByte((~((RawPacketBuffer[2]>>7&0xFF)|(RawPacketBuffer[2]<<1&0xFF)))&0xFF);
            int i,KeyIndex,DataIndex;
            for (i = RawPacketBuffer.Length - KeyLength-3,KeyIndex=0,DataIndex=KeyLength+3; i > 0; --i)
            {
                RawPacketBuffer[DataIndex] ^= RawPacketBuffer[KeyIndex+3];
                KeyIndex++;
                if (KeyIndex == KeyLength)
                    KeyIndex = 0;
                DataIndex++;
            }
            byte GameDataKey = Convert.ToByte( RawPacketBuffer[KeyLength + 4] - 1);
            for (i = RawPacketBuffer.Length - KeyLength - 5, DataIndex = KeyLength + 5; i > 0; --i)
            {
                RawPacketBuffer[DataIndex] ^=GameDataKey;
                DataIndex++;
                GameDataKey--;
            }
//到这里的时候RawPacketBuffer就是明文了.

具体修改哪一个字段就自己去看IDA了.:-)

有矛就有盾

怎么防御呢。
作为一个成熟的游戏。修改结构或者改变算法是不太可能的事情。太浪费人力物力。而且改了算法别人也能逆出来。

比较经济的解决方式就是效验send函数。效验方法就各显神通了。


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (52)
雪    币: 325
活跃值: (97)
能力值: ( LV13,RANK:530 )
在线值:
发帖
回帖
粉丝
2
加精前留名.

看到久违的CS代码.  未免有些激动.

说点我对封包的理解.
其实客户端对于封包处理这里块完全可以进行VM处理.
就用cv和VMP 这两种引擎混合处理 估计就够大家喝一壶的.
然后弄点反调试, 服务器端加强效验. 对于超时的封包 直接采取T 或者BAN  ID的方法。反正调试不可能不暂停游戏。(静态分析除外)
另外封包结构不是说不变。但是封包的编号可以采取及时更新的方式。2~3天就更新一次相信不是太困难。毕竟就是一些游戏结构常量。用工具处理即可(不是写到额外的文件中 就是游戏中结构定义  比如 struct{WORD ID,WORD Length,...})把其中的ID 混淆处理就行了。当然这样对于版本兼容性是一个问题。不过这样
相信外挂者解封包会花费不少时间
2007-10-29 00:24
0
雪    币: 144
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我也来留名下
2007-10-29 00:26
0
雪    币: 331
活跃值: (56)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
4
中国网络环境。对封包的延迟不可能限制太死。
而且这个是成熟的游戏。服务端做大的修改不太现实。
关于VM.VMP的性能不太清楚。CV或者themida的VM性能损失太厉害。这个即时性的游戏。根本不能接受。
代理商没有源码。韩国人是不会愿意给你两三天更新一次的。这种休闲类游戏的玩家也不能接受。
对于MMORPG倒是可以这么干。

唯一经济的解决办法就是效验一下socket函数。这样这个外挂就不能工作了。
2007-10-29 00:50
0
雪    币: 325
活跃值: (97)
能力值: ( LV13,RANK:530 )
在线值:
发帖
回帖
粉丝
5
socket 太容易绕过了。想想脱机外挂 根本不用你的客户端。看你怎么限制
在说要挂钩修改socket 用户层就有多种方法 包括熟悉的SPI 等等。
核心态 NDIS  方法就更多了。
我觉得还是防止分析比较现实。
在说VMP 加密也没有说对整个游戏全盘加密 而是对于关键的加密函数。
封包这种游戏一秒钟也就发10次包至多了
而且就你贴的这个算法而言。 对于大多数电脑而言 一秒钟处理 100,000 * 10 次也是不成问题的。当然把100,100 作为VM的性能开销并不过分。
加上这种游戏运算都放服务器端  本地基本想不出过多的CPU开销。 CPU 不用也是闲着。
反正3D 已经扔给GPU作了。

况且也不是没有游戏加Themida。
网易的游戏就比较喜欢  而且VM的不只是封包处理部分
我觉得这些关键还是在于运营商对于外挂的态度。这种休闲的免费游戏,用不用外挂基本不影响他的收入 也就无所谓了
当然没有代码也是原因
但是一般而言代理不是一点代码也拿不到,至少界面框架代码都是有的。要不怎么本地化?当然这部分代码可能根本不涉及封包部分。默哀三分钟 然后继续看CSI。
2007-10-29 01:38
0
雪    币: 331
活跃值: (56)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
6
本地话都是专人去开发公司配合的。我还真不知道哪个代理能有游戏的代码。除了自主开发的。
2007-10-29 07:38
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
楼主怎么还是不务正业啊
2007-10-29 08:33
0
雪    币: 223
活跃值: (70)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
8
hs的漏洞不是一处两处的问题
2007-10-29 10:26
0
雪    币: 331
活跃值: (56)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
9
莫谈国事。。。

归根到底。要想防WG。还是需要BT的游戏逻辑。机械的游戏怎么也防不住。

天线宝宝你咋又换马甲了?

对于VM的问题。还要考虑广大二级城市的低配置的网吧。休闲游戏不能做成硬件杀手。前段时间不是出了一个比
WOW要求还高的休闲游戏吗:-)
2007-10-29 10:44
0
雪    币: 437
活跃值: (273)
能力值: ( LV12,RANK:240 )
在线值:
发帖
回帖
粉丝
10
学习 学习    ~
2007-10-29 11:13
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
目前来讲  vm用在游戏绝对不现实   而且是封包处理
2007-10-29 12:08
0
雪    币: 325
活跃值: (97)
能力值: ( LV13,RANK:530 )
在线值:
发帖
回帖
粉丝
12
现不现实是一回事情,已经有游戏使用了 而且是普及面很广的游戏使用了是另一回事~~
(我在想网易的XX 西游 二级城市的网吧就玩起来很卡了? 据我所知他是系统要求在现在的大环境下算是比较低的,反正我还没有听到那台网吧的电脑或者说哪个朋友的电脑玩玩 XX 西游觉得很卡的 我就在2级小城市中生活(其实我觉得3级不错。 )。相信我还是比较清楚的。当然和他是2D 的有关系。但我相信和他的VM 也有关系 )
在说NP的VM 难道就不算了? 游戏不断的和NP 通信  NP 无论在驱动还是用户态都有 VM 当然壳就更著名了.NP HOOK 了  系统很多的函数 包括消息处理. 我想消息发送的频率远大于那一点点封包的处理.
2007-10-29 12:15
0
雪    币: 331
活跃值: (56)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
13
卡不卡要看VM 是否BT.
有些使用的太过分了。结果卡死一片。
而且只+游戏封包没有太多意义。能做手脚的地方太多。
做脱机的,没有几个不能还原VM的。
2007-10-29 12:18
0
雪    币: 405
活跃值: (10)
能力值: ( LV9,RANK:1130 )
在线值:
发帖
回帖
粉丝
14
我喜欢外挂,喜欢弄也喜欢破解。 多谢分享
2007-10-29 12:46
0
雪    币: 223
活跃值: (70)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
15
网易的游戏是2D,vm下相对来说还能接受
2007-10-29 12:48
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
[QUOTE=;]...[/QUOTE]
学习
喜欢看大牛们讨论问题
2007-10-29 14:54
0
雪    币: 226
活跃值: (15)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
17
你要离开,我知道很简单。
你说依赖,是我们的阻碍。
2007-10-29 15:07
0
雪    币: 331
活跃值: (56)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
18
完全不懂~~
2007-10-29 15:31
0
雪    币: 226
活跃值: (15)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
19
估计你GF懂,问她去。
2007-10-29 16:07
0
雪    币: 2134
活跃值: (14)
能力值: (RANK:170 )
在线值:
发帖
回帖
粉丝
20
blabla,hehe,十三失恋拉
2007-10-29 19:21
0
雪    币: 112
活跃值: (16)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
21
十三是不会失恋的!
2007-10-29 20:58
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
成水帖了,可惜!
2007-10-30 00:11
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
看不见你的笑
我怎么睡的着
2007-10-30 10:34
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
好帖子。
收藏了。回去慢慢看~
2007-10-30 15:09
0
雪    币: 107
活跃值: (54)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
已看完
回个吧
2007-10-30 15:59
0
游客
登录 | 注册 方可回帖
返回
//