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

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

本次游戏没法给

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

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

工具下载:

链接: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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值