53魔力发布网,提供最好最新的开机信息

查看完整版本: 诛仙答题分析(转载)

妖哥 2007-11-24 22:26

诛仙答题分析(转载)

诛仙答题挂制作介绍材料,供参考

本文仅供程序爱好者学习交流之用,如有人用于其他用途,本人该不负责。

以下内容中S代表游戏服务器,C代表游戏客户端,X代表游戏外挂,MS代表自己做的外挂答题服务器,MC代表自己做的外挂专用答题程序

提问封包(S->C)解密后格式如下:
示例1
00000000h: 93 A7 5A 2C 2C C3 D9 00 00 00 01 73 BF 08 CB 00 ; 摟Z,,觅....s??
00000010h: 00 00 01 05 16 F7 8B EE 95 E5 4E 0B 4E A1 8B 97 ; .....鲖顣錘.N?
00000020h: 7B 19 95 EF 8B 84 76 2F 66 1F FF 0C 38 00 D7 00 ; {.曪媱v/f.?.?
00000030h: 35 00 3D 00 34 00 36 00 0C 39 00 0B FF 32 00 3D ; 5.=.4.6..9..?=
00000040h: 00 31 00 31 00 0C 37 00 D7 00 38 00 3D 00 35 00 ; .1.1..7.?8.=.5.
00000050h: 36 00 0A 37 00 0B FF 31 00 3D 00 38 00          ; 6..7..?=.8.
介绍下内容
93 A7 是标志位,表示是提问封包,其中93是所有防外挂的封包专用标志位,后面跟的A7代表是提问封包。
5A是封包长度,不包含93 A7 5A本身,也就是说,该字节后面的所有信息的字节数,大家可以数数从2C 2C 到最后的3D003800一共就是5AH个字节。
2C2Cc3D9是角色ID,00 00 00 01目前不清楚,下面会提到,73BF08CB是问题序号递增的,即使相同问题,只要时间不同,这个序号肯定不同。
00 00 00 01不确定,但是可能和前面那个00 00 00 01表示单选题,我没测试,这两个01里至少有一个是表示单选,有兴趣的可以试试看看究竟哪个表示单选。
05 表示问题+答案一共5条,也就是说问题1条,答案4条。
接下来就是同样的格式,第一个字节表示长度,然后紧跟数据:
16 表示问题是16H个字节 也就是
F7 8B EE 95 E5 4E 0B 4E A1 8B 97 ; .....鲖顣錘.N?
00000020h: 7B 19 95 EF 8B 84 76 2F 66 1F FF
0C表示第一个答案是0CH长 也就是
38 00 D7 00 ; {.曪媱v/f.?.?
00000030h: 35 00 3D 00 34 00 36 00
0C表示第二个答案是0CH长 也就是
  39 00 0B FF 32 00 3D ; 5.=.4.6..9..?=
00000040h: 00 31 00 31 00
0C表示第三个答案是0CH长 也就是
37 00 D7 00 38 00 3D 00 35 00 ; .1.1..7.?8.=.5.
00000050h: 36 00
0A表示第四个答案是0AH长 也就是
37 00 0B FF 31 00 3D 00 38 00          ; 6..7..?=.8.
以上就是问题封包的格式。
有人问,那么问题我怎么看不懂,对了,这里告诉大家,所有字符串都是Unicode编码的,如果想直接看成我们常用的GB码,需要调用系统提供的函数WideCharToMultiByte

下面说说回答封包(C->S)加密前格式
示例1
00000000h: 93 A8 14 2C 2C C3 D9 00 00 00 01 73 BF 08 CB 00 ; 摠.,,觅....s??
00000010h: 00 00 01 00 00 00 01                            ; .......
大家可能看出跟前面提问封包的关系了。
没错,跟提问封包前面部分很象。
93 A8表示是问题答案封包。
14是长度
然后接下去10H个字节就是和提问封包一摸一样的。
最后4个字节是00 00 00 01,表示答案。
答案的含义:
01=A
02=B
04=C
08=D
10=E
20=F
40=G
80=H
什么意思呢?懂二进制的朋友就知道了,这个答案是用位表示的,就是说可以表示多选题,目前都是单选,只有这么几个答案,如果将来有多选了,用位的或运算就可以了。

上面介绍完了封包格式,下面我简单介绍下网络远程答题的实现方法。
1。制作外挂X,用于截获所有服务器发送到客户端,也就是S->C的所有封包,如果发现了是提问封包,那么可以根据配置决定是否吃掉题目,然后把题目发送到远程的答题服务器MS。MS可以是本机或者局域网的机器,也可以在InterNet上。
2。MS接受来自X的信息,然后跟自己保存的答题库比较,看看是否有答案,如果有答案,直接把结果告诉X,然后X制作一个封包回给服务器S。
3。如果答题服务器MS接收到的问题信息找不到答案,那么就转发到专用答题客户端MC去,由值班人员负责选择答案,然后再把答案回给X。
4。专用答题客户端MC可以和专用答题服务器MC在一起,也可以不在一起,都采用TCP/IP通信就可以了。

以上就是简单介绍。
另外,还有一些其他方法,比如直接Call游戏里相应的回答问题的函数,也一样可以实现。

可能有朋友问,如何得到解密后的收到的封包,和加密前的待发送封包,这个问题网上有很多介绍的文章,我就不继续讲了,因为如果讲了就收不住了。
我把可以截获的游戏代码段的部分代码贴出来给大家看,大家可以根据我的代码去游戏程序寻找,每次更新后地址会变化,但是代码内容一般没变化的,只要搜索字符串就可以找到了。
这个是7月31日的版本的内容,一直用到8月10日左右没变化的。
这里是解密收到的封包的代码部分
0056E58C    57              push    edi
0056E58D    8975 E4        mov    [ebp-1C], esi
0056E590    8B4E 38        mov    ecx, [esi+38]
0056E593    8986 F4000000  mov    [esi+F4], eax
0056E599    8D5E 08        lea    ebx, [esi+8]
0056E59C    8965 F0        mov    [ebp-10], esp
0056E59F    8B11            mov    edx, [ecx]
0056E5A1    53              push    ebx
0056E5A2    FF52 0C        call    [edx+C]  //解密函数
0056E5A5    8B46 10        mov    eax, [esi+10]//这里已经得到的解密后的封包了
0056E5A8    8B4E 0C        mov    ecx, [esi+C]
0056E5AB    8B56 30        mov    edx, [esi+30]
0056E5AE    2BC1            sub    eax, ecx
0056E5B0    8D7E 28        lea    edi, [esi+28]
0056E5B3    50              push    eax
0056E5B4    51              push    ecx
0056E5B5    52              push    edx
0056E5B6    8BCF            mov    ecx, edi //从这里修改,7字节,可以跳转到自己的外挂处理程序去
0056E5B8    E8 336AECFF    call    elementc.00434FF0
0056E5BD    8B43 04        mov    eax, [ebx+4]
0056E5C0    8943 08        mov    [ebx+8], eax
0056E5C3    8B8E EC000000  mov    ecx, [esi+EC]
0056E5C9    8B57 04        mov    edx, [edi+4]
0056E5CC    33DB            xor    ebx, ebx
0056E5CE    8A41 28        mov    al, [ecx+28]
0056E5D1    3AC3            cmp    al, bl
0056E5D3    8B47 08        mov    eax, [edi+8]
0056E5D6    74 38          je      short elementc.0056E610
0056E5D8    2BC2            sub    eax, edx
0056E5DA    8D4E 5C        lea    ecx, [esi+5C]
0056E5DD    50              push    eax
0056E5DE    8B46 64        mov    eax, [esi+64]
0056E5E1    52              push    edx

这里是发包前加密用的代码部分
0056E94F    8BB7 C4000000  mov    esi, [edi+C4]
0056E955    8B47 20        mov    eax, [edi+20]
0056E958    8B4F 1C        mov    ecx, [edi+1C]
0056E95B    8D5F 18        lea    ebx, [edi+18]
0056E95E    8B6E 04        mov    ebp, [esi+4]
0056E961    8B56 08        mov    edx, [esi+8]
0056E964    2BC1            sub    eax, ecx
0056E966    8B4F 24        mov    ecx, [edi+24]
0056E969    2BC5            sub    eax, ebp
0056E96B    03C2            add    eax, edx
0056E96D    3BC1            cmp    eax, ecx
0056E96F    0F87 CA000000  ja      elementc.0056EA3F
0056E975    8B4F 3C        mov    ecx, [edi+3C]  //这里开始修改,共9字节,可以跳转到自己的外挂处理程序去
0056E978    56              push    esi
0056E979    8B11            mov    edx, [ecx]
0056E97B    FF52 0C        call    [edx+C] //加密函数
0056E97E    8B46 04        mov    eax, [esi+4]
0056E981    8B4E 08        mov    ecx, [esi+8]
0056E984    8B57 20        mov    edx, [edi+20]
0056E987    2BC8            sub    ecx, eax
0056E989    51              push    ecx
0056E98A    50              push    eax
0056E98B    52              push    edx
0056E98C    8BCB            mov    ecx, ebx
0056E98E    E8 5D66ECFF    call    elementc.00434FF0 //复制到发送缓冲区,由发送线程负责发送
0056E993    8B87 CC000000  mov    eax, [edi+CC]
0056E999    8B8F C4000000  mov    ecx, [edi+C4]
0056E99F    83E8 18        sub    eax, 18
0056E9A2    3BC8            cmp    ecx, eax
0056E9A4    74 26          je      short elementc.0056E9CC
0056E9A6    8B11            mov    edx, [ecx]
0056E9A8    6A 00          push    0
0056E9AA    FF12            call    [edx]
0056E9AC    8B87 C4000000  mov    eax, [edi+C4]
0056E9B2    83C0 18        add    eax, 18
0056E9B5    8987 C4000000  mov    [edi+C4], eax
0056E9BB    A1 A8CB9000    mov    eax, [90CBA8]
0056E9C0    8987 F4000000  mov    [edi+F4], eax

注释:转自广海论坛
原作者:alvinwu
页: [1]
查看完整版本: 诛仙答题分析(转载)
妖城魔力欢迎您