94.网游逆向分析与插件开发-游戏窗口化助手-地图数据获取的逆向分析与C++代码还原

本文主要是介绍94.网游逆向分析与插件开发-游戏窗口化助手-地图数据获取的逆向分析与C++代码还原,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

内容参考于:易道云信息技术研究院VIP课

上一个内容:升级经验数据获取的逆向分析

码云地址(游戏窗口化助手 分支):https://gitee.com/dye_your_fingers/sro_-ex.git

码云版本号:c4351a5b346d8953a1a8e3ec81e6dc05160de6d2

代码下载地址,在 SRO_EX 目录下,文件名为:SRO_Ex-地图数据获取的逆向分析与C++代码还原.zip

链接:https://pan.baidu.com/s/1W-JpUcGOWbSJmMdmtMzYZg

提取码:q9n5

--来自百度网盘超级会员V4的分享

HOOK引擎,文件名为:黑兔sdk.zip

链接:https://pan.baidu.com/s/1IB-Zs6hi3yU8LC2f-8hIEw

提取码:78h8

--来自百度网盘超级会员V4的分享

以 升级经验数据获取的逆向分析 它的代码为基础进行修改

首先要通过逆向分析,看游戏中是怎样得到地图数据的,它怎样得到我们就怎样得到

然后通过下图红框位置入手,它这几个文字肯定是根据角色所在地图的数据里得到的,就算服务器给传来的,在内存也能找到

然后打开 Cheat Engine 搜索 大唐草原 这个字符串,然后就找到了,这里注意,修改完字符串之后,在游戏里移动一下,它才会显示我们修改的内容

然后接下来找出是什么访问了这个地址,移动一下,就出现了两个位置对它进行了访问

然后通过显示反汇编程序按钮,简略查看代码,发现都很难,所以直接使用第一个找,然后记录寄存器,然后打开x96dbg打条件断点分析

然后断下来了

然后一路ctrl+f9再按f8,知道在栈里看不到 5唐草原 这个字符串为止,到下图位置就看不到 5唐草原 这个字符串了

然后它也不是一个常断函数,所以记录关键点0x844D6F位置调用了0x72D130函数

然后断点进入0x72D130函数,看看 5唐草原 这个字符串第一次出现是在什么位置

分析的过程中,看到了游戏中的x坐标与y坐标是怎样显示的,如下图两个红框所示

然后继续往下就出现了 5唐草原 这个字符串,现在的位置是0x72D495

然后 5唐草原 这个字符串,是通过eax+4位置得到的,然后在eax上方有一个函数调用,所以eax的值是通过0x9A46C0函数得到的,0x9A46C0是0x1036518类里的成员函数,然后0x9A46C0有一个参数

0x9A46C0函数我们以及封装过了

然后接下来看它的参数是怎样得出的,通过高亮显示看出它是栈里来的数据,这个参数有点麻烦,所以先看一下它的内容是什么,看看可不可以通过内容,避免继续分析

它的值是 24997,好像是一个id

然后再回到下图红框位置(0x844D6F),然后进入0x72D130函数里,看看 24997 这个数字第一次出现是在哪里

然后通过一路f8,最终在下图位置出现了 24997 这个数字

然后调用完0xC3D956函数之后,有一句add esp,40的代码,在函数后面有这样的代码说明,这是恢复栈平衡的操作,但是它一个函数恢复了40个大小,很显然不可能,它应该是一次恢复了多个函数的栈

所以它的参数有几个需要进入0xC3D956函数里分析:看出它push了五个值,其中push了一个0,所以它应该有四个参数

然后通过断点查看它参数的数据,从下往上,第一个参数是一个十六进制数,这个十六进制数,就是我们的 24997,然后就第二个参数是一个固定的,然后第三个参数也是一个固定的,应该是长度,然后第四个参数应该是一个缓冲区,0xC3D956这个函数会把第一个参数转成十进制然后写到第四个参数里进行返回

所以接下来直接找ebp的值从哪来的就行了,一共有两处修改了ebp的值

第一处:

第二处:

然后它只会执行第一处代码,它的值也正是我们要找的24997

所以接下来看eax的值从哪来,看出它是从下图红框位置得到的,也就是从0x1037D3C这个是角色的指针

0x1037D3C角色指针,如下图我们封装过了,然后到这也就是说人物结构体中偏移0x7C位置是一个short类型,它是指的所在地图

效果图:

#pragma once
#include "SRO_String.h"typedef class AIM
{
public://char pad_0000[272]; //0x0000char pad_0000[124]; //0x0000short MapId; // 0x7Cchar pad_096[146];//0x7ESRO_String Name; //0x0114 角色名字长度是7char pad_0115[892]; //0x0115int32_t MP; //0x04A8 蓝量int32_t MaxHP; //0x04AC 最大生命值int32_t MaxMP; //0x04B0 最大蓝量int32_t HP; //0x04B4 生命值char pad_04B8[608]; //0x04B8float x; //0x0718 x坐标float h; //0x071C z坐标float y; //0x0720 y坐标char pad_0724[428]; //0x0724char Lv; //0x08D0 等级char unlv[3];char pad_08D4[4]; //0x08D4int32_t Exp; //0x08D8 经验char pad_08DC[12]; //0x08DCint SkillPoint; // 技能点数char UnUSERage; // 怒气char unknownH33; char Rage; //0x08EE 怒气值char RageEx; //0x08EF 怒气值副本char pad_08F0[1883]; //0x08F0
}*PAIM; //Size: 0x104B

AIM.h文件的修改:

CHelperUI.cpp文件的修改:

// CHelperUI.cpp: 实现文件
//#include "pch.h"
#include "CHelperUI.h"
#include "afxdialogex.h"
#include "extern_all.h"void _stdcall TimeProcHelper(HWND, UINT, UINT_PTR, DWORD) {if (_ui_helper)_ui_helper->ShowData();
}IMPLEMENT_DYNAMIC(CHelperUI, CDialogEx)CHelperUI::CHelperUI(CWnd* pParent /*=nullptr*/): CDialogEx(IDD_HELPER, pParent)
{}CHelperUI::~CHelperUI()
{
}BOOL CHelperUI::OnInitDialog()
{CDialogEx::OnInitDialog();this->SetBackgroundColor(RGB(255, 255, 255));HPBar.SetBkColor(RGB(0 ,0, 0));MPBar.SetBkColor(RGB(0 ,0, 0));RageBar.SetBkColor(RGB(0 ,0, 0));ExBar.SetBkColor(RGB(0 ,0, 0));HPBar.SetBarColor(RGB(255 ,0, 0));MPBar.SetBarColor(RGB(0x0, 0x0, 0x99));RageBar.SetBarColor(RGB(0x66, 0x0, 0x66));ExBar.SetBarColor(RGB(0x00, 0xFF, 0xCC));HPBar.SetRange(0, 999);MPBar.SetRange(0, 1000);RageBar.SetRange(0, 5);ExBar.SetRange(0, 1000);//HPBar.SetPos(50);//MPBar.SetPos(50);//RageBar.SetPos(50);//ExBar.SetPos(50);::SetTimer(this->m_hWnd, 0x100002, 100, TimeProcHelper);return TRUE;
}void CHelperUI::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);DDX_Control(pDX, IDC_PRO_HP, HPBar);DDX_Control(pDX, IDC_PRO_MP, MPBar);DDX_Control(pDX, IDC_PRO_RAGE, RageBar);DDX_Control(pDX, IDC_PRO_RAGE2, ExBar);
}BEGIN_MESSAGE_MAP(CHelperUI, CDialogEx)ON_BN_CLICKED(IDOK, &CHelperUI::OnBnClickedOk)
END_MESSAGE_MAP()// CHelperUI 消息处理程序void CHelperUI::OnBnClickedOk()
{// TODO: 在此添加控件通知处理程序代码// CDialogEx::OnOK();//CString tmp;//tmp.Format(L"%d", _pgamebase->SRO_Player->MapId);//AfxMessageBox(tmp);////CString city;//city.Format(L"%s", _pgamebase->SRO_Res->ReadTitle(tmp.GetBuffer())->wcstr());//AfxMessageBox(city);
}void CHelperUI::ShowData()
{CString tmp;CString city;auto _player = _pgamebase->SRO_Player;if (_player) {tmp.Format(L"%s Lv %d", _player->Name.wcstrByName(), _player->Lv);this->SetWindowText(tmp);float hpStep = _player->HP * 1000;hpStep = hpStep / _player->MaxHP;HPBar.SetPos(hpStep);float mpStep = _player->MP * 1000;mpStep = mpStep / _player->MaxMP;MPBar.SetPos(mpStep);RageBar.SetPos(_player->Rage);unsigned max_exp = _pgamebase->SRO_Core->GetLvMaxExp(_player->Lv)->Exp;float expSetp = _player->Exp * 1000;expSetp = expSetp / max_exp;ExBar.SetPos(expSetp);tmp.Format(L"%.1f %.1f %.1f", _player->x, _player->h, _player->y);GetDlgItem(IDC_STATIC_CORD)->SetWindowText(tmp);tmp.Format(L"%d", _pgamebase->SRO_Player->MapId);city.Format(L"%s", _pgamebase->SRO_Res->ReadTitle(tmp.GetBuffer())->wcstr());GetDlgItem(IDC_STATIC_MAP)->SetWindowText(city);}
}

这篇关于94.网游逆向分析与插件开发-游戏窗口化助手-地图数据获取的逆向分析与C++代码还原的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/691210

相关文章

详谈redis跟数据库的数据同步问题

《详谈redis跟数据库的数据同步问题》文章讨论了在Redis和数据库数据一致性问题上的解决方案,主要比较了先更新Redis缓存再更新数据库和先更新数据库再更新Redis缓存两种方案,文章指出,删除R... 目录一、Redis 数据库数据一致性的解决方案1.1、更新Redis缓存、删除Redis缓存的区别二

Redis事务与数据持久化方式

《Redis事务与数据持久化方式》该文档主要介绍了Redis事务和持久化机制,事务通过将多个命令打包执行,而持久化则通过快照(RDB)和追加式文件(AOF)两种方式将内存数据保存到磁盘,以防止数据丢失... 目录一、Redis 事务1.1 事务本质1.2 数据库事务与redis事务1.2.1 数据库事务1.

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

SpringCloud集成AlloyDB的示例代码

《SpringCloud集成AlloyDB的示例代码》AlloyDB是GoogleCloud提供的一种高度可扩展、强性能的关系型数据库服务,它兼容PostgreSQL,并提供了更快的查询性能... 目录1.AlloyDBjavascript是什么?AlloyDB 的工作原理2.搭建测试环境3.代码工程1.

Java调用Python代码的几种方法小结

《Java调用Python代码的几种方法小结》Python语言有丰富的系统管理、数据处理、统计类软件包,因此从java应用中调用Python代码的需求很常见、实用,本文介绍几种方法从java调用Pyt... 目录引言Java core使用ProcessBuilder使用Java脚本引擎总结引言python

Java中ArrayList的8种浅拷贝方式示例代码

《Java中ArrayList的8种浅拷贝方式示例代码》:本文主要介绍Java中ArrayList的8种浅拷贝方式的相关资料,讲解了Java中ArrayList的浅拷贝概念,并详细分享了八种实现浅... 目录引言什么是浅拷贝?ArrayList 浅拷贝的重要性方法一:使用构造函数方法二:使用 addAll(

Oracle Expdp按条件导出指定表数据的方法实例

《OracleExpdp按条件导出指定表数据的方法实例》:本文主要介绍Oracle的expdp数据泵方式导出特定机构和时间范围的数据,并通过parfile文件进行条件限制和配置,文中通过代码介绍... 目录1.场景描述 2.方案分析3.实验验证 3.1 parfile文件3.2 expdp命令导出4.总结

Redis主从复制实现原理分析

《Redis主从复制实现原理分析》Redis主从复制通过Sync和CommandPropagate阶段实现数据同步,2.8版本后引入Psync指令,根据复制偏移量进行全量或部分同步,优化了数据传输效率... 目录Redis主DodMIK从复制实现原理实现原理Psync: 2.8版本后总结Redis主从复制实

JAVA利用顺序表实现“杨辉三角”的思路及代码示例

《JAVA利用顺序表实现“杨辉三角”的思路及代码示例》杨辉三角形是中国古代数学的杰出研究成果之一,是我国北宋数学家贾宪于1050年首先发现并使用的,:本文主要介绍JAVA利用顺序表实现杨辉三角的思... 目录一:“杨辉三角”题目链接二:题解代码:三:题解思路:总结一:“杨辉三角”题目链接题目链接:点击这里