文章目录

  • 技能遍历
  • 技能名字
  • 数据整理
  • 代码编写

现在我们已经有了人物的数据和周围对象的数据,还差一个技能数据和释放技能call,就可以完成自动打怪的功能。

接着我们来找技能遍历的数据

技能遍历

以技能的当前经验为突破口

直接搜索当前经验值

筛选得到唯一的一个数值

下访问断点,让断点断下,此时[rax]就是我们要追的数值

[rax]

rax来源于上面的call

这个call传入了一个技能ID和一个基地址作为参数,我们进入call内追rax的来源

经过这三个步骤rax变成了

[rax*10+rdx+4]

这里我们要追一个rdx

技能名字

直接搜索技能名字,把没有后缀的拿下来

然后确定唯一的一个地址

下访问断点,重新打开技能栏

返回上层,这里要追的是[r15+0x38C]

[r15+0x38C]

r15来源于rax,来源于[r12]

[[r12]+0x38C]

r12来源于rcx+0x4

[[rcx+0x4]+0x38C]

rcx来源于r8+rax*4

[[r8+rax*4+0x4]+0x38C]

继续追r8

r8来源于[rbp+0x130]

[rbp+0x130]是一个数组,我们来追踪这个数组的来源

往上找引用[rbp+0x130]的位置,发现这里会往这个地址循环写入值

每一次进来都会写入一个,进入call内单步跟踪,看他什么时候往里面写值

当代码执行到这里将对象写入到数组,这里要追rax来源,rax来源于[rbp+0x4]

rbp来源于r8

r8是上层call的参数,也就是eax和rdx

然后根据这一段代码整理

ID=r8+14*n

r8来源于[rax],来源于[rsp+0x28],而rax此时是一个基地址,继续往上找到来源

[rsp+0x28]来源于rbx

rbx来源于rax

rax来源于rcx+0x1E8

rcx来源于基地址

数据整理

偏移:0x2F783A4
[0x00007FF7035083A4+0x1E8]+n*14 技能ID
[0x00007FF7035083A4+0x1E8]+n*14+4 技能对象
[[[0x00007FF7035083A4+0x1E8]+n*14+4]+0x38C]+0 技能名字
[[0x00007FF7035083A4+0x1E8]+n*14+4]+0x74 技能等级 DWORD
[[0x00007FF7035083A4+0x1E8]+n*14+4]+0x3E0 技能最大等级 DWORD

代码编写

接着来编写技能遍历的代码,同样在stu.h中新增技能对象相关的字段

 //--------------------------------技能------------------------------------------------BOOL  m_Skill_Level;        //技能等级BOOL  m_Skill_MaxLevel;       //最大等级

接着在GameData.h中新增一个函数

//技能遍历
_stuObjs GetSkillData();

数组的遍历相对来说比较简单,只需要一个函数即可。

//技能遍历
_stuObjs GetSkillData()
{_stuObjs skilllist;//技能数组首地址QWORD qSkillArr = ReadQword(g_GameAddr + SkillArray + 0x1E8);//数组大小DWORD dwSize = ReadDword(g_GameAddr + SkillArray + 0x1E8 + 0x8);//开始遍历for (unsigned int i = 0; i < dwSize; i++){_stuObj skill;skill.m_StuType = Em_Skill;//IDskill.m_ID = ReadDword(qSkillArr + i * 0x14);//对象skill.m_Obj = ReadDword(qSkillArr + i * 0x14 + 0x4);//等级skill.m_Skill_Level = ReadDword(skill.m_Obj + 0x74);//最大等级skill.m_Skill_MaxLevel = ReadDword(skill.m_Obj + 0x3E0);//名字DWORD  nameaddr = ReadDword(skill.m_Obj + 0x38C);skill.m_Name = ReadWChar(nameaddr);//保存skilllist.m_data.push_back(skill);}return skilllist;
}

然后输出技能相关的信息

     //输出技能信息case Em_Skill:{__OutputDebugStringW(L"对象:%x ID:%x 名字:%s 等级:%d 最大等级:%d", m_Obj, m_ID, m_Name.c_str(), m_Skill_Level, m_Skill_MaxLevel);}break;

实际效果如图:

下一篇文章我们来找明文封包call。

Github:https://github.com/TonyChen56/GameReverseNote

完整代码:https://download.csdn.net/download/qq_38474570/79498815

006 技能数组分析和代码编写相关推荐

  1. 012 背包二叉树遍历分析和代码编写

    文章目录 背包属性遍历 物品名字库遍历 数据整理 代码编写 背包属性遍历 从物品数量入手,搜索2字节 筛选出唯一的值 下两字节的访问断点,鼠标移动到物品上面,断点断下 物品数量=r14+0x10 这里 ...

  2. 005 周围遍历二叉树分析和代码编写

    文章目录 周围遍历分析 定位角色名字偏移 玩家名字偏移 NPC名字偏移 数据整理 代码编写 所谓的周围遍历,其实就是人物附近所有的怪物 NPC 和玩家信息,拿到了这些数据,我们就可以实时获得当前人物对 ...

  3. 【手把手 脑把脑】教会你使用idea基于MapReduce的统计数据分析(从问题分析到代码编写)

    目录 1 编程前总分析 1.1 数据源 1.2 需要掌握的知识 1.2.1 Hadoop对比java的数据类型 1.2.2 MapReduce流程简介 1.3.3 MapReduce流程细分 2 编码 ...

  4. 层次分析法步骤及代码编写

    层次分析法步骤及代码编写 笔记大部分由观看[强烈推荐]清风:数学建模算法.编程和写作培训的视频课程整理出: 视频链接:https://www.bilibili.com/video/BV1DW411s7 ...

  5. 数组数据结构的使用与代码编写(一)

    数组数据结构的使用与代码编写(一) 数组的使用 js中的数组 一.属性 1.length设置或返回数组元素的数目. 2.constructor返回构造函数的引用 var a=["a" ...

  6. LeetCode——978. 最长湍流子数组(Longest Turbulent Subarray)——分析及代码(Java)

    LeetCode--978. 最长湍流子数组[Longest Turbulent Subarray]--分析及代码[Java] 一.题目 二.分析及代码 1. 动态规划(一维数组) (1)思路 (2) ...

  7. LeetCode——1846. 减小和重新排列数组后的最大元素(Maximum Element After Decreasing and Rearranging)[中等]——分析及代码(Java)

    LeetCode--1846. 减小和重新排列数组后的最大元素[Maximum Element After Decreasing and Rearranging][中等]--分析及代码[Java] 一 ...

  8. JAVA代码编写的30条建议

    列举了大量有用的建议,帮助大家进行低级程序设计,并提供了代码编写的一般性指导: (1) 类名首字母应该大写.字段.方法以及对象(句柄)的首字母应小写.对于所有标识符,其中包含的所有单词都应紧靠在一起, ...

  9. 008 释放技能call分析

    文章目录 释放技能分析 定位普通攻击call 数据整理 代码编写 释放技能分析 接着我们需要拿到释放技能的数据 首先来到明文发包call头部 释放技能让断点断下 此时第一次返回的call是选怪的封包c ...

最新文章

  1. Lintcode 1230解题思路和c++代码
  2. Uncaught (in promise) Error: Request failed with status code 500
  3. selinux 设置关键命令行
  4. Java单元测试技巧之PowerMock
  5. java如何声明一个数组用来存储随机生成的字母并且保证不重复
  6. 剖析vector.erase()实现
  7. kakfa学习教程一
  8. 华中科技大学计算机基地班,华中科技大学基地班管理方法.doc
  9. 你需要启用steam社区界面功能以进行购买_steam官网手机版免费下载-steam官网手机客户端下载...
  10. SolidWorks钣金零件导出dxf排版拉丝方向C#二次开发
  11. 20.6.5算法心得 一元二次方程解法
  12. LTspice绘制方波
  13. UEFI 是什么?硬盘的EFI分区? .efi格式的文件?UEFI 标准定义了一种可执行文件格式:efi格式
  14. 28. 移动端touch触摸事件
  15. 芯片优缺点_“碳基芯片”的材料,将采用碳纳米管制成,或比传统芯片提升10倍...
  16. FPGA 串口波特率时钟的概念
  17. 用python画地球_如何用PYTHON程序模拟一个太阳系?
  18. python3 opencv 视频格式转换
  19. 重新回到Fcitx5的怀抱
  20. 【python--爬虫】b站弹幕爬虫

热门文章

  1. 成功解决ModuleNotFoundError: No module named 'keras_retinanet.utils.compute_overlap'
  2. Keras: 多输入及混合数据输入的神经网络模型
  3. 关于OpenGL环境配置问题(2015)
  4. 洛谷P2698 [USACO12MAR]花盆Flowerpot
  5. 8.图片组件和动画效果--从零起步实现基于Html5的WEB设计器Jquery插件(含源码)...
  6. Python小游戏之 - 飞机大战 !
  7. Linux操作系统下/etc/hosts文件配置方法
  8. 探秘JVM(二)——编译进行时
  9. Java 关于File使用
  10. zabbix proxy安装配置