首页
社区
课程
招聘
[原创]剑网三怪物二叉树分析
发表于: 2021-1-5 21:36 12790

[原创]剑网三怪物二叉树分析

2021-1-5 21:36
12790

1.png

已知怪物血量是可见的。攻击前先搜一次血量,每次攻击都搜一次。剑网三这个游戏是64位的,但是一开始是从32位转变过来的,大部分数据类型基本上都是32位的。所以用4字节搜血量

2.png
对这个地址进行访问,并且攻击怪物

3.png

任意找一条跟就可以了,我找的是我鼠标选中的这一条。根据经验,大致应该八成可以肯定这个r8是怪物对象,那么我们只要往上跟踪找出怪物对象的来源就可以了。这类情况我会选择偷懒上IDA。

可以用x64dbg附加上后,使用scylla插件来dump游戏内存。

然后拖进ida。注意用64位的ida。

跳转到刚才ce找到的相应位置

4.png

红箭头是刚才找到的位置。我们应该从这往上找到R8寄存器里值得来源。可以看到黄色箭头,R8来源于rax。根据经验rax来源八成来自于绿框的call。

所以我们进入call。F5

5.png

看到这个伪代码可以先观察一手。

已知这个call返回的是当前被攻击的怪物的对象。所以直接可以看result = v4[5]

这个可以看成v4 + 0x28

看到上面有个while循环。判断*(BYTE*)(v5+0x19)的值。等于1就退出循环。

再看下面的代码 判断 v5+8的值是否大于a2。a2来源于上一层的参数。

这个判断是和否都不会立刻跳出循环。会把v5的值存放在v4。而v4又是最后怪物对象的关键数据。

所以这个a2可以猜测是个标志。能够确认当前怪物的标识。那么这个while就可以看成是在遍历怪物了,通过标识取出当前攻击的怪物对象。这个结构结合起来已经很明显了,这是个二叉树。

v5[0]是左树 ,v5[2]是右树 ,v5 + 0x19 里的值等于1的话应该是树到尾部了。

那么只需观察最上面的参数a1。a1很明显是个二叉
6.png
树相关的值。

黄色箭头是刚才进入的call。

根据ida分析。我们需要寻找这个call的第一个参数。根据基础知识,可以知道第一个参数是ecx。那么就找到了红色箭头处。显而易见。接来下敲代码遍历它。

7.png

第一次发帖,好紧张,不要喷我。呜呜呜

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

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

收藏
免费 6
支持
分享
最新回复 (22)
雪    币: 1015
活跃值: (5232)
能力值: ( LV12,RANK:312 )
在线值:
发帖
回帖
粉丝
2
龟哥无敌!站楼!
2021-1-5 21:46
0
雪    币: 4709
活跃值: (1575)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
3
剑网三:你号没了
2021-1-5 21:51
0
雪    币: 4171
活跃值: (4232)
能力值: ( LV3,RANK:37 )
在线值:
发帖
回帖
粉丝
4
L0x1c 龟哥无敌!站楼!
源神教的。我爱源神
2021-1-6 08:28
0
雪    币: 4171
活跃值: (4232)
能力值: ( LV3,RANK:37 )
在线值:
发帖
回帖
粉丝
5
如斯咩咩咩 剑网三:你号没了
我自愿加入西山居,志愿献身剑网三
2021-1-6 08:29
0
雪    币: 15170
活跃值: (16832)
能力值: (RANK:730 )
在线值:
发帖
回帖
粉丝
6
剑网三:你号没了
2021-1-6 09:05
0
雪    币: 4171
活跃值: (4232)
能力值: ( LV3,RANK:37 )
在线值:
发帖
回帖
粉丝
7
有毒 剑网三:你号没了
号还在!!!我是rmb玩家
2021-1-6 09:46
0
雪    币: 114
活跃值: (35)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
你号没了
2021-1-6 09:53
0
雪    币: 4171
活跃值: (4232)
能力值: ( LV3,RANK:37 )
在线值:
发帖
回帖
粉丝
9
回忆心痛 你号没了

2021-1-6 09:56
0
雪    币: 2973
活跃值: (4881)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
10
L0x1c 龟哥无敌!站楼!
2021-1-6 11:06
0
雪    币: 7311
活跃值: (4507)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
龟哥无敌!
2021-1-6 11:58
0
雪    币: 2016
活跃值: (1071)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
大佬 附上 工具 源码嘛
2021-1-6 13:11
1
雪    币: 615
活跃值: (580)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
13
不错
2021-1-6 14:01
0
雪    币: 48
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
14
666谢谢楼主分享
2021-1-6 14:56
0
雪    币: 130
活跃值: (402)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
我比较好奇,你是怎么处理他下断之后会卡到假死的情况的。
2021-1-7 12:10
0
雪    币: 4171
活跃值: (4232)
能力值: ( LV3,RANK:37 )
在线值:
发帖
回帖
粉丝
16
艾米哈柏 我比较好奇,你是怎么处理他下断之后会卡到假死的情况的。
不是假死,是因为剑三下了个全局消息钩子。你把钩子卸载掉按键盘就不会卡了,但是剑三收不到你的按键消息了
2021-1-7 13:07
0
雪    币: 665
活跃值: (1051)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
阿龟流批~
2021-1-8 15:23
0
雪    币: 2674
活跃值: (2304)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
18
游戏中当LocalFlag的0x1e位(bit30)为1时((LocalFlag&0x40000000)!=0)就要开始搜索被攻击的怪物了,所以:
0x40000000就是ATTACK_FLAG了。
你是用的: 根->左->右, 先序遍历算法哈!好帖子!思路清晰!
2021-1-10 21:04
0
雪    币: 0
活跃值: (63)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
很好的一种方式
2021-3-1 11:41
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
20
大佬能有偿找你写个功能吗
2021-9-8 06:48
0
雪    币: 66
活跃值: (2718)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
思路清晰平易近人,比那些水文好得多
2021-9-8 10:23
0
雪    币: 6092
活跃值: (704)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
23
剑网三:你号没了
2021-9-27 09:34
0
游客
登录 | 注册 方可回帖
返回
//