文章目录

  • 角色血量基址查找
  • 分析角色其他属性
  • 分析角色名字
  • 搜索角色坐标
  • 数据整理
  • 代码编写

接着我们来开始找游戏数据,以编写自动打怪为目标,找齐这个功能所需要的所有的数据。第一个需要用到的数据就是角色属性。

角色血量基址查找

直接搜索当前人物的血值

修改血值之后再次扫描

接着我们修改第二个数值,然后打开角色属性。发现第一个数值也会跟着修改,说明第一个数值的来源是第二个地址

对这个地址下内存访问断点,断点断下。[rax+0x1AC]是人物血量,这里就可以获得人物血量的两层偏移

[[rsi+0x65C]+0x1AC]

这里继续追rsi的来源

rsi来源于rdx

rdx来源于rbx

rbx来源于rax

进入函数发现rax来源于rbx

rbx来源于rcx

rcx来源于[rcx+0x248]

[[[rcx+0x248]+0x65C]+0x1AC]

再上层有个0x71C的偏移

[[[[rcx+0x71C]+0x248]+0x65C]+0x1AC]

rcx来源于rax,继续跟上面的call

最后可以追到一个基地址

[[[[0x00007FF77C447050+0x71C]+0x248]+0x65C]+0x1AC]

分析角色其他属性

[[[[0x00007FF77C447050+0x71C]+0x248]+0x65C]+0x1AC] 血量
[[[[0x00007FF77C447050+0x71C]+0x248]+0x65C]+0x1B0] 最大血量
[[[[0x00007FF77C447050+0x71C]+0x248]+0x65C]+0x1B4] 蓝量
[[[0x00007FF77C447050+0x71C]+0x248]+0x638] 角色名字

分析角色名字

直接扫描角色名字

把不带后缀的地址全部拉下来,里面有一个绿色的基地址,可以直接用这个基地址

通过修改的方式 确定人物名称的地址

对这个地址下硬件访问断点,断点断下,返回上层

发现这里是调用的系统的函数,接着在这个函数重新下断点

此时[rdi+0x638]是我们要追的地址

rdi来源于rcx

rcx来源于rsi

rsi来源于rax,而rax上面的call就是我们追血量时经过的第一个call。那么角色名字就等于

[[[0x00007FF77C447050+0x71C]+0x248]+0x638]

搜索角色坐标

我们在人物的对象下面并没有找到角色的坐标,那么说明这个坐标有可能是加密了。最快的方法是找到发包函数,然后通过发包函数找到走路call,看走路call传入的参数是什么

这里用CE的话用未知初始值和变动的值去扫描,这里过程省略

[[[0x00007FF77C447050+0x71C]+0x248]+80] X坐标
[[[0x00007FF77C447050+0x71C]+0x248]+84] Y坐标
[[[0x00007FF77C447050+0x71C]+0x248]+88] Z坐标

数据整理

[[[[0x00007FF77C447050+0x71C]+0x248]+0x65C]+0x1AC] 血量
[[[[0x00007FF77C447050+0x71C]+0x248]+0x65C]+0x1B0] 最大血量
[[[[0x00007FF77C447050+0x71C]+0x248]+0x65C]+0x1B4] 蓝量
[[[[0x00007FF77C447050+0x71C]+0x248]+0x65C]+0x13C] 等级
[[[[0x00007FF77C447050+0x71C]+0x248]+0x65C]+0x14C] 经验
[[[[0x00007FF77C447050+0x71C]+0x248]+0x65C]+0x150] 最大经验
[[[0x00007FF77C447050+0x71C]+0x248]+0x638] 角色名字
[[[0x00007FF77C447050+0x71C]+0x248]+80] X坐标
[[[0x00007FF77C447050+0x71C]+0x248]+84] Y坐标
[[[0x00007FF77C447050+0x71C]+0x248]+88] Z坐标偏移:"MMOGame-Win64-Shipping.exe"+0x2F67050

代码编写

首先在_stuObj中添加人物相关的属性

struct _stuObj
{int m_StuType;             //0 人物 //--------------------------------公用------------------------------------------------wstring m_Name;              //名字    DWORD m_Obj;                //对象DWORD m_ID;                 //ID//--------------------------------角色------------------------------------------------DWORD m_Level;      //等级DWORD m_Exp;        //经验DWORD m_MaxExp;     //最大经验
}

然后在GameData.h中添加一个函数声明

//人物属性
_stuObj GetRoleData();

函数实现如下:

//获取角色属性
_stuObj GetRoleData()
{_stuObj selfdata;selfdata.m_StuType = Em_Role;//坐标selfdata.m_Obj_Pos.x = ReadFloat(g_SelfObj + 0x80);selfdata.m_Obj_Pos.y = ReadFloat(g_SelfObj + 0x84);selfdata.m_Obj_Pos.z = ReadFloat(g_SelfObj + 0x88);//名字DWORD nameAddr = ReadDword(g_SelfObj + 0x638);selfdata.m_Name = ReadWChar(nameAddr);//属性DWORD dwAttrBase = ReadDword(g_SelfObj + 0x65C);selfdata.m_Obj_HP = ReadDword(dwAttrBase + 0x1AC);selfdata.m_Obj_MaxHP = ReadDword(dwAttrBase + 0x1B0);selfdata.m_Obj_MP = ReadDword(dwAttrBase + 0x1B4);selfdata.m_Level = ReadDword(dwAttrBase + 0x13C);selfdata.m_Exp = ReadDword(dwAttrBase + 0x14C);selfdata.m_MaxExp = ReadDword(dwAttrBase + 0x150);return selfdata;
}

接着输出一下人物信息

//输出角色信息case Em_Role:{__OutputDebugStringW(L"名字:%s 等级:%d 血量:%d 最大血量:%d 蓝量:%d 当前经验:%d 升级经验:%d 坐标(x:%f y:%f z:%f)", m_Name.c_str(), m_Level, m_Obj_HP, m_Obj_MaxHP, m_Obj_MP, m_Exp, m_MaxExp, m_Obj_Pos.x, m_Obj_Pos.y, m_Obj_Pos.z);}break;

然后在MFC的主窗口界面中添加一个按钮响应事件

//人物数据
void MainWnd::OnBnClickedButton1()
{GetRoleData().OutputDebugInfo();
}

按钮事件输出人物数据相关信息。实际效果如图:

这样我们就取到了人物相关的数据了。下一篇文章我们来找周围遍历相关的数据。

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

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

004 人物数据查找和代码编写相关推荐

  1. C++算法之数据查找的代码

    将做工程过程比较重要的代码片段备份一次,如下的代码内容是关于C++算法之数据查找的代码,应该对大家有较大帮助. int find(int array[], int length, int value) ...

  2. 数据库代码编写_如何将您的职业转变为数据科学-即使您今天不编写代码。

    数据库代码编写 by Sam Chow, PhD 由周星驰博士 如何将您的职业转变为数据科学-即使您今天不编写代码. (How to transition your career into Data ...

  3. 001 从人物血量学习数据查找

    文章目录 前言 游戏选择与环境搭建 查找人物血量 查找血量基址 第一条线(简单) 第二条线(一般) 第三条线(困难) 总结 前言 本系列文章旨在从零开始学习游戏辅助的工作流程和开发方法,了解游戏背后的 ...

  4. 假设有一个字类型的数值arry1,试编写程序统计arry1数值及其后若干数值,在字单元中存储时每个数据中含“1”数据位的个数,并将统计结果保存在res1数组中。数据段的代码定义如下: data seg

    假设有一个字类型的数值arry1,试编写程序统计arry1数值及其后若干数值,在字单元中存储时每个数据中含"1"数据位的个数,并将统计结果保存在res1数组中.数据段的代码定义如下 ...

  5. 使用JSP代码编写index.jsp文件在网页上显示数据库数据

    使用JSP代码编写index.jsp文件在网页上显示数据库数据 在index.jsp文件上使用JSP代码编写 可以在网页上以表格的形式显示数据库 内的数据 需要创建一个项目 因为需要用到关于JDBC的 ...

  6. 响应式编程笔记(二):代码编写

    2019独角兽企业重金招聘Python工程师标准>>> 响应式编程笔记(二):代码编写 博客分类: 架构 原文:Notes on Reactive Programming Part ...

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

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

  8. 011 吃药call功能分析和代码编写

    文章目录 定位吃药call 代码编写 定位吃药call 在编写自动吃药功能之前还需要两个数据,一个是吃药的功能call,另一个是当前的背包遍历,我们先来找吃药call. 首先来到明文封包call头部 ...

  9. 006 技能数组分析和代码编写

    文章目录 技能遍历 技能名字 数据整理 代码编写 现在我们已经有了人物的数据和周围对象的数据,还差一个技能数据和释放技能call,就可以完成自动打怪的功能. 接着我们来找技能遍历的数据 技能遍历 以技 ...

最新文章

  1. manjaro linux下载软件,manjaro linux
  2. 牛客网--2019校招--瞌睡
  3. ios页面间跳转方式总结
  4. javascript中为某个对象(控件)绑定事件的几种方法
  5. Maven学习总结(56)—— Maven、Gradle 、 Ant 哪一个构建工具最适合你?
  6. 通知:小密圈暂停服务
  7. 计算机操作系统(第二版)庞丽萍 杨富民 第一章 绪论课后答案
  8. Lisp编制的坡度标注_形位公差自动标注的ATUOLISP程序设计(Ⅰ)
  9. 浅谈从一维空间到十一维空间
  10. web服务器共享文件夹,局域网web共享文件夹的方法
  11. Win10免费升级win11方法
  12. C++扑克牌类的设计
  13. Real-Time Rendering 4th Edition 实时渲染第四版 第五章 着色基础(Shading Basics)
  14. java-php-python-ssm原创网络文学管理系统计算机毕业设计
  15. MySQL 之 DQL
  16. 【论文阅读笔记】Automatic Liver and Lesion Segmentation in CT Using Cascaded Fully Convolutional Neural Net
  17. Apache KafKa阅读官方文档心得
  18. Echarts 水波图实现
  19. 大家小心了,骗子QQ 14258588665 买ig骗我2600
  20. JavaWeb动态网页的方法和代码

热门文章

  1. AI:2020年6月22日北京智源大会演讲分享之10:40-11:10Daniel教授《 可微分的加权有限状态机及其机器学习应用》、11:10何晓冬教授《启动“智源-京东”任务导向多模态对话大赛》
  2. 成功解决UserWarning: Update your `Conv2D` call to the Keras 2 API问题
  3. DL之Encoder-Decoder:Encoder-Decoder结构的相关论文、设计思路、关键步骤等配图集合之详细攻略
  4. Dataset之CelebAman2woman:CelebAman2woman 数据集的简介、安装、使用方法之详细攻略
  5. AI公开课:18.05.16 周明博士(MSRA副院长)—北大AI第十一讲之《语言智能的进展》课堂笔记——你了解语言智能
  6. Python ML环境搭建与学习资料推荐
  7. spark hbase
  8. python之time模块和hashlib模块
  9. 【BZOJ】3456: 城市规划(多项式求ln)
  10. 后缀自动机序列自动机综合