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]; //0x0000
	char pad_0000[124]; //0x0000
	short MapId; // 0x7C
	char pad_096[146];//0x7E
	SRO_String Name; //0x0114 角色名字长度是7
	char pad_0115[892]; //0x0115
	int32_t MP; //0x04A8 蓝量
	int32_t MaxHP; //0x04AC 最大生命值
	int32_t MaxMP; //0x04B0 最大蓝量
	int32_t HP; //0x04B4 生命值
	char pad_04B8[608]; //0x04B8
	float x; //0x0718 x坐标
	float h; //0x071C z坐标
	float y; //0x0720 y坐标
	char pad_0724[428]; //0x0724
	char Lv; //0x08D0 等级
	char unlv[3];
	char pad_08D4[4]; //0x08D4
	int32_t Exp; //0x08D8 经验
	char pad_08DC[12]; //0x08DC
	int 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);

	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/377835.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Hgame week1 web

1.Bypass it 不准注册,禁用一下js成功注册登录拿到flag 2.ezHTTP 跟着提示走就行 jwt解析一下 3.点击选课发包时候显示已满 一直发包就会选上 每个都一直发包最后就可以全选课成功 后来得知是后天每隔一段时间会放出一些课,一直发包就能在放课的时候选到…

CDN相关和HTTP代理

CDN相关和HTTP代理 参考: 《透视 HTTP 协议》——chrono 把这两个放在一起是因为容易搞混,我一开始总以为CDN就是HTTP代理,但是看了极客时间里透视HTTP协议的讲解,感觉又不仅于此,于是专门写下来。 先说结论&#xf…

计算机组成原理——计算机系统概述

文章目录 概要计算机硬件的基本组成早期冯诺依曼的结构介绍特点 现代计算机的结构介绍五大部件的归属 五大部件存储器:存储体 MAR、MDR运算器控制器 运行原理 计算机软件系统软件和应用软件三种级别的语言编译程序与解释程序的区别 软件硬件功能程序的等价性指令集体…

LLaMA 模型中的Transformer架构变化

目录 1. 前置层归一化(Pre-normalization) 2. RMSNorm 归一化函数 3. SwiGLU 激活函数 4. 旋转位置嵌入(RoPE) 5. 注意力机制优化 6. Group Query Attention 7. 模型规模和训练超参数 8. 分布式模型训练 前置归一化与后置…

音视频色彩:RGB/YUV

目录 1.RGB 1.1介绍 1.2分类 1.2.1RGB16 1)RGB565 2)RGB555 1.2.2RGB24 1.2.3RGB222 2.YUV 2.1介绍 2.2分类 2.2.1 YUV444 2.2.2 YUV 422 2.2.3 YUV 420 2.3存储格式 2.3.1 YUYV 2.3.2 UYVY 2.3.3 YUV 422P 2.3.4 YUV420P/YUV420SP 2.3.5 YU12 和…

JavaScript流程控制详解之循环结构(倒三角、九九乘法表)

循环结构 在JavaScript中,循环语句指的是在满足某个条件下重复执行 指定的一段代码。若条件结果为true,则重复执行,则进入循环,否则结束循环。 在JavaScript中,循环语句如下: while语句do…while语句for语句 while…

springboot163美食推荐商城的设计与实现

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计,课程设计参考与学习用途。仅供学习参考, 不得用于商业或者非法用途,否则,一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

WifiConfigStore初始化读取-Android13

WifiConfigStore初始化读取 1、StoreData创建并注册2、WifiConfigStore读取2.1 文件读取流程2.2 时序图2.3 日志 1、StoreData创建并注册 packages/modules/Wifi/service/java/com/android/server/wifi/WifiConfigManager.java mWifiConfigStore.registerStoreData(mNetworkL…

Windows 安装 MySQL 最新最简教程

Windows 安装 MySQL 最新最简教程 官网地址 https://dev.mysql.com/downloads/mysql/下载 MySQL zip 文件 配置 MySQL1、解压文件 2、进入 bin 目录 搜索栏输入 cmd 回车进入命令行 C:\Users\zhong\Desktop\MySQL\mysql-8.3.0-winx64\mysql-8.3.0-winx64\bin 注意这里是你自己…

【数据分享】1929-2023年全球站点的逐日平均风速数据(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据,气象指标包括气温、风速、降水、能见度等指标,说到气象数据,最详细的气象数据是具体到气象监测站点的数据! 有关气象指标的监测站点数据,之前我们分享过1929-2023年全球气象站…

深入探索 Express.js 的高级特性

引言 Express.js 是一个基于 Node.js 平台的 Web 开发框架,旨在提供一种简单、易于使用的方式来创建 Web 应用程序。由于其灵活性和可扩展性,它已经成为了 Node.js 社区最受欢迎的框架之一。在本文中,我们将重点介绍 Express.js 的高级特性&…

Python 深入理解 os 和 sys 模块

Python 深入理解 os 和 sys 模块 OS 介绍代码智能连接(拼接)路径创建目录展示(列出目录)删除文件重命名文件或目录 sys 介绍代码命令行参数处理 (sys.argv)标准输入输出重定向 (sys.stdin, sys.stdout, sys.stderr):解…

08-Java过滤器模式 ( Filter Pattern )

Java过滤器模式 实现范例 过滤器模式(Filter Pattern)或允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来 过滤器模式(Filter Pattern) 又称 标准模式(Criteria Pattern…

基于LLM的Agent的兴起及其潜力:综述

原文链接:https://arxiv.org/pdf/2309.07864v1.pdf 1. Introduction LLM-based Agent的基本构成。本文认为,构成LLM-based Agent的核心部件有三个: brain: 主要目标有2个—信息记忆、信息处理perception: 主要目标在于让agent能够感受到更…

YOLOv8改进 | 利用训练好权重文件计算YOLOv8的FPS、推理每张图片的平均时间(科研必备)

一、本文介绍 本文给大家带来的改进机制是利用我们训练好的权重文件计算FPS,同时打印每张图片所利用的平均时间,模型大小(以MB为单位),同时支持batch_size功能的选择,对于轻量化模型的读者来说,本文的内容对你一定有帮助,可以清晰帮你展示出模型速度性能的提升以及轻量…

二进制安全虚拟机Protostar靶场(8)heap3 Fastbins unlink exploit

前言 这是一个系列文章&#xff0c;之前已经介绍过一些二进制安全的基础知识&#xff0c;这里就不过多重复提及&#xff0c;不熟悉的同学可以去看看我之前写的文章 heap3 程序静态分析 https://exploit.education/protostar/heap-three/#include <stdlib.h> #include …

三、设计模式相关理论总结

一、面向对象编程 1.1 概述 简称Object Oriented Program(OOP)&#xff0c;指以类或对象作为基础组织单元&#xff0c;遵循封装、继承、多态以及抽象等特性&#xff0c;进行编程。其中面向对象不一定遵循封装、继承、封装和多态等特性&#xff0c;只是前人总结的套路规范&…

携程网首页案例制作(移动端)

技术选型 方案&#xff1a;采用单独制作移动页面方案 技术&#xff1a;布局采用flex布局 body样式 通常要设置最大宽度&#xff0c;最小宽度&#xff0c;水平居中&#xff0c;字体设置&#xff0c;背景颜色以及相关初始化 body {max-width: 540px;min-width: 320px;margin…

CDH6.3.2 多 Spark 版本共存

一 部署Spark客户端 1.1 部署spark3客户端 tar -zxvf spark-3.3.1-bin-3.0.0-cdh6.3.2.tgz -C /opt/cloudera/parcels/CDH/lib cd /opt/cloudera/parcels/CDH/lib mv spark-3.3.1-bin-3.0.0-cdh6.3.2/ spark3将 CDH 集群的 spark-env.sh 复制到 /opt/cloudera/parcels/CDH/li…

RxJava Subject

目录 AsyncSubjectBehaviorSubjectPublishSubjectReplaySubjectSerializedSubjectUnicastSubject 在Rxjava中&#xff0c; Subject可以同时表示Observer和Observable, 允许从单个源到多个子观察者multiple child Observers。 除了 onSubscribe(io.reactivex.disposables.Dispos…