70.网游逆向分析与插件开发-角色数据的获取-自动化助手UI显示角色数据

news2024/11/16 22:45:40

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

上一个内容:利用技能点属性分析角色数据基址-CSDN博客

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

码云版本号:367aa71f60b9c10ff47ca913a96d2a2ede76b389

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

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

提取码:q9n5

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

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

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

提取码:78h8

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

以 优化自动助手与游戏焦点的切换-CSDN博客 它的代码为基础进行修改

然后给窗口添加一个编辑框,如下图

编辑框的属性

然后给输入框添加一个变量

然后名字与等级乱码,等级的话它不是int应该是char类型,名字不知道要再分析,名字中文的话是可以正常显示的

然后更改角色之后,自动化窗口不重新刷新

把自动化窗口关了重开才会好

后面修复名字与等级问题

AIM.h文件的修改,新加 SkillPoint变量,SkillPoint是技能点

#pragma once

typedef class AIM
{
public:
	char pad_0000[276]; //0x0000
	short Name[7]; //0x0114 角色名字长度是7
	char pad_0115[902]; //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
	int32_t LV; //0x08D0 等级
	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

CUI.cpp文件的修改,修改了 InstallPage函数、OnInitDialog函数

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

#include "pch.h"
#include "htdMfcDll.h"
#include "CUI.h"
#include "afxdialogex.h"


// CUI 对话框

IMPLEMENT_DYNAMIC(CUI, CDialogEx)

CUI::CUI(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_MAIN, pParent)
{

}

CUI::~CUI()
{
}

void CUI::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_TAB1, mTab);
}

BOOL CUI::OnInitDialog()
{
	CDialogEx::OnInitDialog();
	
	InstallPage(new CUIWnd_0(), IDD_PAGE_0, L"角色", TRUE);
	InstallPage(new CUIWnd_1(), IDD_PAGE_1, L"测试");

	SetBackgroundColor(0xFFFFFFFF);

	//PageINJ.Init(wAppPath);
	//PageRAN.SetAppPath(wAppPath);

	return TRUE;
}

bool CUI::InstallPage(CDialogEx* wnd, int IDD_WND, CString&& _Name, BOOL IsShow)
{

	if (CurPage >= MAX_PAGE_MAIN) return false;
	Pages[CurPage] = wnd;
	Pages[CurPage]->Create(IDD_WND, this);
	//Pages[CurPage]->SetParent(this);
	Pages[CurPage]->ShowWindow(IsShow);

	CRect rect;
	mTab.GetClientRect(&rect);
	rect.top += 46;
	rect.left = 0;
	rect.bottom -= 5;
	rect.right -= 5;
	Pages[CurPage]->MoveWindow(&rect);
	mTab.InsertItem(CurPage, _Name);

	CurPage++;
	return true;
}

BEGIN_MESSAGE_MAP(CUI, CDialogEx)
	ON_NOTIFY(TCN_SELCHANGE, IDC_TAB1, &CUI::OnTcnSelchangeTab1)
	ON_WM_CLOSE()
END_MESSAGE_MAP()


// CUI 消息处理程序


void CUI::OnTcnSelchangeTab1(NMHDR* pNMHDR, LRESULT* pResult)
{
	// TODO: 在此添加控件通知处理程序代码
	*pResult = 0;
	int n = mTab.GetCurSel();
	for (int i = 0; i < CurPage; i++)
	{
		Pages[i]->ShowWindow(i == n);
	}
}

void CUI::UIShow()
{
	auto hwndClient = ::FindWindow(L"CLIENT", L"SRO_CLIENT");
	::SetParent(this->m_hWnd, hwndClient);
	this->ShowWindow(ShowUI = !ShowUI);
	// 把焦点还给游戏
	::SetFocus(hwndClient);
}


void CUI::OnClose()
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	UIShow();
	// CDialogEx::OnClose();
}

GameBase.h文件的修改,新加 SRO_Player变量、AIM.h头文件

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

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

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(&Notice::_NormalNotice, 0x848580);
	InitClassProc(&Notice::_NetNotice, 0x844E40);
	InitClassProc(&Notice::_ChatNotice, 0x844E80);

}

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

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

CUIWnd_0.h文件的修改,新加 txt_Player变量、OnInitDialog函数、ShowPlayerTxt函数

#pragma once
#include "afxdialogex.h"

// CUIWnd_0 对话框

class CUIWnd_0 : public CDialogEx
{
	DECLARE_DYNAMIC(CUIWnd_0)

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

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

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

	DECLARE_MESSAGE_MAP()
public:
	// 玩家信息
	CString txt_Player;
	BOOL OnInitDialog();
	void ShowPlayerTxt();
};

CUIWnd_0.cpp文件的修改,新加 OnInitDialog函数、ShowPlayerTxt函数、TimeProc函数、GameBase.h头文件、extern_all.h头文件

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

#include "pch.h"
#include "htdMfcDll.h"
#include "CUIWnd_0.h"
#include "GameBase.h"
#include "extern_all.h"

// CUIWnd_0 对话框
CUIWnd_0* UI_0;
void _stdcall TimeProc(HWND, UINT, UINT_PTR, DWORD) {
	if (UI_0) {
		UI_0->ShowPlayerTxt();
	}
}

IMPLEMENT_DYNAMIC(CUIWnd_0, CDialogEx)

CUIWnd_0::CUIWnd_0(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_PAGE_0, pParent)
	, txt_Player(_T(""))
{
	UI_0 = this;
}

CUIWnd_0::~CUIWnd_0()
{
}

void CUIWnd_0::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Text(pDX, IDC_EDIT1, txt_Player);
}

BOOL CUIWnd_0::OnInitDialog()
{
	CDialogEx::OnInitDialog();
	::SetTimer(this->m_hWnd, 0x100001, 10, TimeProc);
	return TRUE;
}

void CUIWnd_0::ShowPlayerTxt()
{
	if ((_pgamebase) && (_pgamebase->SRO_Player)) {
		CString txtTmp;
		txtTmp.Format(L"角色名:[%s] 等级[lv:%d]\r\n", _pgamebase->SRO_Player->Name, _pgamebase->SRO_Player->LV);
		txt_Player = txtTmp;
		txtTmp.Format(L"经验值:[%d] 技能点[%d]\r\n", _pgamebase->SRO_Player->Exp, _pgamebase->SRO_Player->SkillPoint);
		txt_Player += txtTmp;
		txtTmp.Format(L"血量:[%d/%d]\r\n", _pgamebase->SRO_Player->HP, _pgamebase->SRO_Player->MaxHP);
		txt_Player += txtTmp;
		txtTmp.Format(L"蓝量:[%d/%d]\r\n", _pgamebase->SRO_Player->MP, _pgamebase->SRO_Player->MaxMP);
		txt_Player += txtTmp;
		txtTmp.Format(L"坐标:[%f][%f][%f]\r\n", _pgamebase->SRO_Player->x, _pgamebase->SRO_Player->h, _pgamebase->SRO_Player->y);
		txt_Player += txtTmp;
		// 计算百分比
		txtTmp.Format(L"怒气:[%f/100]\r\n", (float)_pgamebase->SRO_Player->Rage/5*100);
		txt_Player += txtTmp;
	}
	UpdateData(FALSE);
}


BEGIN_MESSAGE_MAP(CUIWnd_0, CDialogEx)
END_MESSAGE_MAP()


// CUIWnd_0 消息处理程序

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

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

相关文章

conda环境下No module named ‘pytorch_lightning‘问题解决

1 问题描述 在训练wav2lip模型时&#xff0c;出现如下错误&#xff1a; D:\.conda\wav2lip\python.exe D:/ml/wav2lip384/parallel_syncnet_tanh.py --data_root D:/ml/Wav2Lip/data/25fps_out/ --checkpoint_dir syncnet_checkpoints/ --checkpoint_path Traceback (most re…

怎样获取power shell 的全部可用命令?5/5(篇幅有点长,分成5份)

在power shell 窗口中&#xff0c;有一个获取全部可用命令的命令&#xff1a;get-command&#xff0c;获取到的命令有1640多个&#xff0c;够学习了吧&#xff1f;那么&#xff0c;power shell 命令有哪些类别呢&#xff1f; PowerShell命令可以分为以下几类&#xff1a; Cmd…

LeetCode 每日一题 Day 37-43

终于考完试了&#xff0c;寒假期间将会每天持续更新&#xff01; 447. 回旋镖的数量(Day 37) 给定平面上 n 对 互不相同 的点 points &#xff0c;其中 points[i] [xi, yi] 。回旋镖 是由点 (i, j, k) 表示的元组 &#xff0c;其中 i 和 j 之间的欧式距离和 i 和 k 之间的欧…

鸿蒙Harmony--状态管理器--@Provide装饰器和@Consume装饰器详解

今天是1月11日号星期四&#xff0c;农历腊月初一&#xff0c;辞旧的岁月里&#xff0c;愿你守得云开、终见月明&#xff0c;迎新的时光中&#xff0c;愿你心御寒冬、顺遂无忧&#xff0c;岁末冬深&#xff0c;希望接下来的日子里足够幸运&#xff0c;攒足勇气、信心和运气&…

基于Java SSM框架实现学生成绩管理系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现学生成绩管理系统演示 摘要 学生成绩是高校人才培养计划的重要组成部分&#xff0c;是实现人才培养目标、培养学生科研能力与创新思维、检验学生综合素质与实践能力的重要手段与综合性实践教学环节。而学生所在学院多采用半手工管理学生成绩的方式&#…

springboot整合websocket后启动报错:javax.websocket.server.ServerContainer not available

一、场景 Springboot使用ServerEndpoint来建立websocket链接。引入依赖。 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency>配置Websocket Confi…

浏览器中把HTML转为PDF的几种方式

浏览器中把HTML转为PDF的几种方式 打印 操作步骤 另存为pdf 优点 简便易用&#xff1a; 浏览器自带的打印功能通常是用户界面友好的&#xff0c;不需要额外的插件或工具&#xff0c;用户只需点击几下即可完成转换。 跨平台支持&#xff1a; 大多数现代浏览器都支持这种方…

Baumer工业相机堡盟工业相机如何联合NEOAPI SDK和OpenCV实现Mono12和Mono16位深度的图像保存(C++)

Baumer工业相机堡盟工业相机如何联合BGAPI SDK和OpenCVSharp实现Mono12和Mono16位深度的图像保存&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机保存位深度12/16位图像的技术背景代码案例分享1&#xff1a;引用合适的类文件2&#xff1a;NEOAPI SDK联合OpenCV进行图…

Asynchronous FIFO and synchronous FIFO-翻译自外网

Synchronous FIFO 先进先出 (FIFO) 是一种非常流行且有用的设计块&#xff0c;用于模块之间的同步和握手机制。 FIFO 的深度&#xff1a; FIFO 中的槽数或行数称为 FIFO 的深度。 FIFO 的宽度&#xff1a;每个槽或行中可以存储的位数称为 FIFO 的宽度。 在同步 FIFO 中&…

大屏项目:react中实现3d效果的环形图包括指引线

参考链接3d环形图 3d效果的环形图 项目需求实现方式指引线&#xff08;线的样式字体颜色&#xff09; 项目需求 需要在大屏上实现一个3d的环形图&#xff0c;并且自带指引线&#xff0c;指引线的颜色和每段数据的颜色一样&#xff0c;文本内容变成白色&#xff0c;数字内容变…

投标文件组成分析

标注组成&#xff1a; 标书内容&#xff1a; 一、前面内容 1、投标首页&#xff08;正本/副本&#xff09;/ 2、评分索引表&#xff08;来源于“招标文件的评分细则表”&#xff0c;一般在原有的“评分细则表”的后面添加一列“所在页码”&#xff0c;里面填写得分对应“页…

CentOS stream 9最小化安装说明

Server with GUI&#xff1a;An integrated , easy-to-manage server with a graphical interface. 带有图形用户界面的服务器&#xff1a;集成、易于管理的服务器&#xff0c;带有图形界面。Server&#xff1a;An integrated , easy-to-manage server. 服务器&#xff1a;集成…

服务器 conda update 失败解决方法

1. 强制 conda update 租借一台服务器&#xff0c;发现 conda 版本是4.10.3&#xff0c;需要升级&#xff0c;使用了如下命令都没有效果&#xff0c;仍然是一样的版本 conda update conda update --all conda update -n base -c defaults conda最后强制用conda-forge通道更新…

工作再忙,这个门禁管理小技巧也要学!

在现代社会&#xff0c;随着城市化和科技的迅猛发展&#xff0c;安全管理已经成为社会的一项首要任务。在这个背景下&#xff0c;门禁监控系统作为一种高效、先进的安全管理工具&#xff0c;逐渐成为各类场所、机构和企业的不可或缺的一部分。 客户案例 医疗机构 湖南某大型医…

2.IHRM人力资源 - 登录

一、登录页结构与表单开发 我们要实现的登录界面 目前的登录界面 1.1 登录页结构 复制下面的代码到views/login/index.vue页面下 <template><div class"login-container"><div class"logo"/><div class"form"><h1&…

【计算机二级考试C语言】C常量

C 常量 常量是固定值&#xff0c;在程序执行期间不会改变。这些固定的值&#xff0c;又叫做字面量。 常量可以是任何的基本数据类型&#xff0c;比如整数常量、浮点常量、字符常量&#xff0c;或字符串字面值&#xff0c;也有枚举常量。 常量就像是常规的变量&#xff0c;只…

反序列化提升刷题

例题&#xff1a; <?php //flag is in flag.php highlight_file(__FILE__); error_reporting(0); class Modifier { private $var; public function append($value) { include($value); echo $flag; } public function __invoke(){ …

Vue中keep-alive缓存的详解(深度理解)

文章目录 一、Keep-alive 是什么二、使用场景三、原理分析四、思考题&#xff1a;缓存后如何获取数据beforeRouteEnteractived 参考文献 一、Keep-alive 是什么 keep-alive是vue中的内置组件&#xff0c;能在组件切换过程中将状态保留在内存中&#xff0c;防止重复渲染DOM ke…

吉祥物如何解锁虚拟主持人身份,赋能品牌营销?

在互联网突破时空的整体语境下&#xff0c;一个吉祥物可以解锁虚拟主持人身份&#xff0c;结合动作捕捉技术&#xff0c;活跃于品牌线上线下营销活动场景&#xff0c;让吉祥物虚拟主持人凭借其“萌”、的特征&#xff0c;带给用户亲近感&#xff0c;快速拉近品牌与用户的距离&a…

对Transformer的理解。

要理解Transformer&#xff0c;需要先理解注意力机制&#xff0c;下面大部分内容来自台大教授李宏毅老师讲课资料。 注意力机制 之前使用的MLP&#xff0c;CNN&#xff0c;RNN模型可以解决一些简单序列问题&#xff0c;但当序列长度太长容易失去效果&#xff0c;原因是看了新…