[原创]某道游戏任务二叉树组分析
发表于:
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期)
上传的附件: