102.网游逆向分析与插件开发-网络通信封包解析-解读喊话道具数据包并且利用Net发送

news2024/11/25 12:28:36

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

上一个内容:解读聊天数据包并且利用Net发送

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

码云版本号:cc6370dc5ca6b0176aafc6d1243b900eb6fccc69

代码下载地址,在 SRO_EX 目录下,文件名为:SRO_Ex-解读喊话道具数据包并且利用Net发送.zip

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

提取码:q9n5

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

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

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

提取码:78h8

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

以 解读聊天数据包并且利用Net发送 它的代码为基础进行修改

效果图:

付费道具全体聊天,从下图中的数据包,看不出什么东西来,首先它没有背包相关的数据,也没有物品所在背包的序号

所以再使用下图红框位置的全体聊天道具来发送一个消息,然后对比这俩物品发送数据的数据包有什么不同

它的数据包结构

对比:

然后把物品换一下位置

使用物品

使用第二个位置的物品

使用第三个位置的物品

然后可以看出,第一个字节是物品在背包里的序号,序号是从D开始

然后使用药物时的数据包结构

然后把药品移动到第一个位置,再使用,这时的数据包

除了第一个字节,其余字节都没有变化,然后物品id不可能用完四个字节这么大

九千万的数字,才只有26个字节大小,很显然物品id不可能有四字节,所以数据包后面的四字节肯定有它自己的意思,所以继续使用不同的物品从而对比分析它们的数据包的变化,然后找出规律,然后猜测它们都是什么意思,然后写C++

使用其它buffer类物品

使用道具:

分析结构,下图红框位置,前三个是全体聊天的结构,第四个是使用修理锤子道具的数据包,然后修理锤子数据包第一个字节是序号,第二个字节和第三个字节表示付费道具,第四个字节和第五个字节只能认为它是物品的id,然后全体聊天的数据包,第一个是序号,第二个字节和第三个字节表示付费道具,第四个和第五个字节是物品id,第六个和第七个是发送消息的长度,后面的就是发送的数据了,然后通过对比使用物品的数据包得出以上结果,然后它的结构体就可以定下来了

CHelperUI.cpp文件的修改,新加 TalkData结构体,修改了 OnBnClickedOk函数

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

#include "pch.h"
#include "CHelperUI.h"
#include "afxdialogex.h"
#include "extern_all.h"

LRESULT _stdcall CallWndProc(int nCode, WPARAM wParam, LPARAM lParam) {
	if (nCode == 0) {
		// 这里接收到的不只有游戏窗口的消息,还有我们的窗口消息
		// 所以要排除掉我们的窗口
		PCWPSTRUCT tmp = (PCWPSTRUCT)lParam;
		// 判断当前触发消息的窗口句柄是不是我们的游戏窗口句柄
		if (tmp->hwnd == _ui_helper->hwndGame) {
			// 拦截移动窗口消息
			if (tmp->message == WM_MOVE) {
				// 移动我们的窗口
				_ui_helper->MoveHelper();
			}
			if (tmp->message == WM_CLOSE) {
				// 游戏窗口右上角的X关闭按钮屏蔽掉了,这里我们给它处理一下
				// 让它点击之后可以隐藏游戏窗口并且显示我们的窗口
				/**
				 _ui_helper->HideGame(); 里执行的代码如下面的两行
					this->ShowWindow(TRUE);
					::ShowWindow(hwndGame, GameShow = false);
				*/
				_ui_helper->HideGame();
			}
			
		}
	}
	return CallNextHookEx(_ui_helper->hookGameWnd, nCode, wParam, lParam);
}

void _stdcall TimeProcHelper(HWND, UINT, UINT_PTR, DWORD) {
	if (_ui_helper)_ui_helper->ShowData();
}

//获取程序当前所在显示器的分辨率大小,可以动态的获取程序所在显示器的分辨率
SIZE GetScreenResolution(HWND hWnd) {
	SIZE size{};
	if (!hWnd)
		return size;

	//MONITOR_DEFAULTTONEAREST 返回值是最接近该点的屏幕句柄
	//MONITOR_DEFAULTTOPRIMARY 返回值是主屏幕的句柄
	//如果其中一个屏幕包含该点,则返回值是该屏幕的HMONITOR句柄。如果没有一个屏幕包含该点,则返回值取决于dwFlags的值
	HMONITOR hMonitor = MonitorFromWindow(hWnd, MONITOR_DEFAULTTONEAREST);
	MONITORINFOEX miex;
	miex.cbSize = sizeof(miex);
	if (!GetMonitorInfo(hMonitor, &miex))
		return size;

	DEVMODE dm;
	dm.dmSize = sizeof(dm);
	dm.dmDriverExtra = 0;

	//ENUM_CURRENT_SETTINGS 检索显示设备的当前设置
	//ENUM_REGISTRY_SETTINGS 检索当前存储在注册表中的显示设备的设置
	if (!EnumDisplaySettings(miex.szDevice, ENUM_CURRENT_SETTINGS, &dm))
		return size;

	size.cx = dm.dmPelsWidth;
	size.cy = dm.dmPelsHeight;
	return size;
}

IMPLEMENT_DYNAMIC(CHelperUI, CDialogEx)

CHelperUI::CHelperUI(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_HELPER, pParent)
{

}

CHelperUI::~CHelperUI()
{
}

BOOL CHelperUI::OnInitDialog()
{
	CDialogEx::OnInitDialog();
	this->SetBackgroundColor(RGB(255, 255, 255));
	HPBar.SetBkColor(RGB(0 ,0, 0));
	MPBar.SetBkColor(RGB(0 ,0, 0));
	RageBar.SetBkColor(RGB(0 ,0, 0));
	ExBar.SetBkColor(RGB(0 ,0, 0));
	

	HPBar.SetBarColor(RGB(255 ,0, 0));
	MPBar.SetBarColor(RGB(0x0, 0x0, 0x99));
	RageBar.SetBarColor(RGB(0x66, 0x0, 0x66));
	ExBar.SetBarColor(RGB(0x00, 0xFF, 0xCC));

	HPBar.SetRange(0, 999);
	MPBar.SetRange(0, 1000);
	RageBar.SetRange(0, 5);
	ExBar.SetRange(0, 1000);

	//HPBar.SetPos(50);
	//MPBar.SetPos(50);
	//RageBar.SetPos(50);
	//ExBar.SetPos(50);

	::SetTimer(this->m_hWnd, 0x100002, 100, TimeProcHelper);

	return TRUE;
}

void CHelperUI::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_PRO_HP, HPBar);
	DDX_Control(pDX, IDC_PRO_MP, MPBar);
	DDX_Control(pDX, IDC_PRO_RAGE, RageBar);
	DDX_Control(pDX, IDC_PRO_RAGE2, ExBar);
}


BEGIN_MESSAGE_MAP(CHelperUI, CDialogEx)
	ON_BN_CLICKED(IDOK, &CHelperUI::OnBnClickedOk)
	ON_BN_CLICKED(IDOK2, &CHelperUI::OnBnClickedOk2)
	ON_WM_CLOSE()
END_MESSAGE_MAP()


// CHelperUI 消息处理程序

struct TalkData{
	char un;
	char slip;
	short txtlenth;
};

struct ChatData {
	char un; // 内存对齐
	char id;// 频道
	short index; // 说话内容的序号
	short lenth; // 说话内容的长度
	char text[0x50]; // 说话的内容
	
};

void CHelperUI::OnBnClickedOk()
{
	char talk[]{ "欢迎来到地球!" };
	char buff[0xFF]{};
	int len;
	//auto netdata = _pgamebase->SRO_Net->CreateNetData(0x7025, 0x0);
	auto netdata = _pgamebase->SRO_Net->CreateNetData(0x704C, 0x1);

	ChatData chat{};
	chat.id = 0xD;
	chat.index = 0x0C31;
	chat.lenth = 0x0503;

	TalkData* t = (TalkData*)(chat.text - 1);

	t->slip = 0x0;
	t->txtlenth = sizeof(talk) - 1;
	/*chat.id = 1;
	chat.index = 1;
	chat.lenth = sizeof(talk) -1 ;*/

	memcpy(chat.text + 3, talk, t->txtlenth);
	len = t->txtlenth + 8;

	netdata->MakeData(&chat.id, len);

	_pgamebase->SRO_Net->SendData(netdata);

	// CDialogEx::OnOK();
	//CString tmp;
	//tmp.Format(L"%d", _pgamebase->SRO_Player->MapId);
	//AfxMessageBox(tmp);
	//
	//CString city;
	//city.Format(L"%s", _pgamebase->SRO_Res->ReadTitle(tmp.GetBuffer())->wcstr());
	//AfxMessageBox(city);
	// _ui->UIShow();
}

void CHelperUI::Init()
{
	if (hwndGame) return;
	wchar_t buff[0xFF]{};
	// 获取主窗口句柄
	HWND _hwnd = ::GetActiveWindow();
	// 获取窗口标题
	::GetWindowText(_hwnd, buff, 0xFF);
	CString _title = buff;
	if (_title == L"SRO_CLIENT") {
		hwndGame = _hwnd;
		CRect rect_me;
		// 获取当前窗口句柄
		GetWindowRect(&rect_me);
		helper_Width = rect_me.Width();
		SetWindowsHook(WH_CALLWNDPROC, CallWndProc);
	}
}

void CHelperUI::MoveHelper()
{
	if (hwndGame) {
		CRect rect;
		// 获取游戏窗口(主窗口)样式
		::GetWindowRect(hwndGame, &rect);
		int helper_left = rect.left + rect.Width();
		SIZE windowSize = GetScreenResolution(this->m_hWnd);
		if ((helper_left + helper_Width) > windowSize.cx) {
			helper_left -= helper_Width;
		}
		// 设置窗口大小
		::MoveWindow(this->m_hWnd, helper_left, rect.top, helper_Width, rect.Height(), TRUE);
	}
}

void CHelperUI::ShowData()
{
	CString tmp;
	CString city;

	auto _player = _pgamebase->SRO_Player;
	if (_player) {
		tmp.Format(L"%s Lv %d", _player->Name.wcstrByName(), _player->Lv);
		this->SetWindowText(tmp);
		float hpStep = _player->HP * 1000;
		hpStep = hpStep / _player->MaxHP;
		HPBar.SetPos(hpStep);

		float mpStep = _player->MP * 1000;
		mpStep = mpStep / _player->MaxMP;
		MPBar.SetPos(mpStep);
		RageBar.SetPos(_player->Rage);

		unsigned max_exp = _pgamebase->SRO_Core->GetLvMaxExp(_player->Lv)->Exp;
		float expSetp = _player->Exp * 1000;
		expSetp = expSetp / max_exp;
		ExBar.SetPos(expSetp);

		tmp.Format(L"%.1f %.1f %.1f", _player->x, _player->h, _player->y);
		GetDlgItem(IDC_STATIC_CORD)->SetWindowText(tmp);

		tmp.Format(L"%d", _pgamebase->SRO_Player->MapId);
		city.Format(L"%s", _pgamebase->SRO_Res->ReadTitle(tmp.GetBuffer())->wcstr());
		GetDlgItem(IDC_STATIC_MAP)->SetWindowText(city);

	}
}

void CHelperUI::Show()
{
	MoveHelper();
	this->ShowWindow(TRUE);
}


void CHelperUI::OnBnClickedOk2()
{
	if (hwndGame) {
		::ShowWindow(hwndGame, GameShow = !GameShow);
	}
}


void CHelperUI::OnClose()
{
	if (hwndGame) {
		::ShowWindow(hwndGame, GameShow = true);
		this->ShowWindow(FALSE);
	}
}

void CHelperUI::HideGame()
{
	this->ShowWindow(TRUE);
	::ShowWindow(hwndGame, GameShow = false);
}

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

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

相关文章

【web | CTF】BUUCTF [BJDCTF2020]Easy MD5

天命:好像也挺实用的题目,也是比较经典吧 天命:把php的MD5漏洞都玩了一遍 第一关:MD5绕过 先声明一下:这题的MD5是php,不是mysql的MD5,把我搞迷糊了 一进来题目啥也没有,那么就要看…

P1498 南蛮图腾题解

题目 给定一个正整数n,参考输出样例,输出图形。 输入输出格式 输入格式 每个数据输入一个正整数n,表示图腾的大小(此大小非彼大小) 输出格式 这个大小的图腾 输入输出样例 输入样例 2 输出样例 /\/__\/\ /\…

前端秘法基础式(CSS)(第一卷)

一.认识CSS CSS 指的是层叠样式表(Cascading Style Sheets),它是一种用于描述网页外观和布局的语法 CSS 可以定义网页中元素的字体、颜色、大小、位置、背景等样式,使网页具有美观的外观和统 一的风格。 通过将 CSS 样式表与 HTML…

成员方法传参机制

一、成员方法传参机制 1、值传递:形参改变不影响实参 2、地址传递:形参改变影响实参

wordpress外贸成品网站模板

首页大图slider轮播,橙色风格的wordpress外贸网站模板 https://www.zhanyes.com/waimao/6250.html 蓝色经典风格的wordpress外贸建站模板 https://www.zhanyes.com/waimao/6263.html

NetMizer 日志管理系统 多处前台RCE漏洞复现

0x01 产品简介 NetMizer是提供集成应用交付和应用安全解决方案以实现业务智能网络的优秀全球供应商,为全球企业和运营商提供确保关键业务应用的全面可用性、高性能和完善的安全性的解决方案。 0x02 漏洞概述 NetMizer 日志管理系统position.php、hostdelay.php、等接口处存在…

【动态规划初识】不同的二叉搜索树

每日一道算法题之不同二叉搜索树个数 一、题目描述二、思路三、C++代码一、题目描述 题目来源:LeetCode 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。 C++程序要求输入输出格式如下: 示例1:…

Gartner指引:四大误区大揭秘,打造高效安全管理体系

安全管理体系是一个复杂的生态系统,定义了企业的关键信息、安全原则、资源和活动(见图1)。企业机构所构建和运行的安全体系往往难以既对员工实用,又能有效管理快速发展的数字风险。因此,首席信息官(CIO&…

2024.2.16日总结(小程序开发8)

数据监听器 监听对象属性的变化 数据监听器支持监听对象中单个或多个属性的变化 纯数据字段 什么是纯数据字段 纯数据字段指的是哪些不用于页面渲染的data字段 应用场景:例如有些情况下,某些 data 中的字段既不会展示在界面上,也不会传递给其他组件…

《Go 简易速速上手小册》第1章:Go 语言基础(2024 最新版)

文章目录 1.1 Go 语言的安装与环境配置1.1.1 基础知识讲解案例 Demo:简单的 Go 程序 1.1.2 重点案例:搭建一个 Go Web 服务准备工作步骤 1:创建项目目录步骤 2:编写 Web 服务代码步骤 3:运行你的 Web 服务步骤 4&#…

[word] 手把手教您在word中添加mathtype加载项 #笔记#职场发展

手把手教您在word中添加mathtype加载项 mathtype安装完成后,正常情况下会在word文档中的菜单中自动添加mathtype加载项,但有时也会出现小意外,mathtype并没有加载到word文档中,本教程将教您解决如何手动添加mathtype加载项。 原…

Springboot的it职业生涯规划系统(有报告)。Javaee项目,springboot项目。

演示视频: Springboot的it职业生涯规划系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构&a…

【上海游戏业:创新与商业的结合】

上海游戏业:创新与商业的结合 我国游戏产业在近年来蓬勃发展,不同城市都涌现出许多优秀的游戏公司。为全面了解中国游戏业的发展情况及地区特色,本文选择分析游戏业较为发达的上海、广州、北京、深圳、成都、杭州、福建七个城市。这些城市在…

AI使用 G-API 实现面部美化算法

介绍 在本教程中,您将学习: 示例面部美化算法的基础知识; 如何使用 G-API 推断管道内的不同网络; 如何在视频流上运行 G-API 管道。 先决条件 此示例需要: 装有 GNU/Linux 或 Microsoft Windows 的 PC(支持 Apple macOS&#xf…

Windows下体验Stable Diffusion 近距离感受AI魔法绘画

🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄 🌹简历模板、学习资料、面试题库、技术互助 🌹文末获取联系方式 📝 往期专栏回顾 专栏描述Java项目实战介绍Java组件安装、使用;手写框架等Aws服务器实战Aws Linux服务器上操作ngin…

25.原型链和原型(非常重要),听说你还没搞懂??

1. 对原型、原型链的理解 在JavaScript中是使用构造函数来新建一个对象的,每一个构造函数的内部都有一个 prototype 属性,它的属性值是一个对象,这个对象包含了可以由该构造函数的所有实例共享的属性和方法。当使用构造函数新建一个对象后&a…

2024-02-16 AIGC-数字人-平台调研-记录

摘要: 2024-02-16 AIGC-数字人-平台调研 需求分析: 数字人-平台调研 南京硅基智能北京风平智能[风平科技]品达集团[杭州品达企服科技(集团)有限公司]花脸数字技术灰豚数字人[温州专帮信息科技有限公司]魔珐科技数字栩生公司官网guiji-ows风平智能 - 领先的AIGC解决方案提供商。…

小白水平理解面试经典题目LeetCode 102 Binary Tree Level Order Traversal【二叉树】

102. 二叉树层次顺序遍历 小白渣翻译 给定二叉树的 root ,返回其节点值的层序遍历。 (即从左到右,逐级)。 例子 小白教室做题 在大学某个自习的下午,小白坐在教室看到这道题。想想自己曾经和白月光做题&#xff0c…

工业数据采集的时间不确定性及PLC-Recorder的通道偏移功能

目录 一、缘起 二、效果展示 三、设置方法 四、小结 一、缘起 大家都知道采集软件首先要尽可能还原数据原来的状态,给用户提供一个可以信赖的参考。但是,数据采集又有很多随机因素:Windows是一个周期不严格的系统、以太网通讯有时间波动、…

【华为数通HCIP | 网络工程师】H12-831刷题日记 题目+解析(2)

个人名片: 🐼作者简介:一名大三在校生,喜欢AI编程🎋 🐻‍❄️个人主页🥇:落798. 🐼个人WeChat:hmmwx53 🕊️系列专栏:🖼️…