免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!
本次游戏没法给
内容参考于:微尘网络安全
本人写的内容纯属胡编乱造,全都是合成造假,仅仅只是为了娱乐,请不要盲目相信。
工具下载:
链接: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,操作更方便哦