亚泰史诗-通讯协议初步分析

看过许多网游对于游戏内数据的存储,唯独网易的游戏最独特,最新刚出来的一个端游,拿来看看


基本信息

1、游戏大致框架

※游戏通过登录器登录,生成加密参数启动的client主程序,直接运行client主程序会报错

※游戏带python的模块,显而易见内部是使用了python的脚本做业务逻辑

※游戏的UI还是很常规的使用了CEGUI,通过常规手段就能很方便的找个各个控件


2、通讯交互

※游戏的通讯大致是明文的(游戏内部还没具体看)

※直接对API下断即可来到游戏发包处理函数

※封包的组合,解析均使用了脚本


3、数据部分

※游戏内所有数据全使用了python的对象结构存储


封包数据分析

1、封包结构

要分析封包的结构从返回包入手还是比较直观的,先采集2个样本数据

心跳包返回 长度0x7

04 B8 A8 08 00 10 00

创建角色返回 长度0xF

0B C0 43 7D 08 E7 B8 FF FF FF FF FF FF FF 01

通过对封包的读取操作逆向分析可以得出封包结构基本分为3个部分

#1 包长度 ,#2 协议号,#3 数据内容

2、解析封包协议

※包长度的解析

通过对第一个字节的下断,可以来到这段代码

00611BEE      CC            int3
00611BEF      CC            int3
00611BF0  /$  55            push ebp
00611BF1  |.  8BEC          mov ebp,esp
00611BF3  |.  8B45 0C       mov eax,[arg.2]
00611BF6  |.  85C0          test eax,eax
00611BF8  |.  7C 31         jl short x11-clie.00611C2B
00611BFA  |.  8B4D 08       mov ecx,[arg.1]
00611BFD  |.  3B41 08       cmp eax,dword ptr ds:[ecx+0x8]
00611C00  |.  7D 29         jge short x11-clie.00611C2B
00611C02  |.  8A4401 14     mov al,byte ptr ds:[ecx+eax+0x14]
00611C06  |.  8845 0F       mov byte ptr ss:[ebp+0xF],al
00611C09  |.  0FB6C0        movzx eax,al
00611C0C  |.  8B0485 68209A>mov eax,dword ptr ds:[eax*4+0x9A2068]    ;  长度对象表
00611C13  |.  85C0          test eax,eax
00611C15  |.  75 10         jnz short x11-clie.00611C27
00611C17  |.  8D4D 0F       lea ecx,dword ptr ss:[ebp+0xF]
00611C1A  |.  6A 01         push 0x1
00611C1C  |.  51            push ecx
00611C1D  |.  E8 5EE8FFFF   call x11-clie.00610480
00611C22  |.  83C4 08       add esp,0x8
00611C25  |.  5D            pop ebp                                  ;  03B3E424
00611C26  |.  C3            retn
00611C27  |>  FF00          inc dword ptr ds:[eax]

通过长度的对象表查询,可以返回一个对象,该长度对象表的大小为 0xFF,问题来了,如果包的长度超过0xFF了怎么办呢?通过逆向分析知道了,它获取这个对象后,对该值进行了判断,初步分析可以得到5个档次 0x80,0xC0,0xE0,0xF0,0xF8 ,判断当前值在哪个范围内,最高取值长度为5。

#因此样本2数据中的 0x0B是小于0x80,所以长度为1,取1位即可

※协议号的解析

协议号部分的取值长度同上放

#即0xC0是小于0xE0,所以长度为3,取到的协议为0xC0437D (协议号数据需要高低换位)

通过几次的游戏更新发现,每个版本的协议号都会变,所以协议号是很不靠谱的,由于游戏内部是用脚本来处理逻辑,所以可以知道肯定会有字符串协议名的存在,便于维护嘛

单步跟着对协议号的处理,当中经过几次的对象倒手,最后我们回来到这个地方

0062D47E  |.  E8 7DC80200   |call x11-clie.00659D00
0062D483  |.  A1 D4289A00   |mov eax,dword ptr ds:[0x9A28D4]
0062D488  |.  83C4 04       |add esp,0x4
0062D48B  |.  85C0          |test eax,eax
0062D48D  |.^ 75 E1         \jnz short x11-clie.0062D470
0062D48F  \>  C3            retn
0062D490  /$  55            push ebp
0062D491  |.  8BEC          mov ebp,esp
0062D493  |.  83EC 14       sub esp,0x14
0062D496  |.  8B45 08       mov eax,[arg.1]
0062D499  |.  53            push ebx
0062D49A  |.  56            push esi
0062D49B  |.  57            push edi
0062D49C  |.  8B78 10       mov edi,dword ptr ds:[eax+0x10]          ;  DictSize_Max
0062D49F >|.  8B40 14       mov eax,dword ptr ds:[eax+0x14]          ;  DictBase
0062D4A2  |.  897D EC       mov [local.5],edi
0062D4A5  |.  237D 10       and edi,[arg.3]                          ;  Protocol  判断下溢出
0062D4A8  |.  8945 FC       mov [local.1],eax
0062D4AB  |.  8D0C7F        lea ecx,dword ptr ds:[edi+edi*2]
0062D4AE  |.  8B7488 04     mov esi,dword ptr ds:[eax+ecx*4+0x4]
0062D4B2  |.  8D1C88        lea ebx,dword ptr ds:[eax+ecx*4]         ;  协议体对象
0062D4B5  |.  85F6          test esi,esi
0062D4B7  |.  0F84 41010000 je x11-clie.0062D5FE
0062D4BD  |.  8D49 00       lea ecx,dword ptr ds:[ecx]
0062D4C0  |>  8B45 0C       /mov eax,[arg.2]

通过对字典对象的查询可以得到协议体对象这里给出这个对象的结构

PROTO_OBJECT = packed record
    ProtoCol:Cardinal;              //协议号
    ObjectInt:POBJECT_INT;          //INT数据对象 保存的协议号
    Explain:PPROTO_Explain;         //协议说明
  end;

这里直接判断协议说明内的协议名称


就可以确定是哪个协议了,至于最后数据部分就不具体分析了


游戏内数据对象

这个游戏内的所有数据传递都是 通过数据对象,大致结构如下(由于数据类型的不同结构长度会有不会)

OBJECT_HEAD = Packed record
    Refcnt:Cardinal;
    ObjectType:Cardinal;
  end;

  POBJECT_INT = ^OBJECT_INT;
  OBJECT_INT = packed record
    ObjectHead:OBJECT_HEAD;
    Value:Cardinal;
  end;

这里给了一个INT类型的结构,其他的结构就不一一列出了,所有的结构的head部分都是相同的,通过ObjectType判断是什么类型的数据,每个类型内都带有自己的方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值