26.第二阶段x86游戏实战2-C++遍历背包物品

news2024/10/11 21:33:25

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!

本次游戏没法给

内容参考于:微尘网络安全

本人写的内容纯属胡编乱造,全都是合成造假,仅仅只是为了娱乐,请不要盲目相信。

工具下载:

链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd=6tw3

提取码:6tw3

复制这段内容后打开百度网盘手机App,操作更方便哦

上一个内容:25.第二阶段x86游戏实战2-背包属性补充

到这就找到了背包大小、物品名字、物品数量,然后本次就把这些东西全部都使用C++遍历出来

游戏更新了现在的偏移是0x59F490,公式还是原本的公式

[[0x15*4+[[0x83F458]+0x181C4]]+0x14]+0x58是数量

[[0x54+[[0xEDF490]+0x181C4]]+0x2C]+0x54是物品等级

[[0x54+[[0xEDF490]+0x181C4]]+0x2C]+0x20是物品使用等级

[[0x54+[[0xEDF490]+0x181C4]]+0x2C]+0x18是物品名字

效果图

新加按钮

结构.h文件的修改

#pragma once
#include <string>
using namespace std;
struct R_人物属性
{
	DWORD 状态;

	void 初始化();
};

struct R_背包属性 {
	DWORD dwObject;
	string pName;
	BYTE p数量;
	string 简介;
	DWORD p使用等级;
};

struct R_背包类
{
	BYTE 背包数量 = 0;
};

struct R_遍历背包 {
	R_背包类 背包[0x3];
	R_背包属性 列表[0x100];
	DWORD d数量 = 0;
	void 遍历背包();
};

struct 坐标 {
	FLOAT x;
	FLOAT y;
};


结构.cpp文件的修改:新加 遍历背包函数

#include "pch.h"
#include "结构.h"

void R_人物属性::初始化()
{
	__try {
		/**
			GetModuleHandleA("Game.exe")返回Game.exe模块的模块基址
		*/
		DWORD 状态基址 = (DWORD)GetModuleHandleA("Game.exe") + 0x59EF6C;
		/**
			(DWORD*)状态基址 的意思是把 状态基址 的值当成内存地址
			*(DWORD*)状态基址 意思把内存地址里的值取出来
		*/
		DWORD 状态偏移 = *(DWORD*)状态基址 + 0x60;
		DWORD 状态偏移1 = *(DWORD*)状态偏移 + 0x14C;
		状态 = *(DWORD*)状态偏移1;
	}
	__except (1) {
		Call_输出调式信息("读物人物信息异常\r\n");
	}
}

void R_遍历背包::遍历背包()
{
	try {
		DWORD s = 0;
		//DWORD JZ = (DWORD)GetModuleHandleA("Game.exe") + 0x59F458;
		DWORD JZ = (DWORD)GetModuleHandleA("Game.exe") + 0x59F490;
		DWORD JZpy = ReadDword(ReadDword(JZ) + 0x181C4);
		背包[0].背包数量 = ReadDword(ReadDword(JZ) + 0x181C4 + 0x14); // 道具背包数量
		背包[1].背包数量 = ReadDword(ReadDword(JZ) + 0x181C4 + 0x15); // 材料背包数量
		背包[2].背包数量 = ReadDword(ReadDword(JZ) + 0x181C4 + 0x16);// 任务背包数量
		for (int i = 0; i < 3; i++)
		{
			CString str;
			str.Format(L"数量2:%d %d %d", 背包[0].背包数量, 背包[1].背包数量, 背包[2].背包数量);
			//AfxMessageBox(str);
			for (int  j = 0; j < 背包[i].背包数量; j++)
			{
				if (i == 0) {
					s = j;
				}
				if (i == 1)
					s = j + 背包[0].背包数量;
				if (i == 2)
					s = j + 背包[0].背包数量 + 背包[1].背包数量;
				列表[s].dwObject = ReadDword(JZpy + j * 4);
				if (列表[s].dwObject != 0) {
					DWORD 值 = ReadDword(列表[s].dwObject + 0x2C);
					列表[s].pName = ReadStr((char*)ReadDword(值 + 0x18));
					列表[s].p使用等级 = ReadDword(值 + 0x20);
					列表[s].简介 = ReadStr((char*)ReadDword(值 + 0x1c));;
					列表[s].p数量 = (BYTE)ReadByte(ReadDword(列表[s].dwObject + 0x14) + 0x58);
				}
				else
				{

					列表[s].pName = "";
					列表[s].p数量 = 0;
					列表[s].简介 = "";
					列表[s].p使用等级 = 0;
				}

				d数量++;

			}
			JZpy = JZpy + 0x80;// 扩展背包大小,写死0x80,扩展背包大小0x80/0x47=十进制的32
		}
	}
	catch (...)
	{
		Call_输出调式信息("天龙怀旧   返回背包信息异常\r\n");
	}

}

CM.cpp文件的修改:新加 OnBnClickedButton3函数(遍历背包按钮的点击事件处理函数)

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

#include "pch.h"
#include "tl.h"
#include "CM.h"
#include "afxdialogex.h"


// CM 对话框

IMPLEMENT_DYNAMIC(CM, CDialogEx)

CM::CM(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_DIALOG1, pParent)
	, edi_x(_T(""))
{

}

CM::~CM()
{
}

void CM::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Text(pDX, IDC_EDIT1, edi_x);
	DDX_Text(pDX, IDC_EDIT2, edi_y);
}


BEGIN_MESSAGE_MAP(CM, CDialogEx)
	ON_BN_CLICKED(IDC_BUTTON1, &CM::OnBnClickedButton1)
	ON_BN_CLICKED(IDC_BUTTON2, &CM::OnBnClickedButton2)
	ON_BN_CLICKED(IDC_BUTTON3, &CM::OnBnClickedButton3)
END_MESSAGE_MAP()


// CM 消息处理程序


void CM::OnBnClickedButton1()
{
	R_人物属性 a;
	a.初始化();
	Call_输出调式信息("人物信息:人物状态%d",a.状态);
}


void CM::OnBnClickedButton2()
{
	UpdateData(TRUE);
	CString str1 = edi_x;
	CString str2 = edi_y;
	// strtol((const char*)CW2A(str1.GetBuffer(0)), NULL, 10);把字符串转成int数字类型
	int x = strtol((const char*)CW2A(str1.GetBuffer(0)), NULL, 10);
	int y = strtol((const char*)CW2A(str2.GetBuffer(0)), NULL, 10);
	Call_xunlu(x, y);
}


void CM::OnBnClickedButton3()
{
	R_遍历背包 a;
	a.遍历背包();// 遍历背包
	CString str;
	str.Format(L"a数量 %d", a.d数量);
	AfxMessageBox(str);

	for (int i = 0; i < a.d数量; i++)
	{
		Call_输出调式信息("tl怀旧   背包信息 dwObject -------------%X----------------\r\n", a.列表[i].dwObject);
		Call_输出调式信息("tl怀旧   背包信息 名字:%s\r\n", a.列表[i].pName.c_str());
		Call_输出调式信息("tl怀旧   背包信息 使用等级:%d\r\n", a.列表[i].p使用等级);
		Call_输出调式信息("tl怀旧   背包信息 简介:%s\r\n", a.列表[i].简介.c_str());
		Call_输出调式信息("tl怀旧   背包信息 数量:%d\r\n", a.列表[i].p数量);


	}

}

上方的代码不全,只有手写的代码

完整代码:

链接:https://pan.baidu.com/s/1W-JpUcGOWbSJmMdmtMzYZg?pwd=q9n5

提取码:q9n5

复制这段内容后打开百度网盘手机App,操作更方便哦


img

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

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

相关文章

如何创建一个node.js项目并配置

要想创建一个node.js项目&#xff0c;首先的话要先有npm和node.js环境&#xff0c;没有的同学可以参考一下连接&#xff1a;npm安装-详细教程-CSDN博客 一、创建node.js项目文件 注意&#xff1a;windows系统创建时文件名不能有汉字和空格 我创建了一个文件夹叫nodejswork 二…

离线使用k8s部署项目

docker的安装与完全卸载&#xff08;亲测可用&#xff09; docker的安装与完全卸载 然后配置镜像加速器 vi /etc/docker/daemon.json 将找到的镜像仓库地址写入 具体内容可以参考此网站时刻更新镜像源仓库 然后保存退出 执行 systemctl daemon-reloadsystemctl restart…

第J3周:DenseNet算法实战与解析

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 文章目录 一、前期工作二、模型复现1、设置GPU2、导入数据3、加载数据4. 配置数据集5. 可视化数据6、构建DenseNet121网络7、编译8、训练模型9、模型评估 三、…

H3C IPsec over GRE VPN 实验

H3C IPsec over GRE VPN 实验 实验拓扑 ​​ 实验需求 按照图示配置 IP 地址,R1 和 R3 配置 Loopback0 口模拟业务网段R1 和 R3 上配置默认路由连通公网R1 和 R3 上配置 IPsec over GRE VPN 来连通两端内网R1 和 R3 配置 OSPF 来传递内网路由实验步骤 按照图示配置 IP 地址…

b站视频下载, b站视频下载助手 如何下载哔哩哔哩视频

1. 链接&#xff1a; 哔哩哔哩(bilibili)视频解析下载 - 保存B站视频到手机、电脑 2. 下载即可

多线程——线程安全

目录 前言 一、观察线程不安全 二、线程安全概念 三、产生线程安全问题的原因 1.分析示例代码 2.线程随机调度 3.修改共享数据 4.原子性 5.可见性 6.指令重排序 四、解决示例代码的问题 结尾 前言 我们学习多线程编程的目的是为了能够实现“并发编程”&#xff0c;…

WAFER连接器在现代电子领域的多样化应用

WAFER连接器是一种广泛应用于现代电子设备中的连接组件&#xff0c;其设计和功能使其在多种应用场景中表现出色。作为一种高效、可靠的连接解决方案&#xff0c;WAFER连接器凭借其小巧、精密的设计赢得了工程师和设计师的青睐。这篇文章将探讨WAFER连接器在不同行业和应用领域中…

力扣第1题:两数之和(图解版)

Golang版本 func twoSum(nums []int, target int) []int {m : make(map[int]int)for i : range nums {if _, ok : m[target - nums[i]]; ok {return []int{i, m[target - nums[i]]}} m[nums[i]] i}return nil }

pip install ERROR: Could not install packages due to an OSError

问题解决 pip install xxx报错&#xff1a; WARNING: Retrying (Retry(total4, connectNone, readNone, redirectNone, statusNone)) ERROR: Could not install packages due to an OSError 使用 pip install xxx --user 安装

游离的 HEAD 如何解决

简介 问题描述&#xff1a;使用 IDEA 在提交代码时&#xff0c;禁止提交 如何解决&#xff1a;迁出分支再提交&#xff0c;最后合并到 main 或 master 上 如何解决

面向抽象和面向接口的区别

‌1.概念 01、抽象类 在 Java 中&#xff0c;通过关键字 abstract 定义的类叫做抽象类。Java 是一门面向对象的语言&#xff0c;因此所有的对象都是通过类来描述的&#xff1b;但反过来&#xff0c;并不是所有的类都是用来描述对象的&#xff0c;抽象类就是其中的一种。 以下示…

接口测试常用工具及测试方法

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 接口一般来说有两种&#xff0c;一种是程序内部的接口&#xff0c;一种是系统对外的接口。 系统对外的接口&#xff1a;比如你要从别的网站或服务器上获取资源或信…

vue基础语法的用法(API组合式风格)

一、项目文件结构 .vscode我们在那个编辑器中编辑时就会有对应的这个文件夹&#xff0c;不是固定的 进行编写代码前先把资源自带的页面删除&#xff0c;以防误导&#xff0c;可以像我一样的删除内容 vue文件结构 二、你好 vue el插值 script代码 v-text插值 script代码 三、…

A2P云短信应用场景

中国联通国际公司产品之 A2P 云短信 在当今这个全球化的商业环境中&#xff0c;企业要想在激烈的市场竞争中脱颖而出&#xff0c;不仅需要提供优质的产品和服务&#xff0c;还需要建立起与客户之间的紧密沟通桥梁。中国联通国际公司凭借其强大的国际通信能力和丰富的行业经验&…

麒麟信安参编《信息技术应用创新 移动智能终端操作系统测试规范》

9月20日&#xff0c;广州信创协会团体标准编制培训会暨参编证书颁发仪式在北京举行。会上颁发了T/GZXC 003-2024《信息技术应用创新 移动智能终端操作系统测试规范》团体标准参编证书。麒麟信安作为重点参编单位之一&#xff0c;凭借在移动智能终端操作系统测试领域的丰富实践经…

Python微震波频散相速分析

&#x1f3af;要点 在二维均匀介质均匀源中合成互相关函数以便构建波层析成像。闭环系统中微积分计算情景&#xff1a;完美弹性体震波、随机外力对模式的能量分配。开环系统中微积分计算情景&#xff1a;无数震源激发波方程、闭合曲线上的随机源、不相关平面波事件。整理地震波…

鸿蒙NEXT开发-面试题库(最新)

注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得博主文章写的好的话&#xff0c;可以点下关注&#xff0c;博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…

LUCEDA IPKISS Tutorial 77:在版图一定范围内填充dummy

案例分享&#xff1a;在给定的Shape内填充dummy 所有代码如下&#xff1a; from si_fab import all as pdk from ipkiss3 import all as i3 from shapely.geometry import Polygon, MultiPolygon import numpy as np import matplotlib.pyplot as pltclass CellFilledWithCon…

【AI换脸】Rope一键整合包,实现视频多人实时换脸

随着人工智能技术的发展&#xff0c;人们越来越注重人机交互的趣味性和实用性。AI换脸技术正是在这种背景下兴起的一种创新应用。Rope换脸工具以其易用性和卓越的效果&#xff0c;成为了众多用户和专业人士青睐的对象。 Rope是什么&#xff1f; Rope是一款开源的deepfake软件&…