诛仙答题分析(转载)
诛仙答题挂制作介绍材料,供参考
本文仅供程序爱好者学习交流之用,如有人用于其他用途,本人该不负责。
以下内容中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