一、用ce找出怪物血量

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

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

任意找一条跟就可以了,我找的是我鼠标选中的这一条。根据经验,大致应该八成可以肯定这个r8是怪物对象,那么我们只要往上跟踪找出怪物对象的来源就可以了。这类情况我会选择偷懒上IDA。
二、dump游戏用IDA分析
可以用x64dbg附加上后,使用scylla插件来dump游戏内存。
然后拖进ida。注意用64位的ida。
跳转到刚才ce找到的相应位置

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

看到这个伪代码可以先观察一手。
已知这个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很明显是个二叉

树相关的值。
黄色箭头是刚才进入的call。
根据ida分析。我们需要寻找这个call的第一个参数。根据基础知识,可以知道第一个参数是ecx。那么就找到了红色箭头处。显而易见。接来下敲代码遍历它。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
|

结束
第一次发帖,好紧张,不要喷我。呜呜呜
3万+

被折叠的 条评论
为什么被折叠?



