100.网游逆向分析与插件开发-网络通信封包解析-C++还原网络通信系统发送功能

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

上一个内容:数据包组织与发送过程逆向分析

码云地址(游戏窗口化助手 分支):https://gitee.com/dye_your_fingers/sro_-ex.git

码云版本号:ec54e9ae1ca0efe96b87d5dca1a2d0f873cba474

代码下载地址,在 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的分享

以 窗口化助手与游戏窗口同步移动 它的代码为基础进行修改

完成了C++与游戏网络通信的函数对接

extern_all.cpp文件的修改:

#pragma once
#include "GameBase.h"
#include "CUI.h"
#include "CHelperUI.h"

extern CHelperUI* _ui_helper;
extern CUI* _ui;
extern GameBase* _pgamebase;
extern void InitClassProc(LPVOID proc_addr, unsigned value);
extern void InitClassProc(LPVOID proc_addr, unsigned* vtable, unsigned index);

新加extern_all.cpp文件:

#include "pch.h"
#include "extern_all.h"

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

void InitClassProc(LPVOID proc_addr, unsigned* vtable, unsigned index) {
	unsigned* addr = (unsigned*)vtable[0];
	InitClassProc(proc_addr, addr[index]);
}

GameBase.h文件的修改:删除了InitClassProc函数

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

class GameBase
{
public:
	void Init();
	GameBase();
	PRes SRO_Res;
	PControl SRO_Control;
	PAIM SRO_Player;
	PCore SRO_Core;
	PNet SRO_Net;
};

GameBase.cpp文件的修改:修改了 Init函数,删除了InitClassProc函数

#include "pch.h"
#include "GameBase.h"
#include "extern_all.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];
	SRO_Core = (PCore)0x1036590;
	addrRead = (unsigned*)0x12A3AB0;
	SRO_Net = (PNet)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(&Control::_UseItem, 0x85F640);
	InitClassProc(&Control::_MangeItem, 0x864220);
	InitClassProc(&ITEM::_GetItemRes, 0x995800);
	InitClassProc(&Pack::_GetPackPack, 0x7722C0);
	InitClassProc(&Pack::_GetEquipPack, 0x772300);
	InitClassProc(&Core::_GetLvMaxExp, 0xA21F20);
	InitClassProc(&NetData::_MakeData, 0x47F550);

}

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

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

新加NetData类:

NetData.cpp文件

#include "pch.h"
#include "NetData.h"

NetData::PROC_P_D NetData::_MakeData{};
void NetData::MakeData(LPVOID data, unsigned len)
{
	return(this->*_MakeData)(data, len);
}

NetData.h文件

#pragma once
typedef class NetData
{
	typedef void (NetData::* PROC_P_D)(LPVOID, unsigned);
public:
	static PROC_P_D _MakeData;
	void MakeData(LPVOID, unsigned);
}*PNetData;

新加Net类:

Net.cpp文件

#include "pch.h"
#include "Net.h"
#include "extern_all.h"

Net::P_PROC_D_D Net::_CreateNetData{};
Net::PROC_P Net::_SendData{};
PNetData Net::CreateNetData(unsigned type, unsigned option)
{
    InitClassProc(&Net::_CreateNetData, vTable, 0x9);
    return (this->*_CreateNetData)(type, option);
}

void Net::SendData(LPVOID data)
{
    InitClassProc(&Net::_SendData, vTable, 0xB);
    return (this->*_SendData)(data);
}

Net.h文件

#pragma once
#include "NetData.h"
typedef class Net
{
	typedef PNetData(Net::* P_PROC_D_D)(unsigned, unsigned);
	typedef void(Net::* PROC_P)(LPVOID);
	unsigned* vTable; // 虚表
	static P_PROC_D_D _CreateNetData;
	static PROC_P _SendData;
public:
	PNetData CreateNetData(unsigned type, unsigned option);
	void SendData(LPVOID);
}*PNet;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值