首页
社区
课程
招聘
[原创]某道游戏任务二叉树组分析
发表于: 2015-7-5 01:25 14994

[原创]某道游戏任务二叉树组分析

2015-7-5 01:25
14994

一:先把分析好的任务结构图放出来

其中有两点要说:
    1.任务的对象组成了一个数组,比如里面的任务一、任务二
    2.任务一、任务二各自指向了一颗树
    3.对于这两颗树
        a)右子树里面放了任务的属性名字,比如任务类型、提示等等,太多图中没有画完
        b)左子树,就是对应属性的数据,比如任务类型的具体数据、提示的具体数据

二:从什么地方入手
1.假设我们需要写一个游戏,一个游戏任务包含哪些部分了,大致如下:
    a.        任务ID,主要发给服务端进行交接做任务的
    b.        任务类型,一个任务是杀怪任务还是传对话任务(跑环,让你到某个NPC旁边)
    c.        任务描述,这个没什么好介绍了
    d.  任务数量
    e.        任务提示
    f.        杀怪或者打怪任务计数器
2.        这里我们从任务描述入手(需找王老板)

3.重新打开游戏,会发现,其中0e1c4b60这个文本又变回来了

4.这个地址0e1c4b60,就是我们重点研究的对象了

三:开始分析
1.对地址0e1c4b60,下硬件写入断点

2. 这里被断下,但是在系统,但是在msvcr80中

其中EDI的信息,就是我们在CE中搜索到的

3.Alt+ F9到,游戏领空,其中ECX和上面系统领空地址一样, E1C4B58

4.继续往上一层,Alt+ F9,就在函数00666e30中,中间单步一遍,发现,上面eax的来源一个call

单步一遍发现,中间call  006D8920,中返回了步骤3中的eax和ecx的值

5.现在要重点分析006D8920,这个是thiscall,通过eax返回

esi 来源,是函数006d8920这个函数局部变量赋值:

我们要找到类似 lea  xxx, dword ptr [esp + 18]

6.现在需要分析call 005107f0,中怎么对ecx进行操作的
第5步中的 esp + 18对应的地址 在call 005107f0中的操作是,mov [eax + 4], ecx

所以需要取ecx的来源,根据分析ecx = [esp + 18], [esp + 18] = eax

所以需要取eax的来源, eax来着call, 004d7ae0

7.现在需要分析call 004d7ae0,这个也是这个游戏中一个通用的二叉树, 这个函数也对应我在上面贴出的第一图中的树
我们需要关注eax的来源,所以进入call 004d7ae0中查看,来源于edi:

其中EDI来自循环中活动,上图中004d7b1B ~004d7b00就是这个循环代码,是个Do-While循环,用c语言描述如下:

这个循环参与运算所有的数据来源于esi,需要取esi的数据,所有数据来源于ecx

这个ecx来自上层的的ecx,向上一层:

需要继续往上,查找ecx的来源


需要继续查找,ecx的来源,来源edi

需要查找edi的来源,往上查找来源[edi]

需要查edi的来源,上面的图在call  665e80中,这个比较重要,他有一个循环,循环        中的数据来源ebx,其中初始值:edi = [ebx + 4],以后每次加4

我这里把他翻译成c语言看,顺便也把基地址打印出来了,这里便是任务对象数组了

8.找到基地址
其中,ca06e0,便是基地址了

附上运行后的结果:

三:总结下
    1.分析上面的数据是个苦逼的过程,只所以写下是为了再次整理一遍,下次遇到类似问题时候能够快速解决
    2.分析数据时候,需要从程序的设计角度去看问题,一定要明白自己在干什么
    3.从逆向的角度来看一个游戏,一般分为三层,数据层、显示层、交换层
    i.数据层,客户端从服务端请求来的数据或者自有数据
    ii.显示层,比如场景、角色面板之类的
    iii.一块逻辑代码,取数据层的代码,然后经过一系列操作放到显示层上去,玩家可以看到
    iv.一般逆向,都希望拿到数据层的数据,这块东西是最靠谱的
   4.逆向时候一般比较惬意的分析过程是这样的: 显示层 -> 交换层 -> 数据层
    i.如果在交换层VM,数据层都是加密数据,就可以加大逆向的分析的难度
ps
   1. 一直在互联网上取东西,今天贡献一点,希望本文对有些人有用
   2. 本文仅仅是为了技术交流而作,如果冒犯了您的权益,请通知我删文


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 3
支持
分享
最新回复 (17)
雪    币: 130
活跃值: (402)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
满详细的...
没VM的东西就是好..
2015-7-5 01:36
0
雪    币: 8
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
二叉树是这样的啊,不在服务端怎么编的二叉树
2015-7-5 02:42
0
雪    币: 40
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
大神发帖必须支持
2015-7-5 04:16
0
雪    币: 40
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
面向对象类游戏该怎样跟踪上面数据 游戏用脚本驱动的 是没有基址的
2015-7-5 04:27
0
雪    币: 22
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
鼓励原创!MARK
2015-7-5 07:41
0
雪    币: 16412
活跃值: (1625)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我们来学习下。
2015-7-5 08:53
0
雪    币: 110
活跃值: (527)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
8
额。顶一下。
2015-7-5 20:12
0
雪    币: 36
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
支持下。。。虽然现在的游戏都用lua了
2015-7-6 10:24
0
雪    币: 96
活跃值: (36)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
嗯,但是还有些老游戏用纯C++写的
2015-7-6 15:49
0
雪    币: 96
活跃值: (36)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
感谢版主加精
2015-7-6 23:45
0
雪    币: 20
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
感谢分享
2015-7-7 13:49
0
雪    币: 81
活跃值: (100)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
13
不是我打击你,你逆了老半天的其实只是一个c++标准库的set之类的容器,部分容器底层是用二叉树实现的
用新一点的IDA的话搞不好可以直接看到相关成员函数

游戏公司的开发人员一般也不是闲得蛋疼再去实现一边这些数据结构,况且自己实现的性能往往是不如标准库的,所以逆向之前应该先收集有用的信息,把精力放在真正需要投入的地方
2015-7-7 15:31
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
继续加油
2015-7-7 17:00
0
雪    币: 96
活跃值: (36)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
15
这个客户端底层架构应该在10年前,很多公司都没有用标准模板库。这个不是set对应的红黑树。
试过ida的一键f5,据我所知,一般有积累的公司服务器或者客户端引擎,一般这些库都会自己实现,并不是stl不好而是一些历史遗留问题
2015-7-7 17:14
0
雪    币: 764
活跃值: (147)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
!Thanks!
2015-7-8 00:05
0
雪    币: 11314
活跃值: (2907)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
强,对数据结构天生恐惧
2015-7-9 08:51
0
雪    币: 375
活跃值: (201)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
x道最郁闷的是它的XVM
2015-8-18 09:33
0
游客
登录 | 注册 方可回帖
返回
//