78.网游逆向分析与插件开发-背包的获取-背包类的C++还原与获取物品名称

news2024/11/26 0:51:26

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

上一个内容:77.网游逆向分析与插件开发-背包的获取-物品类的C++还原-CSDN博客

 码云地址(ui显示角色数据 分支):https://gitee.com/dye_your_fingers/sro_-ex.git

码云版本号:a235362f248f4d865056675b60500382b6747f53

代码下载地址,在 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的分享

以 修复角色名与等级显示问题-CSDN博客它的代码为基础进行修改

需要使用x96dbg逆向一下,来到0x787022位置(这个位置是在 背包结构与指针的逆向分析 这里分析出来的),从下图中的函数里看出,基本都是围绕这个3几几,所以结构体大小搞成0x400就行

然后打开 ReClass.NET,设置大小0x400,十进制是1024

然后得到背包结构地址:

涉及到的内容:

背包结构:背包结构与指针的逆向分析,x96dbg索引地址 0x787022

物品名:物品名称与物品编号的映射关系分析,x96dbg索引地址 0x739915

Res.cpp文件的修改,新加 ReadItemTitle函数、_ReadItemTitle变量初始化

#include "pch.h"
#include "Res.h"
// 这里为了给 _ReadTitle 默认值,防止编译不通过
Res::PROC_LP Res::_ReadTitle{};
Res::PROC_LP Res::_ReadItemTitle{};
PSROSTRING Res::ReadTitle(wchar_t* index)
{
	/**
		获取按钮文字通过逆向分析,看出是一个thiscall
		在调用获取文字函数时给ecx赋值了,这是典型的thiscall方式
		下方(this->*_ReadTitle)(index)写法翻译成汇编就会是
		mov ecx,this
		mov eax, [ecx+xxx];
		push index
		call eax
		大概就会变成上方四行代码,也就是一个thiscall
		如果穿插汇编代码,会很lou,这样用c++写就很优雅
	*/
	return (this->*_ReadTitle)(index);
}

PSROSTRING Res::ReadItemTitle(LPVOID ptr)
{
	return (this->*_ReadItemTitle)(ptr);
}

Res.h文件的修改,新加 ReadItemTitle函数、_ReadItemTitle函数指针类型变量声明、PROC_LP函数指针,删除了 PROC_WCHAR1函数指针

#pragma once
#include "SRO_String.h"
// sro_string通过逆向分析,文字获取方式得到的一个结构体
typedef class Res
{
	// 定义一个函数指针
	typedef PSROSTRING(Res::* PROC_LP)(LPVOID);
public:
	// 给函数指针声明一个变量
	static PROC_LP _ReadTitle;
	static PROC_LP _ReadItemTitle;
	// 封装 _ReadTitle 使用时比较好用
	PSROSTRING ReadTitle(wchar_t* index);
	// 可以获取物品名
	PSROSTRING ReadItemTitle(LPVOID ptr);

}*PRes;

GameBase.cpp,修改了 Init函数

#include "pch.h"
#include "GameBase.h"

GameBase* _pgamebase;

void GameBase::Init()
{
	unsigned* addrRead = (unsigned*)0x1256E3C;

	SRO_Res = (PRes)0x1036518;
	SRO_Notice = (PNotice)addrRead[0];
	addrRead = (unsigned*)0x1037D3C;
	SRO_Player = (PAIM)addrRead[0];
	
	InitClassProc(&Res::_ReadTitle, 0x9A46C0);
	InitClassProc(&Res::_ReadTitle, 0x9A4640);
	InitClassProc(&Res::_ReadTitle, 0x9A4640);
	InitClassProc(&Notice::_NormalNotice, 0x848580);
	InitClassProc(&Notice::_NetNotice, 0x844E40);
	InitClassProc(&Notice::_ChatNotice, 0x844E80);
	InitClassProc(&ITEM::_GetItemRes, 0x995800);

}

void GameBase::InitClassProc(LPVOID proc_addr, unsigned value)
{
	unsigned* uWrite = (unsigned*)proc_addr;
	uWrite[0] = value;
}

GameBase::GameBase()
{
	_pgamebase = this;
	// Init();// 初始化机制,完成游戏与我们dll的对接
}

GameBase.h文件的修改,新加引入 ITEM.h 头文件

#pragma once
#include "Res.h"
#include "Notice.h"
#include "AIM.h"
#include "ITEM.h"

class GameBase
{
	void InitClassProc(LPVOID proc_addr, unsigned value);
public:
	void Init();
	GameBase();
	PRes SRO_Res;
	PNotice SRO_Notice;
	PAIM SRO_Player;
};

新加 BackPack.cpp文件,背包结构

#include "pch.h"
#include "BackPack.h"

int BackPack::PackCount()
{
    int allsize = (DWORD)ItemEnd - (DWORD)ItemStart;
    if (allsize<0) return 0;
    return allsize >> 2;
}

PITEM BackPack::GetItem(int index)
{
    if (index < PackCount()) {
        PITEM pitem = ItemStart[index];
        return pitem;
    }
    return NULL;
}

新加BackPack.h文件,背包结构

#pragma once
#include "ITEM.h"

typedef class BackPack // 背包
{
protected:
	char pad_0000[928]; //0x0000
public:
	PITEM* ItemStart; //0x03A0 物品起始地址
	PITEM* ItemEnd; //0x03A4 物品结束地址
protected:
	char pad_03A8[88]; //0x03A8
public:
	int PackCount();
	PITEM GetItem(int index);
}*PBackPack; //Size: 0x0400

新加ITEM.cpp文件

#include "pch.h"
#include "ITEM.h"
#include "extern_all.h"

ITEM::PROC ITEM::_GetItemRes{};
LPVOID ITEM::GetItemRes()
{
	LPVOID resPtr = (this->*_GetItemRes)();
	resPtr = (LPVOID)((DWORD)resPtr + 0x60);
	return resPtr;
}

PSROSTRING ITEM::GetName()
{
	return _pgamebase->SRO_Res->ReadItemTitle(GetItemRes());
}

ITEM.h文件的修改,新加 GetItemRes函数、GetName函数、PROC函数指针,_GetItemRes函数指针类型变量声明

#pragma once
#include "SRO_String.h"

typedef class ITEM
{
	typedef LPVOID(ITEM::* PROC)();
public:
	static PROC _GetItemRes;
protected:
	char pad_0000[52]; //0x0000
public:
	int Type; //0x0034 类型
protected:
	char pad_0038[84]; //0x0038
public:
	int Elv; //0x008C 装备强化程度
protected:
	char pad_0090[8]; //0x0090
public:
	int Durabillty; //0x0098 耐久度
	int Count; //0x009C 数量
protected:
	char pad_00A0[64]; //0x00A0
public:
	int MaxPhyAttack; //0x00E0 最大物理攻击力
	int MinPhyAttack; //0x00E4 最小物理攻击力
	int MaxMagAttack; //0x00E8 最大魔法攻击力
	int MinMagAttack; //0x00EC 最小魔法攻击力
protected:
	char pad_00F0[48]; //0x00F0
public:
	int MaxDurabillty; //0x0120 最大耐久度
protected:
	char pad_0124[16]; //0x0124
public:
	int mingzhonglv; //0x0134 命中率
protected:
	char pad_0138[152]; //0x0138
public:
	int Plv; //0x01D0 宠物等级
protected:
	char pad_01D4[692]; //0x01D4
public:
	LPVOID GetItemRes();
	// 获取物品名
	PSROSTRING GetName();
}*PITEM; //Size: 0x0488

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

影响ETL数据传输性能的9大因素及主流ETL应对策略

前言 现在很多企业在选择ETL工具时都特别关注ETL的数据传输性能&#xff0c;而有很多开源ETL工具都说自已是性能如何如何快&#xff0c;而事实上数据传输性能是不是这些工具说的那样快呢&#xff1f; 数据传输性能受制于哪些因素呢&#xff1f;企业在自身数据库性能受制的情况…

Redis(七)复制

文章目录 是什么功能配置配主库不配从库权限细节 案例配置文件修改 一主二仆固定配置文件主从问题命令操作手动指定 薪火相传反客为主复制原理和工作流程存在问题 是什么 https://redis.io/docs/management/replication/ 就是主从复制&#xff0c;master以写为主&#xff0c;S…

农业气象站的工作原理!

TH-NQ8农业气象站的工作原理是基于传感器技术、数据采集技术、数据传输技术和数据处理技术等多个环节相互配合而实现的。 首先&#xff0c;农业气象站通过各种传感器对不同的气象指标进行实时监测和记录。传感器的种类有很多&#xff0c;包括温度传感器、湿度传感器、风速传感…

3dmax渲不出模型是什么原因---模大狮模型网

3DMax无法渲染模型可能有多种原因。以下是一些常见的问题和解决方法&#xff1a; 材质设置错误&#xff1a;检查模型的材质设置是否正确&#xff0c;包括纹理贴图的路径、UV映射是否正确等。确保材质的属性设置正确&#xff0c;如颜色、反射率、透明度等。 灯光设置问题&#…

vue3中form对象无法赋值问题

加上 async await还是不行 有时候对象的值死活赋不上值&#xff0c;这时候可以看下赋值的对象变量名是否和页面组件中的ref相同&#xff0c;如果存在相同&#xff0c;则参照以下解决方案&#xff1a; 问题定位&#xff1a;setup 中抛出的变量不能与页面组件中的 ref 重复 解决…

第40集《佛法修学概要》

请大家打开讲义第一百零六页。我们讲到大乘的果位。大乘佛法的修学跟小乘最大的差别&#xff0c;主要在于一句话&#xff0c;就是大乘佛法是一种“称性起修&#xff0c;全修在性”。大乘佛法的功德第一个“称性”&#xff0c;这个“称”就是随顺。我们一念明了的心&#xff0c;…

Java 异常及处理|Error、Throwable、Exception

目录 一、Java 异常概述 二、异常类 1、Throwable&#xff1a; 1.1 Throwable 类的常用方法包括&#xff1a; 1.2 创建和抛出 Throwable 2、Error&#xff1a; 2.1 Error 与异常处理的关系 3、Exception&#xff1a; 3.1 如何处理 Exception 方式1 、往外抛&#xff1…

Qt6入门教程 10:菜单栏、工具栏和状态栏

目录 一.菜单栏 1.Qt Designer 1.1添加菜单和菜单项 1.2添加二级菜单 1.3给菜单和菜单项添加图标 1.4给菜单项添加功能 2.纯手写 二.工具栏 1.Qt Designer 1.1添加工具栏按钮 1.2工具栏的几个重要属性 2.纯手写 三.状态栏 1.Qt Designer 2.纯手写 用Qt Creator新…

Unity - 简单音频视频

“Test_04” 音频 使用AudioTest脚本控制Audio Source组件&#xff0c;在脚本中声明"music"和"se"之后&#xff0c;在unity中需要将音频资源拖拽到对应位置。 AudioTest public class AudioTest : MonoBehaviour {// 声明音频// AudioClippublic AudioC…

Raspbian安装云台

Raspbian安装云台 1. 源由2. 选型3. 组装4. 调试4.1 python3-print问题4.2 python函数入参类型错误4.3 缺少mjpg-streamer可执行文件4.4 缺失编译头文件和库4.5 python库缺失4.6 图像无法显示&#xff0c;但libcamera-jpeg测试正常4.7 异常IOCTL报错4.8 Git问题 5. 效果5.1 WEB…

CSS文本外观属性内容(知识点1)

知识引入 使用HTML可以对文本外观进行简单的控制&#xff0c;但是效果并不理想&#xff0c;为此CSS提供了一系列的文本外观样式属性&#xff0c;具体如下。 color:文本颜色 color属性用于定义文本的颜色&#xff0c;其取值方式有以下三种。 &#xff08;1&#xff09;预定义…

springboot中一些注解

springboot中一些注解 1:项目启动时会去扫描启动的注解&#xff0c;一般是启动时就想要被加载的方法&#xff1a; 2:springBoot中MSApplication启动类的一些其他注解&#xff1a; EnableAsync&#xff1a;这是一个Spring框架的注解&#xff0c;它用于开启方法异步调用的功能。当…

RTDETR 引入 UniRepLKNet:用于音频、视频、点云、时间序列和图像识别的通用感知大卷积神经网络 | DRepConv

大卷积神经网络(ConvNets)近来受到了广泛研究关注,但存在两个未解决且需要进一步研究的关键问题。1)现有大卷积神经网络的架构主要遵循传统ConvNets或变压器的设计原则,而针对大卷积神经网络的架构设计仍未得到解决。2)随着变压器在多个领域的主导地位,有待研究ConvNets…

Linux 一键部署influxd2-telegraf

influxd2前言 influxd2 是 InfluxDB 2.x 版本的后台进程,是一个开源的时序数据库平台,用于存储、查询和可视化时间序列数据。它提供了一个强大的查询语言和 API,可以快速而轻松地处理大量的高性能时序数据。 telegraf 是一个开源的代理程序,它可以收集、处理和传输各种不…

Docker容器引擎(1)

目录 一.Docker 概述 为什么要用到容器&#xff1f; docker是什么&#xff1f; 容器与虚拟机的区别&#xff1f; docker的三个核心概念&#xff1a; 二.安装docker 安装依赖包&#xff1a; 安装 Docker-CE并设置为开机自动启动&#xff1a; 查看 docker 版本信息&#…

制作高端的电子杂志神器推荐

根据市场调查数据显示&#xff0c;越来越多的消费者开始青睐电子杂志这种阅读方式。相比传统纸质杂志&#xff0c;电子杂志具有更高的阅读体验、更便捷的分享和传播方式以及更环保的阅读方式。此外&#xff0c;越来越多的企业也开始重视电子杂志的宣传作用&#xff0c;将其作为…

植物神经功能紊乱到底是什么疾病?今天来告诉你原因和治疗方法!

首先&#xff0c;什么是植物神经功能紊乱&#xff1f;简单来说&#xff0c;植物神经是自主神经系统的一部分&#xff0c;它控制着自主生理反应&#xff0c;比如呼吸、心跳、血压、消化系统等。当这个系统出现紊乱时&#xff0c;就会导致植物神经功能紊乱。咨询&#xff1a;tdhy…

Unity中URP下的 额外灯 逐像素光 和 逐顶点光

文章目录 前言一、额外灯 的 逐像素灯 和 逐顶点灯1、存在额外灯的逐像素灯2、存在额外灯的逐顶点灯 二、测试这两个宏的作用1、额外灯的逐像素灯2、额外灯的逐顶点灯 前言 在之前的文章中&#xff0c;我们了解了 主光相关的反射计算。 Unity中URP下的SimpleLit的 Lambert漫反…

eNSP学习——VLAN基础配置及Access接口

目录 原理概述 实验内容&#xff1a; 实验目的&#xff1a; 实验步骤&#xff1a; 实验拓扑 配置过程 实验编址 基本配置 创建vlan 配置Access接口 原理概述 早期的局域网技术是基于总线型结构的。总线型拓扑结构是由一根单电缆连接所有主机&#xff0c;就导致所…

[SS]语义分割_转置卷积

转置卷积&#xff08;Transposed Convolution&#xff09; 抽丝剥茧&#xff0c;带你理解转置卷积&#xff08;反卷积&#xff09; 目录 一、概念 1、定义 2、运算步骤 二、常见参数 一、概念 1、定义 转置卷积&#xff08;Transposed Convolution&#xff09;&#xf…