006 技能数组分析和代码编写
文章目录
- 技能遍历
- 技能名字
- 数据整理
- 代码编写
现在我们已经有了人物的数据和周围对象的数据,还差一个技能数据和释放技能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 技能数组分析和代码编写相关推荐
- 012 背包二叉树遍历分析和代码编写
文章目录 背包属性遍历 物品名字库遍历 数据整理 代码编写 背包属性遍历 从物品数量入手,搜索2字节 筛选出唯一的值 下两字节的访问断点,鼠标移动到物品上面,断点断下 物品数量=r14+0x10 这里 ...
- 005 周围遍历二叉树分析和代码编写
文章目录 周围遍历分析 定位角色名字偏移 玩家名字偏移 NPC名字偏移 数据整理 代码编写 所谓的周围遍历,其实就是人物附近所有的怪物 NPC 和玩家信息,拿到了这些数据,我们就可以实时获得当前人物对 ...
- 【手把手 脑把脑】教会你使用idea基于MapReduce的统计数据分析(从问题分析到代码编写)
目录 1 编程前总分析 1.1 数据源 1.2 需要掌握的知识 1.2.1 Hadoop对比java的数据类型 1.2.2 MapReduce流程简介 1.3.3 MapReduce流程细分 2 编码 ...
- 层次分析法步骤及代码编写
层次分析法步骤及代码编写 笔记大部分由观看[强烈推荐]清风:数学建模算法.编程和写作培训的视频课程整理出: 视频链接:https://www.bilibili.com/video/BV1DW411s7 ...
- 数组数据结构的使用与代码编写(一)
数组数据结构的使用与代码编写(一) 数组的使用 js中的数组 一.属性 1.length设置或返回数组元素的数目. 2.constructor返回构造函数的引用 var a=["a" ...
- LeetCode——978. 最长湍流子数组(Longest Turbulent Subarray)——分析及代码(Java)
LeetCode--978. 最长湍流子数组[Longest Turbulent Subarray]--分析及代码[Java] 一.题目 二.分析及代码 1. 动态规划(一维数组) (1)思路 (2) ...
- LeetCode——1846. 减小和重新排列数组后的最大元素(Maximum Element After Decreasing and Rearranging)[中等]——分析及代码(Java)
LeetCode--1846. 减小和重新排列数组后的最大元素[Maximum Element After Decreasing and Rearranging][中等]--分析及代码[Java] 一 ...
- JAVA代码编写的30条建议
列举了大量有用的建议,帮助大家进行低级程序设计,并提供了代码编写的一般性指导: (1) 类名首字母应该大写.字段.方法以及对象(句柄)的首字母应小写.对于所有标识符,其中包含的所有单词都应紧靠在一起, ...
- 008 释放技能call分析
文章目录 释放技能分析 定位普通攻击call 数据整理 代码编写 释放技能分析 接着我们需要拿到释放技能的数据 首先来到明文发包call头部 释放技能让断点断下 此时第一次返回的call是选怪的封包c ...
最新文章
- Lintcode 1230解题思路和c++代码
- Uncaught (in promise) Error: Request failed with status code 500
- selinux 设置关键命令行
- Java单元测试技巧之PowerMock
- java如何声明一个数组用来存储随机生成的字母并且保证不重复
- 剖析vector.erase()实现
- kakfa学习教程一
- 华中科技大学计算机基地班,华中科技大学基地班管理方法.doc
- 你需要启用steam社区界面功能以进行购买_steam官网手机版免费下载-steam官网手机客户端下载...
- SolidWorks钣金零件导出dxf排版拉丝方向C#二次开发
- 20.6.5算法心得 一元二次方程解法
- LTspice绘制方波
- UEFI 是什么?硬盘的EFI分区? .efi格式的文件?UEFI 标准定义了一种可执行文件格式:efi格式
- 28. 移动端touch触摸事件
- 芯片优缺点_“碳基芯片”的材料,将采用碳纳米管制成,或比传统芯片提升10倍...
- FPGA 串口波特率时钟的概念
- 用python画地球_如何用PYTHON程序模拟一个太阳系?
- python3 opencv 视频格式转换
- 重新回到Fcitx5的怀抱
- 【python--爬虫】b站弹幕爬虫
热门文章
- 成功解决ModuleNotFoundError: No module named 'keras_retinanet.utils.compute_overlap'
- Keras: 多输入及混合数据输入的神经网络模型
- 关于OpenGL环境配置问题(2015)
- 洛谷P2698 [USACO12MAR]花盆Flowerpot
- 8.图片组件和动画效果--从零起步实现基于Html5的WEB设计器Jquery插件(含源码)...
- Python小游戏之 - 飞机大战 !
- Linux操作系统下/etc/hosts文件配置方法
- 探秘JVM(二)——编译进行时
- Java 关于File使用
- zabbix proxy安装配置