16.网络游戏逆向分析与漏洞攻防-网络通信数据包分析工具-设计数据发送结构实现更复杂的数据发送

news2024/11/17 11:25:18

上一个内容:15.发送通信数据包至分析工具

码云地址(master 分支):https://gitee.com/dye_your_fingers/titan

码云版本号:f691a6a12ab49a711713f8ccdc8dd712c05826e9

代码下载地址,在 titan 目录下,文件名为:titan-设计数据发送结构实现更复杂的数据发送.zip

链接:百度网盘 请输入提取码

提取码:q9n5

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

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

链接:百度网盘 请输入提取码

提取码:78h8

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

以 15.发送通信数据包至分析工具 它的代码为基础进行修改

效果图:

新加复选框:

复选框的属性:

复选框的变量:

DataAnlyDlg.cpp文件的修改:修改了 OnCopyData函数、OnInitDialog函数


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

#include "pch.h"
#include "framework.h"
#include "DataAnly.h"
#include "DataAnlyDlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// 用于应用程序“关于”菜单项的 CAboutDlg 对话框

class CAboutDlg : public CDialogEx
{
public:
	CAboutDlg();

// 对话框数据
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_ABOUTBOX };
#endif

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

// 实现
protected:
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()


// CDataAnlyDlg 对话框



CDataAnlyDlg::CDataAnlyDlg(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_DATAANLY_DIALOG, pParent)
	, Pause(FALSE)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CDataAnlyDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_LIST1, lstView);
	DDX_Check(pDX, IDC_CHECK1, Pause);
}

BEGIN_MESSAGE_MAP(CDataAnlyDlg, CDialogEx)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDOK, &CDataAnlyDlg::OnBnClickedOk)
	ON_WM_COPYDATA()
	ON_BN_CLICKED(IDC_CHECK1, &CDataAnlyDlg::OnBnClickedCheck1)
END_MESSAGE_MAP()


// CDataAnlyDlg 消息处理程序

BOOL CDataAnlyDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 将“关于...”菜单项添加到系统菜单中。

	// IDM_ABOUTBOX 必须在系统命令范围内。
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != nullptr)
	{
		BOOL bNameValid;
		CString strAboutMenu;
		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
		ASSERT(bNameValid);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// ShowWindow(SW_MAXIMIZE); // 设置最大号启动

	// TODO: 在此添加额外的初始化代码
	auto lStyle = GetWindowLongPtr(lstView.m_hWnd, GWL_STYLE); // 获取窗口样式
	lStyle |= LVS_REPORT; // 设置为报表模式
	SetWindowLongPtr(lstView.m_hWnd, GWL_STYLE, lStyle);// 给窗口设置样式
	auto dStyle = lstView.GetExtendedStyle(); // 获取扩展样式
	dStyle |= LVS_EX_FULLROWSELECT; // 设置选择时选择一行
	dStyle |= LVS_EX_GRIDLINES; // 画网格线
	lstView.SetExtendedStyle(dStyle); // 设置扩展样式

	/*
		lstView.InsertColumn(0, L"类型", 0, 100);
		lstView.InsertColumn(1, L"内容", 0, 700);
		lstView.InsertColumn(2, L"长度", 0, 50);
		lstView.InsertColumn(3, L"时间", 0, 100);
		lstView.InsertColumn(4, L"备注", 0, 100);
		这几行代码意思是设置表头
	*/
	lstView.InsertColumn(0, L"消息类型", 0, 70);
	lstView.InsertColumn(1, L"数据类型", 0, 70);
	lstView.InsertColumn(2, L"内容", 0, 700);
	lstView.InsertColumn(3, L"长度", 0, 50);
	lstView.InsertColumn(4, L"时间", 0, 130);

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

void CDataAnlyDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialogEx::OnSysCommand(nID, lParam);
	}
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CDataAnlyDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 用于绘制的设备上下文

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// 使图标在工作区矩形中居中
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// 绘制图标
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialogEx::OnPaint();
	}
}

//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CDataAnlyDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}



void CDataAnlyDlg::OnBnClickedOk()
{
	wchar_t buff[]{ L"我爱阿民" };
	COPYDATASTRUCT copydata{};
	/*
		 这里的0表示字符串
		 0具体是什么要看 WM_COPYDATA消息处理函数怎样写的
	*/
	copydata.dwData = 0;
	copydata.cbData = sizeof(buff);
	copydata.lpData = buff;
	SendMessage(WM_COPYDATA, 0, (LPARAM)&copydata);
}


BOOL CDataAnlyDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* p)
{
	UpdateData(true);
	if (Pause)return CDialogEx::OnCopyData(pWnd, p);
	PCOPYDATA pdata = (PCOPYDATA)p->lpData;
	
	struct tm newtiem {};
	localtime_s(&newtiem, &pdata->ltime); // 获取时间

	int type = p->dwData;
	CString _result;
	CString _time;
	_time.Format(L"%.2d-%.2d-%.2d %.2d:%.2d:%.2d", newtiem.tm_year + 1900, newtiem.tm_mon, newtiem.tm_mday, newtiem.tm_hour, newtiem.tm_min, newtiem.tm_sec);

	if (MsgType[type]) {
		// 转换为buff
		unsigned char* buff = (unsigned char*)pdata->buff;
		CString _tmp;
		for (int i = 0; i < pdata->len;i++) {
			_tmp.Format(L"%.2X", buff[i]);
			_result = _result + L" " + _tmp;
		}
	}else {
		// 显示文本
		_result.Format(L"%s", pdata->buff);
	}

	lstView.InsertItem(0, MsgName[type]);
	lstView.SetItemText(0, 2, _result);
	lstView.SetItemText(0, 4, _time);

	CString wlen;
	wlen.Format(L"%d", pdata->len);
	lstView.SetItemText(0, 3, wlen);
	wlen.Format(L"%X", pdata->MsgType);
	lstView.SetItemText(0, 1, wlen);
	
	return CDialogEx::OnCopyData(pWnd, p);
}


void CDataAnlyDlg::OnBnClickedCheck1()
{
}

DataAnlyDlg.h文件的修改:新加 COPY_DATA结构体


// DataAnlyDlg.h: 头文件
//

#pragma once

typedef struct COPY_DATA {
	time_t ltime; // 时间
	unsigned MsgType; // 数据类型
	unsigned len; // 数据长度
	char buff[0x2000]; // 数据
}*PCOPYDATA;

// CDataAnlyDlg 对话框
class CDataAnlyDlg : public CDialogEx
{
// 构造
public:
	CDataAnlyDlg(CWnd* pParent = nullptr);	// 标准构造函数

// 对话框数据
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_DATAANLY_DIALOG };
#endif

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 支持


// 实现
protected:
	HICON m_hIcon;

	// 生成的消息映射函数
	virtual BOOL OnInitDialog();
	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	DECLARE_MESSAGE_MAP()
public:
	CListCtrl lstView;
	afx_msg void OnBnClickedOk();
	afx_msg BOOL OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct);
	bool MsgType[5]{ // 意思看使用它的代码
		true, true, false, false, false
	};
	wchar_t MsgName[5][0xFF]{// 意思看使用它的代码
		L"发送",
		L"接收",
		L"发送解析",
		L"接收解析",
		L"日志"
	};
	/*
		0 发送数据
		1 接收数据
		2 发送数据解析
		3 接收数据解析
		4 日志
	*/
	BOOL Pause;
	afx_msg void OnBnClickedCheck1();
};

CAnly.cpp文件的修改:修改了 SendData函数

#include "pch.h"
#include "CAnly.h"
#ifdef Anly
LRESULT CAnly::SendData(int type, unsigned MsgType, void* buff, unsigned len)
{

	typedef struct COPY_DATA {
		time_t ltime; // 时间
		unsigned MsgType; // 数据类型
		unsigned len; // 数据长度
		char buff[0x2000]; // 数据
	}*PCOPYDATA;

	COPY_DATA tmp;
	time(&tmp.ltime);
	tmp.MsgType = MsgType;
	tmp.len = len;
	memcpy(tmp.buff, buff, len);

    HWND hWnd = FindWindow(L"#32770", L"DataAnly");
	COPYDATASTRUCT copydata{};
	copydata.dwData = type;
	copydata.cbData = len + 16;
	copydata.lpData = &tmp;
    if (hWnd) {
        //MessageBoxA(0, "222222222222", "0", MB_OK);
        return SendMessage(hWnd, WM_COPYDATA, 0, (LPARAM)&copydata);
    }
    return 0;
}
#endif

CAnly.cpp文件的修改:新加 COPY_DATA结构体

#define Anly
#ifdef Anly
#pragma once
typedef struct COPY_DATA {
	time_t ltime; // 时间
	unsigned MsgType; // 数据类型
	unsigned len; // 数据长度
	char buff[0x2000]; // 数据
}*PCOPYDATA;
class CAnly
{
public:
	LRESULT SendData(int type, unsigned MsgType, void* buff, unsigned len);
};
#endif

GameWinSock.cpp文件的修改:修改了 OnSend函数、OnRecving函数

#include "pch.h"
#include "GameWinSock.h"
#include "extern_all.h"

GameWinSock::PROC GameWinSock::_OnConnect{};
GameWinSock::PROC GameWinSock::_OnSend{};
GameWinSock::PROC GameWinSock::_OnRecv{};
// 这个函数拦截了游戏的连接
bool GameWinSock::OnConnect(char* ip, unsigned port)
{
    // this是ecx,HOOK的点已经有ecx了
    WinSock = this;
	bool b = (this->*_OnConnect)(ip, port);
	// 下方注释的代码时为了防止多次注入,导致虚函数地址不恢复问题导致死循环,通过一次性HOOK也能解决
	/*unsigned* vtable = (unsigned*)this;
	vtable = (unsigned*)vtable[0];
	union {
		unsigned value;
		bool(GameWinSock::* _proc)(char*, unsigned);
	} vproc;

	vproc._proc = _OnConnect;

	DWORD oldPro, backProc;
	VirtualProtect(vtable, 0x10x00, PAGE_EXECUTE_READWRITE, &oldPro);
	vtable[0x34 / 4] = vproc.value;
	VirtualProtect(vtable, 0x10x00, oldPro, &backProc);*/

    return b;
}

bool GameWinSock::OnSend(char* buff, unsigned len)
{
	
	/*
		这里就可以监控游戏发送的数据了
	*/
#ifdef  Anly
	anly->SendData(0, 0, buff, len);
#endif
	return (this->*_OnSend)(buff, len);
}

bool GameWinSock::OnRecving(char* buff, unsigned len)
{
	// MessageBoxA(0, "11111111111111", "0", MB_OK);
	/*
		监控游戏接收的数据包
	*/
#ifdef  Anly
	anly->SendData(1, 0, buff, len);
#endif
	return true;
}

bool GameWinSock::OnRecv(char* buff, unsigned len)
{
//#ifdef  Anly
//	anly->SendData(1, buff, len);
//#endif
	return (this->*_OnRecv)(buff, len);
}

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

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

相关文章

京东商品优惠券API获取商品到手价

item_get_app-获得JD商品详情原数据 公共参数 请求地址: jd/item_get_app 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,i…

Git 指令深入浅出【2】—— 分支管理

Git 指令深入浅出【2】—— 分支管理 分支管理1. 常用分支管理指令2. 合并分支合并冲突合并模式 3. 实战演习 分支管理 1. 常用分支管理指令 # 查看本地分支 git branch# 查看远程分支 git branch -r# 查看全部分支 git branch -aHEAD 指向的才是当前的工作分支 # 查看当前分…

源码的角度分析Vue2数据双向绑定原理

什么是双向绑定 我们先从单向绑定切入&#xff0c;其实单向绑定非常简单&#xff0c;就是把Model绑定到View&#xff0c;当我们用JavaScript代码更新Model时&#xff0c;View就会自动更新。那么双向绑定就可以从此联想到&#xff0c;即在单向绑定的基础上&#xff0c;用户更新…

win中删除不掉的文件,火绒粉碎删除亲测有效

看网上的 win R 然后终端输入什么删除的&#xff0c;照做了都没有删掉 有火绒的可以试试&#xff1a; 拖进去就删掉了 很好使

开源项目_代码生成项目介绍

1 CodeGeeX 系列 1.1 CodeGeeX 项目地址&#xff1a;https://github.com/THUDM/CodeGeeX 7.6k Star主要由 Python 编写深度学习框架是 Mindspore代码约 2.5W 行有 Dockerfile&#xff0c;可在本地搭建环境模型大小为 150 亿参数相对早期的代码生成模型&#xff0c;开放全部代…

【PCL】 (十六)点云距离图可视化

&#xff08;十六&#xff09;点云距离图可视化 以下代码实现点云及其对应距离图的可视化。 数据样例&#xff1a;sphere100.pcd range_image_visualization.cpp #include <iostream>#include <pcl/range_image/range_image.h> #include <pcl/io/pcd_io.h&g…

CHI协议学习

原始文档&#xff1a;https://developer.arm.com/documentation/102407/0100/?langen CHI 总线拓扑结构 CHI总线拓扑是实现自定义的&#xff0c;可以是RING/MESH/CROSSBAR的类型&#xff1b; RING 一般适用于中等规模芯片MESH 一般适用于大规模芯片CROSSBAR 一般适用于小规模…

30天JS挑战(第十五天)------本地存储菜谱

第十五天挑战(本地存储菜谱) 地址&#xff1a;https://javascript30.com/ 所有内容均上传至gitee&#xff0c;答案不唯一&#xff0c;仅代表本人思路 中文详解&#xff1a;https://github.com/soyaine/JavaScript30 该详解是Soyaine及其团队整理编撰的&#xff0c;是对源代…

11.互信息-机器学习模型性能的常用的评估指标

互信息&#xff08;Mutual Information&#xff09;是机器学习中常用的一种评估指标&#xff0c;特别是在无监督学习和聚类分析中。它用于衡量两个随机变量之间的相关性或相似性。 定义 给定两个随机变量X和Y&#xff0c;它们的互信息I(X;Y)定义如下&#xff1a; 其中&…

命名空间(namespace)

定义 在C中&#xff0c;命名空间&#xff08;Namespace&#xff09;是一个特性&#xff0c;用于封装代码并避免名称冲突。命名空间可以看作是一个容器&#xff0c;其中可以包含类、函数、变量、常量、其他命名空间等。通过使用命名空间&#xff0c;我们可以更好地组织代码&…

linux gdb 调试工具

1.写程序 首先&#xff0c;我们先写出一个 .c 或者.cpp程序 如 然后 gcc -g hello.c -o hello 或者 g -g hello.cpp -o hello &#xff08;-g&#xff09;要加 2. gdb调试 用 gdb &#xff08;可执行程序&#xff0c;如hello&#xff09; 进入之后&#xff0c;有…

redis实战笔记汇总

文章目录 1 NoSQL入门概述1.1 能干嘛&#xff1f;1.2 传统RDBMS VS NOSQL1.3 NoSQL数据库的四大分类1.4 分布式数据库CAP原理 BASE原则1.5 分布式集群简介1.6 淘宝商品信息的存储方案 2 Redis入门概述2.1 是什么&#xff1f;2.2 能干嘛&#xff1f;2.3 怎么玩&#xff1f;核心…

《幻兽帕鲁》游戏对服务器性能的具体要求是什么?

《幻兽帕鲁》游戏对服务器性能的具体要求是什么&#xff1f; CPU&#xff1a;官方最低要求为i5-3570K&#xff0c;但在多人游玩时可能会有明显卡顿。此外&#xff0c;还有建议选择4核或更高性能的处理器&#xff0c;以确保游戏运行流畅。 内存&#xff1a;对于不同人数的联机&…

LL-34/DO-213AC/MiniMELF/NSMC/DO-213AB封装

最近在找几个特殊的二极管封装&#xff0c;能查到资料太少了&#xff0c;如同大海捞针&#xff0c;好不容易找到了一些资料&#xff0c;把相关信息总结一下. 1、LL-34/DO-213AC/MiniMELF/SOD80这三个封装尺寸很接近 LL-34以c5345992为例 MiniMELF以c131658为例 2、NSMC这个封装…

盘点3个正规靠谱的赚钱软件,作为副业,空闲时间发小财

随着移动互联网的蓬勃发展&#xff0c;手机成为了我们生活中不可或缺的一部分&#xff0c;更是赚钱的新工具。然而&#xff0c;面对琳琅满目的赚钱软件&#xff0c;如何挑选出那些既靠谱又正规的平台呢&#xff1f;接下来&#xff0c;我将为大家揭秘几款备受推崇的赚钱软件。 1…

20240304-1-操作系统

操作系统 知识体系 Questions 1.进程和线程的区别 进程是系统进行资源分配和调度的基本单位&#xff1b;线程是CPU调度和分派的基本单位。 每个进程都有独立的代码和数据空间&#xff08;程序上下文&#xff09;&#xff0c;程序之间的切换会有较大的开销&#xff1b;线程可…

#QT(智能家居界面-界面切换)

1.IDE&#xff1a;QTCreator 2.实验 3.记录 &#xff08;1&#xff09;创建一个新界面&#xff08;UI界面&#xff09; &#xff08;2&#xff09;可以看到新加入一个ui文件&#xff0c;双击打开&#xff0c;设置窗口大小与登录界面一致 &#xff08;3&#xff09;加入几个PUS…

使用echarts生成颜色渐变曲线图

效果图: 1、安装echarts npm install echarts --save2、全局注册组件 import * as echarts from echarts; Vue.prototype.$echarts echarts3、结构 附: 计算显示日期的工具文件 /** 计算月份显示* param {} * returns {}*/export function getLastFiveMonths() {let date…

【Python】进阶学习:pandas--read_excel()函数的基本使用

【Python】进阶学习&#xff1a;pandas–read_excel()函数的基本使用 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希…

【Mybatis】动态语句 第三期

文章目录 *一、if和where标签二、set标签三、trim标签四、choose/when/otherwise标签*五、foreach标签 ( 批量操作六、sql片段 *一、if和where标签 如果传入属性&#xff0c;就判断相等。不传入不加对应的条件。 if 判断传入的参数&#xff0c;最终是否添加语句 test 属性 &am…