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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

TiDB in 2023, 一次简单的回顾丨PingCAP 唐刘

2023 年已经过去,TiDB 经过了一年的迭代,又往前进步了一点点,我们非常自豪的看到,TiDB 正在不断地帮助我们的客户成功,包括但不限于: ○ 首个云原生、分布式、全栈国产化银行核心业务系统投产上线丨TiDB …

云计算基础-快照与克隆

快照及克隆 什么是快照 快照是数据存储的某一时刻的状态记录,也就是把虚拟机当前的状态保存下来(快照不是备份,快照保存的是状态,备份保存的是副本) 快照优点 速度快,占用空间小 快照工作原理 在了解快照原理前,…

leetcode135. 分发糖果

leetcode135. 分发糖果 题目 思路 两者兼顾很容易顾此失彼,因此分别考虑两方向,初始化为全1数组从前向后遍历:只要右边评分比左边大,result[i] result[i-1] 1从后向前遍历:只要左边评分比右边大,result…

round sphere around ground background space-around space-between space-evenly

round sphere around ground background space-around space-between space-evenly round around ground surround round sphere around ground background around surround around evenly between space-around space-between space-evenly Round: 描述形状为圆形或球形的。例…

集群聊天项目

不懂的一些东西 (const TcpConnectionPtr&)作为形参啥意思:接收一个常量引用,函数内部不允许修改该指针所指向的对象。 优势 1.网络层与业务层分离:通过网络层传来的id,设计一个map存储id以及对印的业务处理器&…

云计算基础-计算虚拟化-CPU虚拟化

CPU指令系统 在CPU的工作原理中,CPU有不同的指令集,如下图,CPU有4各指令集:Ring0-3,指令集是在服务器上运行的所有命令,最终都会在CPU上执行,但是CPU并不是说所有的命令都是一视同仁的&#xf…

vscode写MATLAB配置

vscode写MATLAB python下载 官网说明Versions of Python Compatible with MATLAB Products by Release - MATLAB & Simulink 不确定这三列都表示什么意思,尽量安装这三列都有的python版本吧,我安装的 MATLAB R2023b,python选择的是3.11.5 …

Midjourney绘图欣赏系列(四)

Midjourney介绍 Midjourney 是生成式人工智能的一个很好的例子,它根据文本提示创建图像。它与 Dall-E 和 Stable Diffusion 一起成为最流行的 AI 艺术创作工具之一。与竞争对手不同,Midjourney 是自筹资金且闭源的,因此确切了解其幕后内容尚不…

2.13:C语言测试题

21.(b) 6 22.(b) cd 23.b) 5 4 1 3 2 栈:先进后出 24. b,c,d:10,12,120 25.2,5 26.越界访问,可能正常输出,可能段错误 27. 0,41 28. a)11 b) 320 29. aab; ba-b; aa-b; 30. p150x801005; p250x810…

TIM(Timer)定时中断 P1

难点:定时器级联、主从模式 一、简介: 1.TIM(Timer)定时器 定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断 补充: { 定时器本质上是一个计数器,可以工作在定时或计数模式&…

哈希表哈希桶(C++实现)

哈希的概念 顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素 时,必须要经过关键码的多次比较。顺序查找时间复杂度为O(N),平衡树中为树的高度,即 O( l o g 2 N log_2 N log2​N)&…

HTML-多媒体嵌入-MDN文档学习笔记

HTML-多媒体与嵌入 查看更多学习笔记&#xff1a;GitHub&#xff1a;LoveEmiliaForever MDN中文官网 HTML-中的图片 将图片放入网页 可以使用<img/>来将图片嵌入网页&#xff0c;它是一个空元素&#xff0c;最少只需src属性即可工作 <img src"图片链接"…

知识图谱:py2neo将csv文件导入neo4j

文章目录 安装py2neo创建节点-连线关系图导入csv文件删除重复节点并连接边 安装py2neo 安装python中的neo4j操作库&#xff1a;pip install py2neo 安装py2neo后我们可以使用其中的函数对neo4j进行操作。 图数据库Neo4j中最重要的就是结点和边&#xff08;关系&#xff09;&a…

【论文精读】BERT

摘要 以往的预训练语言表示应用于下游任务时的策略有基于特征和微调两种。其中基于特征的方法如ELMo使用基于上下文的预训练词嵌入拼接特定于任务的架构&#xff1b;基于微调的方法如GPT使用未标记的文本进行预训练&#xff0c;并针对有监督的下游任务进行微调。 但上述两种策略…

机器学习——聚类问题

&#x1f4d5;参考&#xff1a;西瓜书ysu老师课件博客&#xff08;3&#xff09;聚类算法之DBSCAN算法 - 知乎 (zhihu.com) 目录 1.聚类任务 2.聚类算法的实现 2.1 划分式聚类方法 2.1.1 k均值算法 k均值算法基本原理&#xff1a; k均值算法算法流程&#xff1a; 2.2 基于…

代码随想录算法训练营第31天|● 理论基础 ● 455.分发饼干 ● 376. 摆动序列 ● 53. 最大子序和

文章目录 理论基础分发饼干思路&#xff1a;代码&#xff1a; 摆动序列思路一 贪心算法&#xff1a;代码&#xff1a; 思路二&#xff1a;动态规划&#xff08;想不清楚&#xff09;代码&#xff1a; 最大子序和思路&#xff1a;代码&#xff1a; 理论基础 贪心算法其实就是没…

Android Jetpack Compose 沉浸式状态栏的实现

目录 概述效果展示代码实现总结 概述 说到沉浸式状态栏&#xff0c;很多小伙伴可能不太熟悉&#xff0c;其实让Android的状态栏的颜色和APP的主题颜色相同&#xff0c;给人感觉状态栏和APP就是一体的。沉浸式的状态栏让页面看起来更舒服&#xff0c;实现沉浸式状态栏也很简单&…

精品jsp+ssm基于Java的疫苗接种管理系统

《[含文档PPT源码等]精品jspssm基于Java的疫苗接种管理系统[包运行成功]》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 使用技术&#xff1a; 开发语言&#xff1a;Java 框架&#xff1a;ssm 技术&#xff1a;JSP JDK版…

2024年!PyCharm快捷键大全

收藏&#xff01;PyCharm快捷键大全 工欲善其事必先利其器&#xff0c;PyCharm 是最popular的Python开发工具&#xff0c;它提供的功能非常强大&#xff0c;是构建大型项目的理想工具之一&#xff0c;如果能挖掘出里面实用技巧&#xff0c;能带来事半功倍的效果。 本文主要向大…

PLC_博图系列☞FBD

PLC_博图系列☞FBD 文章目录 PLC_博图系列☞FBD背景介绍FBD优势局限性 FBD 元素 关键字&#xff1a; PLC、 西门子、 博图、 Siemens 、 FBD 背景介绍 这是一篇关于PLC编程的文章&#xff0c;特别是关于西门子的博图软件。我并不是专业的PLC编程人员&#xff0c;也不懂电路…