内容参考于:易道云信息技术研究院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;