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;

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

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

相关文章

C/C++如何把指针所指向的指针设为空指针?

实践出真知,指针对于初学的友友来说,头都要大了。喵喵一直遵循在实践中学,在学习中实践,相信你也会有所得! 以下是该问题的解决方案: int** ptrPtr new int*; // 创建指向指针的指针 int* ptr new int;…

《动手学深度学习(PyTorch版)》笔记8.2

注:书中对代码的讲解并不详细,本文对很多细节做了详细注释。另外,书上的源代码是在Jupyter Notebook上运行的,较为分散,本文将代码集中起来,并加以完善,全部用vscode在python 3.9.18下测试通过&…

基于Springboot的社区物资交易互助平台(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的社区物资交易互助平台(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系…

深度学习||YOLO(You Only Look Once)深度学习的实时目标检测算法(YOLOv1~YOLOv5)

目录 YOLOv1: YOLOv2: YOLOv3: YOLOv4: YOLOv5: 总结: YOLO(You Only Look Once)是一系列基于深度学习的实时目标检测算法。 自从2015年首次被提出以来,YOLO系列不断发展,推出了多个版本,包括YOLOv1, YOLOv2, YOLOv3, YOLOv4, 和YOLOv5等。下面是对YOLO系列的详解…

【光学】学习记录1-几何光学的近轴理论

课程来源:b站资源-光学-中科大-崔宏滨老师(感谢),本系列仅为自学笔记 【光学 中科大 崔宏滨老师 1080p高清修复(全集)】https://www.bilibili.com/video/BV1NG4y1C7T9?p2&vd_source7ba37b2cff2a1b783…

MATLAB计算极限和微积分

一.函数与极限 计算极限:lim(3*x^2/(2x1)),x分别趋于0和1,代码如下: syms x; limit(3*x*x/(2*x1),x,0) limit(3*x*x/(2*x1),x,1) 结果分别为0和1: 1.计算双侧极限 计算极限:lim(3*x^2/(2x1))&#xff0…

wordpress日主题模版Ripro-v5 6.4开心版

RiPro主题全新V5版本,(原RiPro v2旧版已停更)是一个优秀且功能强大、速度极快,易于管理、现代化的WordPress虚拟资源商城主题。支持首页模块化布局和WP原生小工具模块化首页可拖拽设置,让您的网站设计体验更加舒适。同…

linux进程控制【程序替换】

目录 前言: 1.替换原理 ​编辑 2.替换函数 2.1函数 execl 2.2函数 execv 2.3函数 execlp 2.4函数 execvp 2.5函数 execle 2.6函数 execve 2.7函数 execvpe 前言: 前面我们介绍了进程控制中的创建,退出等待,本章节我们将…

计算机的分类

计算机的分类 1.个人移动设备。这个比较好理解,比较常见的是手机,平板电脑。 2.桌面计算机。这类计算机范围比较广泛,包括低端的上网本,台式计算机,笔记本电脑和高端的工作站。核心部件都是表大规模集成电路技术的cp…

8.JS中的== 操作符的强制类型转换规则

对于 来说,如果对比双方的类型不一样,就会进行类型转换。假如对比 x 和 y 是否相同,就会进行如下判断流程: 首先会判断两者类型是否相同,类型相同的话就比较两者的大小;类型不相同的话,就会进…

核心篇-OSPF技术之序(下)

文章目录 一. 实验专题1.1. 实验1:配置OSPF特殊区域1.1.1. 实验目的1.1.2. 实验拓扑图1.1.3. 实验步骤(1)配置IP地址(2)创建环回口(3)查看路由表(4)设置Stub区域&#xf…

【LeetCode】1005. K 次取反后最大化的数组和(简单)——代码随想录算法训练营Day33

题目链接:1005. K 次取反后最大化的数组和 题目描述 给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组: 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。 重复这个过程恰好 k 次。可以多次选择同一个下标 i 。 以这种方式修改…

2024/02/13

21 、C 22 、D 23、B 如果5先出栈那么1,2,3,4就已经入栈了,5出后4出,1要出栈必须先让3,2出栈,所以 不可能输出B 24、10,12,120 25、2,5 26、段错…

selenium定位元素报错:‘WebDriver‘ object has no attribute ‘find_element_by_id‘

Selenium更新到 4.x版本后,以前的一些常用的代码的语法发生了改变 from selenium import webdriver browser webdriver.Chrome() browser.get(https://www.baidu.com) input browser.find_element_by_id(By.ID,kw) input.send_keys(Python)目标:希望通…

【Python--网络编程之TCP三次握手】

🚀 作者 :“码上有前” 🚀 文章简介 :Python开发技术 🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬 Python网络编程之[TCP三次握手] 往期内容代码见资源,效果图如下一、实验要求二、协…

嵌入式内核链表list_head,如何管理不同类型节点的实现

在Linux内核中,提供了一个用来创建双向循环链表的结构 list_head。虽然linux内核是用C语言写的,但是list_head的引入,使得内核数据结构也可以拥有面向对象的特性,通过使用操作list_head 的通用接口很容易实现代码的重用&#xff0…

qsort函数(c语言库函数)

一、概述 qsort函数是C语言标准库中的一个函数,用于对数组进行快速排序。 二、函数原型 函数原型如下: void qsort(void *base, size_t nmemb, size_t size,int(*compar)(const void *, const void *));三、参数解析 base:指向要排序的数…

P1219 八皇后 (dfs 表格坐标关系)

一个正常的dfs(数据范围1-13),发现一条对角线上,分别符合和与差相等。因为有负数,这里我最开始开的是map,发现卡了最后一个点TLE,记录一下时间复杂度( map,set的时间复杂…

Mysql——update更新数据的方式

注:文章参考: MySQL 更新数据 不同条件(批量)更新不同值_update批量更新同一列不同值-CSDN博客文章浏览阅读2w次,点赞20次,收藏70次。一般在更新时会遇到以下场景:1.全部更新;2.根据条件更新字段中的某部分…

Java中与泛型相关的接口 之 TypeVariable

简介 TypeVariable是“类型变量”&#xff08;或者叫“泛型变量”更准确些&#xff09;的通用的顶级接口。在泛型编程中会用到“泛型变量”来描述类型&#xff0c;或者说是用来表示泛型。一般用大写字母作为类型变量&#xff0c;比如K、V、E等。 说到TypeVariable<D exten…