网络通信封包分析--2

数据包组织与发送过程分析

一般碰到复杂的就不去看,但这个太重要了,得硬着头皮上了,如果遇到是在处理不来的就直接还原成C++代码就能看懂了

首先就是看edi是从哪来的


这个函数是有可能会改变edi的
这里edi已经是可以看作是一个类了,这个数据包可以看作是一个独立的类

往上看看

 这个edi是从eax来的 正好是调用了这个edx的函数

 edi又来自 12A3AB0 这个是NET类

这个edi是NET类的一个指针
edx是从ebx+24得到的

如果eax和ecx不复杂 ,能看明白这两个参数 通过这两个参数就能得到一个数据包的结构体

参数是这个 
7025应该是某种操作   因为走路就变成了7021 所以我们认为这是根据操作的不同类型,组织出来的一个数据包

看看这个组织的数据包长啥样:

 

 就去看看这个函数做了啥

 通过eax+1050这个来写入

看看ecx的值:


写入后:

 是在这个地方写入的这个操作类型

再看看这个call eax这个函数
传入了一个指针个0

看了眼eax太麻烦了、、暂时不看

反正调用这个edx这个函数是能得到这个类的

断下看看数据包

 

 然后跳到了这里

 参数是 两个

 

目前给了段空间 ,运行完函数

 从第一个开始到发送的数据结尾刚好是11个

所以这是明文组合数据包的过程
把各种有效数据在这儿完成了组合,这是基本数据组合成数据包的过程,但对于我们没啥用

有了数据包 有了长度

往下调用了这个函数
这个ecx刚好是数据包的指针 

D是长度 
调用前:

后: 

 把数据包拼接到了edi的这个类里

这个函数是数据包类的一个成员函数

再看看会不会涉及edi释放

应该是没啥太大问题 

 C++还原网络通信系统发送功能

先把这个发送功能还原成C++代码,就可以用他提供的方法来发送数据了,当然暂时还不知道数据怎么组织,先把这个功能还原再来解密这个数据包

先还原这个 Net类 首先看看这个12A3AB0的值会不会变。
看了下不会变就ok

 它用了ebx+24这个函数,这是个虚函数,还原虚函数表的话不太好处理,但也可以还原

首先添加两个类 Net 类和 NetData类

​
#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;



#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, 9);
    return (this->*_CreateNetData)(type,option);
}

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



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



#include "pch.h"
#include "NetData.h"
NetData::PROC_P_D NetData::_MakeData{};
void NetData::MakeData(LPVOID buf, unsigned len)
{
	return (this->*NetData::_MakeData)(buf, len);
}

在明文组织数据包这看看数据:

01 01 00 09 00 31 32 33 34 35 36 37 38 39        .....123456789
01 02 00 06 00 31 32 33 34 35 36                .....123456
01 03 00 0A 00 39 38 37 36 35 34 33 32 31 30    .....9876543210

发现第四个位置是后面数据长度

大致猜测: 
char 01 不变
short seq 数据顺序
short length 长度
char data

改成把01 改成00 试试:

说话成功了但没内容

在说一句话 改01试试:

发现显示了之前没有显示的那句话 

这个就是会在发送消息的时候编一个号,发送消息完时告诉第几号发送成功了,然后就可以把这个消息显示出来,这就不用把说的什么话广播给你,节约了网络

测试:

在发送网络包的地方把123改成456 发现在自己这显示的是 123 但在 别人显示的是456
在自己这还是依据说的是什么序号来读取本地之前在这发送的时候存储的记录
自己看着是123 但在别的玩家看来是456

 再改下说话的频道试试:

05 05 00 03 00 31 31 31
第一个字节05就代表频道

char  频道
short seq 数据包顺序
short length 长度
char data

再试试私聊
02 09 00 06 00 4D 61 73 74 65 72 03 00 31 32 33 .....Master..123
发现是完全不同的数据格式,到时候还得单独去处理

测试:

	char msg[] = { "123456" };
	char buff[0xFF]{};
	int len;
	auto netdata = _pgamebase->SRO_Net->CreateNetData(0x7025, 0);

	chatData chat;
	chat.id = 1;
	chat.seq = 0;
	chat.len = sizeof(msg)-1;
	memcpy(chat.text, msg, chat.len);

	len = chat.len + 5;
	netdata->MakeData(&chat.id, len);
	_pgamebase->SRO_Net->SendData(netdata);

 

 按下按钮 虽然我们看着是没消息 但是发送出去了的 因为架构原因自己看的是seq对应的临时数据

再来解读一个全服喊话的数据包

0E 31 0C 03 05 00 03 00 31 32 33 
再来一个
0E 31 0C 03 05 00 03 00 34 35 36

头没有任何变化
换一个序号的

0D 31 0C 03 05 00 03 00 31 32 33 

发现使用第一个格子的是0D 第二个格子的是0E 那看看第三个格子的物品

0F 30 0C 01 01

把箱子挪到第一个
0D 30 0C 01 01

这个01 01 不知道是啥 (用的是个箱子)只有5字节

后面四个字节和位置没关系 那只能和物品种类有关系了

但可以初步确认这个是从0D开始计算使用物品的格子

再用个收费的锤子

6C 31 0C 0D 07

可以确定是从D起步算的 收费道具都是31 0C ,0D 07只能判定是物品id

测试:

char msg[] = { "123456" };
	char buff[0xFF]{};
	int len;
	auto netdata = _pgamebase->SRO_Net->CreateNetData(0x704C, 1);

	chatData chat{};
	chat.id = 0xD;
	chat.seq = 0x0C31;
	chat.len = 0x0503;

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

	t->slip = 0;
	t->txtlen = sizeof(msg) - 1;
	memcpy(chat.text+3, msg, t->txtlen);
	len = t->txtlen + 8;

	/*
	chat.id = 1;
	chat.seq = 0;
	chat.len = sizeof(msg)-1;
	*/

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

再看看这个操作能不能使用物品:

没反应 应该是组织数据包参数不同- -

不过也算是大功告成

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

#A#

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值