78.网游逆向分析与插件开发-背包的获取-背包类的C++还原与获取物品名称

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

上一个内容:77.网游逆向分析与插件开发-背包的获取-物品类的C++还原-CSDN博客

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

码云版本号:a235362f248f4d865056675b60500382b6747f53

代码下载地址,在 SRO_EX 目录下,文件名为:SRO_Ex-背包类的C++还原与获取物品名称.zip

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

提取码:q9n5

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

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

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

提取码:78h8

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

以 修复角色名与等级显示问题-CSDN博客它的代码为基础进行修改

需要使用x96dbg逆向一下,来到0x787022位置(这个位置是在 背包结构与指针的逆向分析 这里分析出来的),从下图中的函数里看出,基本都是围绕这个3几几,所以结构体大小搞成0x400就行

然后打开 ReClass.NET,设置大小0x400,十进制是1024

然后得到背包结构地址:

涉及到的内容:

背包结构:背包结构与指针的逆向分析,x96dbg索引地址 0x787022

物品名:物品名称与物品编号的映射关系分析,x96dbg索引地址 0x739915

Res.cpp文件的修改,新加 ReadItemTitle函数、_ReadItemTitle变量初始化

#include "pch.h"
#include "Res.h"
// 这里为了给 _ReadTitle 默认值,防止编译不通过
Res::PROC_LP Res::_ReadTitle{};
Res::PROC_LP Res::_ReadItemTitle{};
PSROSTRING Res::ReadTitle(wchar_t* index)
{/**获取按钮文字通过逆向分析,看出是一个thiscall在调用获取文字函数时给ecx赋值了,这是典型的thiscall方式下方(this->*_ReadTitle)(index)写法翻译成汇编就会是mov ecx,thismov eax, [ecx+xxx];push indexcall eax大概就会变成上方四行代码,也就是一个thiscall如果穿插汇编代码,会很lou,这样用c++写就很优雅*/return (this->*_ReadTitle)(index);
}PSROSTRING Res::ReadItemTitle(LPVOID ptr)
{return (this->*_ReadItemTitle)(ptr);
}

Res.h文件的修改,新加 ReadItemTitle函数、_ReadItemTitle函数指针类型变量声明、PROC_LP函数指针,删除了 PROC_WCHAR1函数指针

#pragma once
#include "SRO_String.h"
// sro_string通过逆向分析,文字获取方式得到的一个结构体
typedef class Res
{// 定义一个函数指针typedef PSROSTRING(Res::* PROC_LP)(LPVOID);
public:// 给函数指针声明一个变量static PROC_LP _ReadTitle;static PROC_LP _ReadItemTitle;// 封装 _ReadTitle 使用时比较好用PSROSTRING ReadTitle(wchar_t* index);// 可以获取物品名PSROSTRING ReadItemTitle(LPVOID ptr);}*PRes;

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(&Res::_ReadTitle, 0x9A4640);InitClassProc(&Res::_ReadTitle, 0x9A4640);InitClassProc(&Notice::_NormalNotice, 0x848580);InitClassProc(&Notice::_NetNotice, 0x844E40);InitClassProc(&Notice::_ChatNotice, 0x844E80);InitClassProc(&ITEM::_GetItemRes, 0x995800);}void GameBase::InitClassProc(LPVOID proc_addr, unsigned value)
{unsigned* uWrite = (unsigned*)proc_addr;uWrite[0] = value;
}GameBase::GameBase()
{_pgamebase = this;// Init();// 初始化机制,完成游戏与我们dll的对接
}

GameBase.h文件的修改,新加引入 ITEM.h 头文件

#pragma once
#include "Res.h"
#include "Notice.h"
#include "AIM.h"
#include "ITEM.h"class GameBase
{void InitClassProc(LPVOID proc_addr, unsigned value);
public:void Init();GameBase();PRes SRO_Res;PNotice SRO_Notice;PAIM SRO_Player;
};

新加 BackPack.cpp文件,背包结构

#include "pch.h"
#include "BackPack.h"int BackPack::PackCount()
{int allsize = (DWORD)ItemEnd - (DWORD)ItemStart;if (allsize<0) return 0;return allsize >> 2;
}PITEM BackPack::GetItem(int index)
{if (index < PackCount()) {PITEM pitem = ItemStart[index];return pitem;}return NULL;
}

新加BackPack.h文件,背包结构

#pragma once
#include "ITEM.h"typedef class BackPack // 背包
{
protected:char pad_0000[928]; //0x0000
public:PITEM* ItemStart; //0x03A0 物品起始地址PITEM* ItemEnd; //0x03A4 物品结束地址
protected:char pad_03A8[88]; //0x03A8
public:int PackCount();PITEM GetItem(int index);
}*PBackPack; //Size: 0x0400

新加ITEM.cpp文件

#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()
{return _pgamebase->SRO_Res->ReadItemTitle(GetItemRes());
}

ITEM.h文件的修改,新加 GetItemRes函数、GetName函数、PROC函数指针,_GetItemRes函数指针类型变量声明

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

经典面试题-死锁

目录 1.什么是死锁&#xff1f; 2.形成死锁的四个必要条件 3.死锁的三种情况 第一种情况&#xff1a; 举例&#xff1a; 举例&#xff1a; 第二种情况&#xff1a;两个线程 两把锁 举例&#xff1a; 第三种情况&#xff1a;N个线程 M把锁 哲学家进餐问题 1.什么是死锁&…

Nvidia DPU BlueField 软件概述_AI_卸载_降本增效_DPU时代_内核表示模型

Nvidia_BF_DPU简介 随着摩尔定律的减弱&#xff0c;加速计算和人工智能是较经济实惠的方式实现数据中心能源效率所需的工具。 让我们一起跟随和了解 NVIDIA Grace CPU、NVIDIA L4 GPU 和 NVIDIA BlueField DPU 如何推动数据中心迈向更高效的未来。 NVIDIA BlueField DPU 软件…

【GitHub项目推荐--Spring 教程】【转载】

该项目是一系列小型且直击要害的教程&#xff1a;每个教程都涵盖了 Java 生态系统中一个单一且定义明确的开发领域。 其中一个重点是 Spring Framework - Spring、Spring Boot 和 Spring Security。除了 Spring 之外&#xff0c;这里的模块还涵盖了 Java 的许多方面。 开源地址…

VS2022联合Qt5开发学习9(QT5.12.3鼠标按下、释放、移动事件以及Qt上取标注点)

在研究医学图像可视化的时候&#xff0c;鼠标响应这里一直都有问题。研究了几天VTK的取点&#xff0c;还是会和Qt冲突。所以现在试试Qt的方式取点&#xff0c;看看能不能实现我的功能。 查了很多资料&#xff0c;这篇博文里的实例有部分参考了祥知道-CSDN博客这位博主的博客[Q…

基于Matlab计算栅格数据Hurst指数和未来趋势

​各位同学们好&#xff0c;今天分享的基于Matlab计算栅格数据Hurst指数和未来趋势。如果您需要下载或处理遥感数据等方面的帮助&#xff0c;私信或评论。 一、Hurst指数 Hurst指数是一种用于描述未来短时间内变化趋势可持续性的指标&#xff0c;可以在分析年际变化特征方面提…

《文苑》文学艺术文化期刊投稿邮箱投稿方式

《文苑》杂志是国家新闻出版总署批准的正规期刊&#xff0c;本刊致力于中华优秀传统文化、文化旅游、文学艺术、哲学社会科学等方面的理论和实践研究&#xff0c;集理论性、艺术性、指导性于一体&#xff0c;是广大文化、哲学、社会科学工作者交流科研成果、传递学术思想的重要…

Python Tornado 实现SSE服务端主动推送方案

一、SSE 服务端消息推送 SSE 是 Server-Sent Events 的简称&#xff0c; 是一种服务器端到客户端(浏览器)的单项消息推送。对应的浏览器端实现 Event Source 接口被制定为HTML5 的一部分。相比于 WebSocket&#xff0c;服务器端和客户端工作量都要小很多、简单很多&#xff0c…

【网络安全 -> 防御与保护】专栏文章索引

为了方便 快速定位 和 便于文章间的相互引用等 作为一个快速准确的导航工具 网络安全——防御与保护 &#xff08;一&#xff09;.信息安全概述

VSCode插件 —— Cody AI (免费AI助手!)

之前介绍过一款 阿里云免费的AI开发工具——通义灵码 TONGYI Lingma 本文再推荐一个可以极大提高开发前端开发效率的工具 —— Cody AI &#xff08;Sourcegraph&#xff09;&#xff0c;同样是免费的&#xff01; 不过&#xff0c;使用Cody AI需要有github 或 Google 、 git…

xshell配置隧道转移规则

钢铁知识库&#xff0c;一个学习python爬虫、数据分析的知识库。人生苦短&#xff0c;快用python。 xshell是什么 通俗点说就是一款强大ssh远程软件&#xff0c;可以方便运维人员对服务器进行管理操作&#xff0c;功能很多朋友们自行探索&#xff0c;今天只聊其中一个功能点那…

CentOs7 安装Mysql(5.7和8.0版本)密码修改跳过 超详细教程

CSDN 成就一亿技术人&#xff01; 今天出一期Centos下安装Mysql&#xff08;详细教程&#xff09;包括数据库密码跳过修改 CSDN 成就一亿技术人&#xff01; 目录 1.获取安装包 2.安装程序 安装下载的rpm包 查看安装包 修改5.7版本&#xff08;重要&#xff09; 安装M…

Vue3+ElementUI 多选框中复选框和名字点击方法效果分离

现在的需求为 比如我点击了Option A &#xff0c;触发点击Option A的方法&#xff0c;并且复选框不会取消勾选&#xff0c;分离的方法。 <el-checkbox-group v-model"mapWork.model_checkArray.value"> <div class"naipTypeDom" v-for"item …