83.网游逆向分析与插件开发-背包的获取-自动化助手显示装备数据

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

上一个内容:装备栏数据与算法的C++还原-CSDN博客

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

码云版本号:849fed846405438d2220b8ab04fda2522e74482a

代码下载地址,在 SRO_EX 目录下,文件名为:SRO_Ex-自动化助手显示装备数据.zip

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

提取码:q9n5

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

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

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

提取码:78h8

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

以 82.网游逆向分析与插件开发-背包的获取-装备栏数据与算法的C++还原-CSDN博客 它的代码为基础进行修改

效果图:

经过分析背包与物品的数据(也就是它们对象的指针),发现几个问题,就是找到一个好的切入点,那么会容易非常多,如果没有好的切入点,就会很累很累,这是第一个问题,然后第二个问题,现在写代码的方式,在将来扩展起来会发现,会很轻松很容易,管理起来会很方便。

新加读取装备信息按钮:

EquipPack.h文件的修改,EquipPack类中加 public 修饰符

#pragma once
#include "ITEM.h"

// 装备栏格子索引
enum class EquipType {
	Hat = 0,
	Jacket = 1,
	Showlder = 2,
	Hand = 3,
	Trousers = 4,
	Shoe = 5,
	Weapon = 6,
	WeaponEx = 7,
	Ol = 8,
	Earring = 9,
	NeckLace = 10,
	RingLeft = 11,
	RingRight = 12
};

typedef class EquipPack
{
public:
	PITEM GetItem(EquipType index);
}*PEquipPack;

ITEM.cpp文件的修改,新加GetNameByWide函数,修改了GetName函数

#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()
{
	LPVOID p = GetItemRes();
	if (p)	return _pgamebase->SRO_Res->ReadItemTitle(p);
	else return NULL;
}

wchar_t* ITEM::GetNameByWide()
{
	LPVOID p = GetItemRes();
	if (p)	return _pgamebase->SRO_Res->ReadItemTitle(p)->wcstr();
	return L"无法读取";
}

ITEM.h文件的修改,新加 GetNameByWide函数

#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[0xc]; //0x01D4
public:
	LPVOID GetItemRes();
	// 获取物品名
	PSROSTRING GetName();
	wchar_t* GetNameByWide();
}*PITEM; //Size: 0x0488

CUIWnd_1.h文件的修改,新加 OnBnClickedButton2函数声明

#pragma once
#include "afxdialogex.h"

// CUIWnd_1 对话框

class CUIWnd_1 : public CDialogEx
{
	DECLARE_DYNAMIC(CUIWnd_1)

public:
	CUIWnd_1(CWnd* pParent = nullptr);   // 标准构造函数
	virtual ~CUIWnd_1();

// 对话框数据
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_PAGE_1 };
#endif

protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

	DECLARE_MESSAGE_MAP()
public:
	afx_msg void OnBnClickedButton1();
	CListBox lstPack;
	afx_msg void OnBnClickedButton2();
};

CUIWnd_1cpp文件的修改,新加 OnBnClickedButton2函数,修改了 BEGIN_MESSAGE_MAP宏

// CUIWnd_1.cpp: 实现文件
//

#include "pch.h"
#include "htdMfcDll.h"
#include "CUIWnd_1.h"
#include "afxdialogex.h"
#include "extern_all.h"


// CUIWnd_1 对话框

IMPLEMENT_DYNAMIC(CUIWnd_1, CDialogEx)

CUIWnd_1::CUIWnd_1(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_PAGE_1, pParent)
{

}

CUIWnd_1::~CUIWnd_1()
{
}

void CUIWnd_1::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_LIST1, lstPack);
}


BEGIN_MESSAGE_MAP(CUIWnd_1, CDialogEx)
	ON_BN_CLICKED(IDC_BUTTON1, &CUIWnd_1::OnBnClickedButton1)
	ON_BN_CLICKED(IDC_BUTTON2, &CUIWnd_1::OnBnClickedButton2)
END_MESSAGE_MAP()


// CUIWnd_1 消息处理程序


void CUIWnd_1::OnBnClickedButton1()
{
	// int count = _pgamebase->SRO_Control->GetPPack()->GetPackBack()->PackCount();
	CString tmp;
	// tmp.Format(L"%d", count);
	// AfxMessageBox(tmp);
	PBackPack _PackBack = _pgamebase->SRO_Control->GetPPack()->GetPackBack();

	lstPack.ResetContent();
	for (int i = 0; i < _PackBack->PackCount(); i++)
	{

		PITEM item = _PackBack->GetItem(i);
		if ((item != NULL) && (item->Type)) {
			tmp.Format(L"[%s][数量:%d][耐久:%d/%d]\n", item->GetNameByWide(), item->Count, item->Durabillty, item->MaxDurabillty);
			lstPack.AddString(tmp);
		}
	}

}


void CUIWnd_1::OnBnClickedButton2()
{
	// int count = _pgamebase->SRO_Control->GetPPack()->GetPackBack()->PackCount();
	CString tmp;
	// tmp.Format(L"%d", count);
	// AfxMessageBox(tmp);
	PEquipPack _PackBack = _pgamebase->SRO_Control->GetPPack()->GetEquipBack();

	lstPack.ResetContent();
	for (int i = 0; i < 13; i++)
	{

		PITEM item = _PackBack->GetItem((EquipType)i);
		if ((item != NULL) && (item->Type > 0)) {
			tmp.Format(L"[%s][数量:%d][耐久:%d/%d]\n", item->GetNameByWide(), item->Count, item->Durabillty, item->MaxDurabillty);
			lstPack.AddString(tmp);
		}
	}
}

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

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

相关文章

有没有游泳可以戴的耳机,盘点2024年最值得入手的游泳耳机

最近几年的天气越来越炎热&#xff0c;水中运动无疑成为大家喜爱的清凉方式。无论是游泳、浮潜还是冲浪&#xff0c;都能让我们在享受清凉的同时&#xff0c;还能锻炼身体。然而&#xff0c;如果是音乐爱好者&#xff0c;想在游泳时也享受到动人的旋律&#xff0c;却因为耳机无…

亚马逊测评,完善的自养号系统需要具备哪些要求

在亚马逊等跨境电商平台的严格审查下&#xff0c;许多卖家和买家都遭到了封号。这些封号事件对依赖线上销售的小型卖家造成了巨大的冲击。我们发现大部分账号被封的原因在于底层环境搭建不当。 无论是在亚马逊还是其他跨境电商平台&#xff0c;如ebay、速卖通、虾皮、Lazada等…

学习PyQt5

1、布局之后&#xff0c;无法移动对象到指定区域&#xff0c;无法改变对象大小。 原因&#xff1a;因为CtrlA选中了整个窗口&#xff0c;然后布局的时候就相当于整个窗口都按照这种布局&#xff0c;如选了水平布局&#xff0c;按钮一直在中间&#xff0c;无法拖到其它位置。 …

2024年【裂解(裂化)工艺】及裂解(裂化)工艺模拟考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 裂解&#xff08;裂化&#xff09;工艺是安全生产模拟考试一点通总题库中生成的一套裂解&#xff08;裂化&#xff09;工艺模拟考试题库&#xff0c;安全生产模拟考试一点通上裂解&#xff08;裂化&#xff09;工艺作…

Pandas.Series.product() 乘积(累乘积) 详解 含代码 含测试数据集 随Pandas版本持续更新

关于Pandas版本&#xff1a; 本文基于 pandas2.2.0 编写。 关于本文内容更新&#xff1a; 随着pandas的stable版本更迭&#xff0c;本文持续更新&#xff0c;不断完善补充。 传送门&#xff1a; Pandas API参考目录 传送门&#xff1a; Pandas 版本更新及新特性 传送门&…

dvwa靶场文件上传high

dvwa upload high 第一次尝试&#xff08;查看是否是前端验证&#xff09;第二次尝试我的上传思路最后发现是图片码上传修改配置文件尝试蚁&#x1f5e1;连接菜刀连接 第一次尝试&#xff08;查看是否是前端验证&#xff09; 因为我是初学者&#xff0c;所以无法从代码审计角度…

vue项目如何实现运行完项目就跳转到浏览器

在package.json中的启动命令中添加--open参数可以实现在Vue项目编译后自动打开浏览器的功能。 通过这样的设置&#xff0c;在运行npm run dev时&#xff0c;Vue项目编译完成后会自动打开默认浏览器并加载应用程序。

记签名机制

签名过程&#xff1a; 首先将数据源通过摘要算法获取到数字摘要 对数字摘要用私钥进行加密得到签名 将原始消息 以及签名发送给消息接收方 接收方用公钥解密得到数字摘要 用同样的摘要算法将原始消息进行计算 比较得到的数字摘要与解密后的是否一致 Android学习笔记——Androi…

在ubuntu上在安装Squid代理服务器

Squid 是一个代理和缓存服务器&#xff0c;它将请求转发到所需的目的地&#xff0c;同时保存请求的内容&#xff0c;当你再次请求相同内容时&#xff0c;他可以向你提供缓冲内容&#xff0c;从而提高访问速度。Squid代理服务器目前支持的协议有&#xff1a;http、SSL、DNS、FTP…

紫光展锐M6780丨超分辨率技术——画质重构还原经典

上一期&#xff0c;我们揭秘了让画质更加炫彩的AI-PQ技术。面对分辨率较低的老电影&#xff0c;光有高饱和度的色彩是不够的&#xff0c;如何能够提高视频影像的分辨率&#xff0c;使画质更加清晰&#xff0c;实现老片新看&#xff1f; 本期带大家揭晓紫光展锐首颗AI8K超高清智…

解决Android工程Gradle下载不动的问题

下不动原因&#xff1a;墙 解决方式去阿里云的镜像站下载对应的版本解压到gradle的安装目录 一般是这个 C:\Users\你的用户名\.gradle\wrapper\dists\ 比如我的 我要装7.2&#xff0c;那我就下载7.2 第一次android工程会自己创建好下载目录&#xff0c;我们把gradle-7.2-b…

【代码随想录-数组】长度最小的子数组

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

栈和队列的动态实现(C语言实现)

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ &#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1…

探索数据可视化:Python 库 Matplotlib

探索数据可视化&#xff1a;Python 库 Matplotlib 在数据科学和机器学习的领域中&#xff0c;数据可视化是一种强大的工具&#xff0c;它能够将复杂的数据转化为易于理解和解释的图形形式。在 Python 的丰富生态系统中&#xff0c;Matplotlib 库被认为是最流行和最强大的数据可…

蓝桥杯备赛 week 4 —— DP 背包问题

目录 &#x1f308;前言&#x1f308;&#xff1a; &#x1f4c1; 01背包问题 分析&#xff1a; dp数组求解&#xff1a; 优化&#xff1a;滚动数组&#xff1a; &#x1f4c1; 完全背包问题 &#x1f4c1; 总结 &#x1f308;前言&#x1f308;&#xff1a; 这篇文章主…

谷歌seo服务费一般是多少?

谷歌SEO服务费是根据多种因素变化的&#xff0c;包括所需的服务范围、项目的规模和复杂性、所在地区的市场竞争情况以及您选择的SEO服务提供商 seo不应该仅仅只是提供技术服务&#xff0c;根据不同的服务内容可以分为不同的收费方式&#xff0c;比如收取固定费用&#xff0c;但…

chroot: failed to run command ‘/bin/bash’: No such file or directory

1. 问题描述及原因分析 在busybox的环境下&#xff0c;执行 cd rootfs chroot .报错如下&#xff1a; chroot: failed to run command ‘/bin/bash’: No such file or directory根据报错应该rootfs文件系统中缺少/bin/bash&#xff0c;进入查看确实默认是sh&#xff0c;换成…

谷歌seo服务商如何选择?

选择谷歌SEO服务商时&#xff0c;要考虑他们的经验、专业知识、成功案例、透明度、合规性、定制能力、时间线、客户支持、沟通以及是否能够建立长期合作关系。综合评估这些因素&#xff0c;确保找到一个可信赖的合作伙伴&#xff0c;能够帮助您提升网站在谷歌搜索中的表现&…

ctfshow web75

开启环境: 先直接用伪协议获取 flag 位置 c?><?php $anew DirectoryIterator("glob:///*"); foreach($a as $f) {echo($f->__toString(). );} exit(0); ?> ctry {$dbh new PDO(mysql:hostlocalhost;dbnamectftraining, root, root);foreach($dbh-&g…

Jmeter实现造10个账户、单元数据

今天简单介绍Jemeter的入门,Jmeter 的安装这边就跳过,直接讲述如何使用JMETER,如何运用Jmeter进行测试。Jmeter实现造10个账户、单元数据,之后大数据量批量造数据以此类推。 1.下载jmeter软件 2.安装jmeter软件 3.运行\bin\jmeter.bat批处理文件 4.选择脚本文件 5.…