79.网游逆向分析与插件开发-背包的获取-升级Notice类获得背包基址

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

上一个内容:背包类的C++还原与获取物品名称-CSDN博客

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

码云版本号:1bd96faade33f3fc48cfbbc47cf567dd9a5e858d

代码下载地址,在 SRO_EX 目录下,文件名为:SRO_Ex-升级Notice类获得背包基址.zip

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

提取码:q9n5

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

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

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

提取码:78h8

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

以 背包类的C++还原与获取物品名称 它的代码为基础进行修改

当时设计Notice类时是在找公告的时候,所以以为它只能发公告,经过背包与物品的分析发现并不是只有公共,它还能获取背包等。

通过 背包地址的逆向分析 它里面写的分析,可以发现它通过0x1256E3C对象调用它的成员函数0x866140,它没有参数,然后根据0x866140返回值调用了0x7722C0函数,0x866140函数的返回值是一个对象,也就是0x7722C0函数是它的成员函数,然后0x7722C0函数就会返回我们的背包基址

通过获取背包大小来测试是否正常:结果是正常

修改类名或变量名:通过下图红框的重命名来修改的,它可以把使用到的位置全部修改掉,使用很简单,点击之后会弹框,然后输入新名字,然后点预览,如果预览看着没问题,然后再点应用,就修改类名或变量名成功了,但是这个不能修改文件名,所以文件名修改之后每个#include它的位置都要手动修改,可以通过重新编译项目出错来定位哪里#include了

79.网游逆向分析与插件开发-背包的获取-升级Notice类获得背包基址_第1张图片

新加测试按钮:

79.网游逆向分析与插件开发-背包的获取-升级Notice类获得背包基址_第2张图片

CUIWnd_1.cpp文件的修改,它是MFC的界面,在界面中新加了一个按钮,CUIWnd_1.cpp文件的修改就是新加的按钮的点击事件(OnBnClickedButton1函数)

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

#include "pch.h"
#include "htdMfcDll.h"
#include "CUIWnd_1.h"
#include "afxdialogex.h"
#include "extern_all.h"


// CUIWnd_1 对话框

IMPLEMENT_DYNAMIC(CUIWnd_1, CDialogEx)

CUIWnd_1::CUIWnd_1(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_PAGE_1, pParent)
{

}

CUIWnd_1::~CUIWnd_1()
{
}

void CUIWnd_1::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}


BEGIN_MESSAGE_MAP(CUIWnd_1, CDialogEx)
	ON_BN_CLICKED(IDC_BUTTON1, &CUIWnd_1::OnBnClickedButton1)
END_MESSAGE_MAP()


// CUIWnd_1 消息处理程序


void CUIWnd_1::OnBnClickedButton1()
{
	int count = _pgamebase->SRO_Control->GetPPack()->GetPackBack()->PackCount();
	CString tmp;
	tmp.Format(L"%d", count);
	AfxMessageBox(tmp);
}

Control.cpp文件的修改,它原本是 Notice.cpp,新加 GetPPack函数、_GetPPack变量初始化

#include "pch.h"
#include "Control.h"

Control::PROC Control::_GetPPack{};
Control::PROC_PSROSTR Control::_NormalNotice{};
Control::PROC_PSROSTR Control::_NetNotice{};
Control::PROC_D_PWSTR_D_D Control::_ChatNotice{};

void Control::NormalNotice(PSROSTRING _txt)
{
	(this->*_NormalNotice)(_txt);
}

void Control::NetNotice(PSROSTRING _txt)
{
	(this->*_NetNotice)(_txt);
}

/**
	type1 默认0x3
	type2 默认0x1
*/
void Control::ChatNotice(wchar_t* _txt, int color, int type1, int type2)
{
	(this->*_ChatNotice)(type1, _txt, color, type2);
}

PPack Control::GetPPack()
{
	return (this->*_GetPPack)();
}

Control.h文件的修改,它原本是 Notice.h文件,新加 _GetPPack函数指针变量,GetPPack函数,PROC函数指针

#pragma once
#include "SRO_String.h"
#include "Pack.h"
typedef class Control
{
	typedef PPack (Control::* PROC)();
	typedef void (Control::* PROC_PSROSTR)(PSROSTRING);
	typedef void (Control::* PROC_D_PWSTR_D_D)(int, wchar_t*, int, int);
public:
	static PROC _GetPPack;
	static PROC_PSROSTR _NormalNotice;
	static PROC_PSROSTR _NetNotice;
	static PROC_D_PWSTR_D_D _ChatNotice;
public:
	void NormalNotice(PSROSTRING _txt);
	void NetNotice(PSROSTRING _txt);
	void ChatNotice(wchar_t* _txt, int color=0xFFFFAEC3, int type1=0x3, int type2=0x1);
	PPack GetPPack();
}*PControl;

GameBase.cpp文件的修改,修改了 Init函数

#include "pch.h"
#include "GameBase.h"

GameBase* _pgamebase;

void GameBase::Init()
{
	unsigned* addrRead = (unsigned*)0x1256E3C;

	SRO_Res = (PRes)0x1036518;
	SRO_Control = (PControl)addrRead[0];
	addrRead = (unsigned*)0x1037D3C;
	SRO_Player = (PAIM)addrRead[0];
	
	InitClassProc(&Res::_ReadTitle, 0x9A46C0);
	InitClassProc(&Res::_ReadItemTitle, 0x9A4640);
	InitClassProc(&Control::_NormalNotice, 0x848580);
	InitClassProc(&Control::_NetNotice, 0x844E40);
	InitClassProc(&Control::_ChatNotice, 0x844E80);
	InitClassProc(&Control::_GetPPack, 0x866140);
	InitClassProc(&ITEM::_GetItemRes, 0x995800);
	InitClassProc(&Pack::_GetPackPack, 0x7722C0);

}

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

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

GameBase.h文件的修改,原引入 Notice.h修改为Control.h

#pragma once
#include "Res.h"
#include "Control.h"
#include "AIM.h"
#include "ITEM.h"

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

你可能感兴趣的:(网游逆向,游戏,c++)