19.网络游戏逆向分析与漏洞攻防-网络通信数据包分析工具-数据分析工具数据类型配置功能的实现

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!

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

上一个内容:18.数据分析工具数据与消息配置的实现

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

码云版本号:440645b4b825f730ffe847ce06c253820f35f41f

代码下载地址,在 titan 目录下,文件名为:titan-数据分析工具数据类型配置功能的实现.zip

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

提取码:q9n5

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

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

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

提取码:78h8

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

18.数据分析工具数据与消息配置的实现 它的代码为基础进行修改

删除下图中的添加菜单

只保留修改和删除

然后在给第一个菜单下,添加创建消息数据,如下图

添加一个事件处理

新加一个Dialog

控件

设置过的属性

给Dialog添加类

添加变量

消息名称添加变量

数据编号添加变量:txtId

然后发现多了一个数据编号,然后把它给删了,删除之后的Dialog

数据名称添加变量

背景颜色添加变量

字体颜色添加变量

输出到日志文件添加变量:IsTxt

单独输出到文件添加变量:IsTxtAlone

这里漏掉一个选项,输出到列表显示,添加变量 IsShowUI

效果图:

新加CSetData.cpp文件

cpp 复制代码
// CSetData.cpp: 实现文件
//

#include "pch.h"
#include "DataAnly.h"
#include "CSetData.h"
#include "afxdialogex.h"


// CSetData 对话框

IMPLEMENT_DYNAMIC(CSetData, CDialogEx)

CSetData::CSetData(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_SETDATA, pParent)
	, txtName(_T(""))
	, txtId(_T(""))
	, txtDataName(_T(""))
	, txtBackColor(_T(""))
	, txtFontColor(_T(""))
	, IsTxt(FALSE)
	, IsTxtAlone(FALSE)
{

}

CSetData::~CSetData()
{
}

void CSetData::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Text(pDX, IDC_EDIT3, txtName);
	DDX_Text(pDX, IDC_EDIT1, txtId);
	DDX_Text(pDX, IDC_EDIT2, txtDataName);
	DDX_Text(pDX, IDC_EDIT5, txtBackColor);
	DDX_Text(pDX, IDC_EDIT6, txtFontColor);
	DDX_Check(pDX, IDC_CHECK1, IsTxt);
	DDX_Check(pDX, IDC_CHECK2, IsTxtAlone);
	DDX_Control(pDX, IDC_CHECK3, IsShowUI);
}


BEGIN_MESSAGE_MAP(CSetData, CDialogEx)
	ON_BN_CLICKED(IDC_BUTTON1, &CSetData::OnBnClickedButton1)
	ON_BN_CLICKED(IDC_BUTTON6, &CSetData::OnBnClickedButton6)
END_MESSAGE_MAP()


// CSetData 消息处理程序


void CSetData::OnBnClickedButton1()
{
	/*
		颜色选择Dialog对象
	*/
	CColorDialog color;
	color.m_cc.Flags |= CC_RGBINIT;
	/*
		color.DoModal() 打开一个颜色选择对话框
	*/
	if (color.DoModal() == IDOK) {
		txtBackColor.Format(L"%X", color.m_cc.rgbResult);
		UpdateData(false);
	}
}


void CSetData::OnBnClickedButton6()
{
	/*
	颜色选择Dialog对象
*/
	CColorDialog color;
	color.m_cc.Flags |= CC_RGBINIT;
	/*
		color.DoModal() 打开一个颜色选择对话框
	*/
	if (color.DoModal() == IDOK) {
		txtFontColor.Format(L"%X", color.m_cc.rgbResult);
		UpdateData(false);
	}
}

新加CSetData.h文件

cpp 复制代码
#pragma once


// CSetData 对话框

class CSetData : public CDialogEx
{
	DECLARE_DYNAMIC(CSetData)

public:
	CSetData(CWnd* pParent = nullptr);   // 标准构造函数
	virtual ~CSetData();

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

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

	DECLARE_MESSAGE_MAP()
public:
	CString txtName;
	CString txtId;
	CString txtDataName;
	CString txtBackColor;
	CString txtFontColor;
	BOOL IsTxt;
	BOOL IsTxtAlone;
	CButton IsShowUI;
	afx_msg void OnBnClickedButton1();
	afx_msg void OnBnClickedButton6();
};

CSet.cpp文件的修改:修改了 OnSetMsg函数,新加 OnAddDataType函数(它是菜单创建消息数据的鼠标单击处理函数)

cpp 复制代码
// CSet.cpp: 实现文件
//

#include "pch.h"
#include "DataAnly.h"
#include "CSet.h"
#include "afxdialogex.h"
#include "extern_all.h"

// CSet 对话框

IMPLEMENT_DYNAMIC(CSet, CDialogEx)

CSet::CSet(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_SET, pParent)
{

}

CSet::~CSet()
{
}

void CSet::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_LIST1, lstMsgType);
	DDX_Control(pDX, IDC_LIST2, lstDataType);
}

BOOL CSet::OnInitDialog()
{
	CDialogEx::OnInitDialog();
	SetListView(&lstMsgType);
	SetListView(&lstDataType);
	
	lstMsgType.InsertColumn(0, L"名称", 0, 100);
	lstMsgType.InsertColumn(1, L"宏定义", 0, 100);
	lstMsgType.InsertColumn(2, L"类型", 0, 100); // 数据和文本,文本直接显示,数据有点复杂看之后实现位置
	lstMsgType.InsertColumn(3, L"输出到文件", 0, 100);

	lstDataType.InsertColumn(0, L"消息类型", 0, 100);
	lstDataType.InsertColumn(1, L"数据编号", 0, 100);
	lstDataType.InsertColumn(2, L"数据名称", 0, 100);
	lstDataType.InsertColumn(3, L"显示颜色", 0, 100);
	lstDataType.InsertColumn(4, L"输出到文件", 0, 100);
	lstDataType.InsertColumn(5, L"单独输出", 0, 100);

	return TRUE;
}


BEGIN_MESSAGE_MAP(CSet, CDialogEx)
	ON_BN_CLICKED(IDOK, &CSet::OnBnClickedOk)
	ON_BN_CLICKED(IDCANCEL, &CSet::OnBnClickedCancel)
	ON_NOTIFY(NM_RCLICK, IDC_LIST1, &CSet::OnNMRClickList1)
	ON_NOTIFY(NM_RCLICK, IDC_LIST2, &CSet::OnNMRClickList2)
	ON_COMMAND(ID_32771, &CSet::OnAddMsgType)
	ON_COMMAND(ID_32772, &CSet::OnSetMsg)
	ON_COMMAND(ID_32773, &CSet::OnDelMsg)
	ON_COMMAND(ID_32777, &CSet::OnAddDataType)
END_MESSAGE_MAP()


// CSet 消息处理程序


void CSet::OnBnClickedOk()
{
	// TODO: 在此添加控件通知处理程序代码
	CDialogEx::OnOK();
}


void CSet::OnBnClickedCancel()
{
	// TODO: 在此添加控件通知处理程序代码
	CDialogEx::OnCancel();
}

void CSet::OnNMRClickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
	LPNMITEMACTIVATE p = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
	// TODO: 在此添加控件通知处理程序代码
	*pResult = 0;
	nMsgSel = p->iItem;
	/*
		GetMessagePos函数可以,获取光标位置
		返回值低16位是x,高16位是y
	*/
	DWORD dwPos = GetMessagePos();
	CPoint point(LOWORD(dwPos), HIWORD(dwPos));
	CMenu menu;
	menu.LoadMenuW(IDR_MENU1);// 根据菜单窗口id获取一个菜单窗口对象
	CMenu* pop = menu.GetSubMenu(0);// 获取第一个菜单,也就是现在的消息设置这个菜单
	// 在指定位置显示浮动弹出菜单,并跟踪弹出菜单上项的选择情况。
	pop->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y, this);
}


void CSet::OnNMRClickList2(NMHDR* pNMHDR, LRESULT* pResult)
{
	LPNMITEMACTIVATE p = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
	// TODO: 在此添加控件通知处理程序代码
	*pResult = 0;
	
	/*
	GetMessagePos函数可以,获取光标位置
	返回值低16位是x,高16位是y
*/
	DWORD dwPos = GetMessagePos();
	CPoint point(LOWORD(dwPos), HIWORD(dwPos));
	CMenu menu;
	menu.LoadMenuW(IDR_MENU1);// 根据菜单窗口id获取一个菜单窗口对象
	CMenu* pop = menu.GetSubMenu(1);// 获取第一个菜单,也就是现在的消息设置这个菜单
	// 在指定位置显示浮动弹出菜单,并跟踪弹出菜单上项的选择情况。
	pop->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this);
}


void CSet::OnAddMsgType()
{
	if (wndMsgSet.DoModal() == IDOK) {
		lstMsgType.InsertItem(0, wndMsgSet.txtName);
		lstMsgType.SetItemText(0, 1, wndMsgSet.txtDefine);
		lstMsgType.SetItemText(0, 2, wndMsgSet.txtTypeName);
		lstMsgType.SetItemText(0, 3, txtBool[wndMsgSet.IsTxt]);
	}
}


void CSet::OnSetMsg()
{
	if (nMsgSel > -1) {
		
		wndMsgSet.SetDatas(
			lstMsgType.GetItemText(nMsgSel, 0), 
			lstMsgType.GetItemText(nMsgSel, 1), 
			lstMsgType.GetItemText(nMsgSel, 2), 
			lstMsgType.GetItemText(nMsgSel, 3)==L"是"
		);
		if (wndMsgSet.DoModal() == IDOK) {
			lstMsgType.SetItemText(nMsgSel, 0, wndMsgSet.txtName);
			lstMsgType.SetItemText(nMsgSel, 1, wndMsgSet.txtDefine);
			lstMsgType.SetItemText(nMsgSel, 2, wndMsgSet.txtTypeName);
			lstMsgType.SetItemText(nMsgSel, 3, txtBool[wndMsgSet.IsTxt]);
		}
	}
}


void CSet::OnDelMsg()
{
	if (nMsgSel > -1) {
		lstMsgType.DeleteItem(nMsgSel);
	}
}


void CSet::OnAddDataType()
{
	if (nMsgSel > -1) {
		wndDataSet.DoModal();
	}
}

CSet.h文件的修改:新加 OnAddDataType函数,nMsgSel变量

cpp 复制代码
#pragma once
#include "CSetMsg.h"
#include "CSetData.h"

// CSet 对话框

class CSet : public CDialogEx
{
	DECLARE_DYNAMIC(CSet)

public:
	CSet(CWnd* pParent = nullptr);   // 标准构造函数
	virtual ~CSet();

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

protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持	
	// 生成的消息映射函数
	virtual BOOL OnInitDialog();

	DECLARE_MESSAGE_MAP()
public:
	CListCtrl lstMsgType;
	CListCtrl lstDataType;
	afx_msg void OnBnClickedOk();
	afx_msg void OnBnClickedCancel();
	afx_msg void OnNMRClickList1(NMHDR* pNMHDR, LRESULT* pResult);
	afx_msg void OnNMRClickList2(NMHDR* pNMHDR, LRESULT* pResult);
	afx_msg void OnAddMsgType();
public:
	CSetMsg wndMsgSet;
	CSetData wndDataSet;
	CString txtBool[2]{ L"否", L"是" };
	int nMsgSel; // 消息定义列表选中行索引
	afx_msg void OnSetMsg();
	afx_msg void OnDelMsg();
	afx_msg void OnAddDataType();
};

CSetMsg.cpp文件的修改:修改了 SetDatas函数、OnInitDialog函数

cpp 复制代码
// CSetMsg.cpp: 实现文件
//

#include "pch.h"
#include "DataAnly.h"
#include "CSetMsg.h"
#include "afxdialogex.h"


// CSetMsg 对话框

IMPLEMENT_DYNAMIC(CSetMsg, CDialogEx)

CSetMsg::CSetMsg(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_SETMSGTYPE, pParent)
	, IsTxt(FALSE)
	, txtDefine(_T(""))
	, txtName(_T(""))
{

}

CSetMsg::~CSetMsg()
{
}

void CSetMsg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_COMBO1, lstType);
	DDX_Check(pDX, IDC_CHECK1, IsTxt);
	DDX_Text(pDX, IDC_EDIT1, txtDefine);
	DDX_Text(pDX, IDC_EDIT3, txtName);
}

/*
	这个函数每次窗口打开的时候都会调用,这里面写死的值,要确保在更改之前执行
	否则会出现数据不正确的问题
*/
BOOL CSetMsg::OnInitDialog()
{
	CDialogEx::OnInitDialog();
	/*
	  下面的三行代码是给下拉菜单添加选项
		lstType.AddString(L"数据包");
		lstType.AddString(L"文字-ASCII");
		lstType.AddString(L"文字-UTF-16");
	*/
	lstType.AddString(txtNameArys[0]);
	lstType.AddString(txtNameArys[1]);
	lstType.AddString(txtNameArys[2]);
	lstType.SetCurSel(nsel); // 设置下拉菜单默认值
	return TRUE;
}


BEGIN_MESSAGE_MAP(CSetMsg, CDialogEx)
	ON_BN_CLICKED(IDOK, &CSetMsg::OnBnClickedOk)
END_MESSAGE_MAP()


// CSetMsg 消息处理程序


void CSetMsg::OnBnClickedOk()
{
	UpdateData(true);
	txtTypeName = txtNameArys[lstType.GetCurSel()];
	CDialogEx::OnOK();
}

void CSetMsg::SetDatas(CString& _name, CString& _define, CString& _Type, bool _IsTxt)
{
	txtName = _name;
	txtDefine = _define;
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		if (txtNameArys[i] == _Type) {
			break;
		}
	}
	if (i > 2)i = 0;
	IsTxt = _IsTxt;
	nsel = i;
	//lstType.SetCurSel(i);
	// UpdateData(false);
}

CSetMsg.h文件的修改:新加 nsel变量,修改SetDatas函数

cpp 复制代码
#pragma once


// CSetMsg 对话框

class CSetMsg : public CDialogEx
{
	DECLARE_DYNAMIC(CSetMsg)

public:
	CSetMsg(CWnd* pParent = nullptr);   // 标准构造函数
	virtual ~CSetMsg();

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

protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
	virtual BOOL OnInitDialog();
	DECLARE_MESSAGE_MAP()
public:
	CComboBox lstType;
	BOOL IsTxt;
	afx_msg void OnBnClickedOk();
	CString txtDefine;
	CString txtName;
	CString txtTypeName;
	CString txtNameArys[3]{ L"数据包", L"文字-ASCII", L"文字-UTF-16" };
	void SetDatas(CString& _name, CString& _define, CString& _Type, bool _IsTxt);
	int nsel; // 消息定义选中行里的类型列的值
};

相关推荐
Ysjt | 深17 分钟前
C++多线程编程入门教程(优质版)
java·开发语言·jvm·c++
ephemerals__23 分钟前
【c++丨STL】list模拟实现(附源码)
开发语言·c++·list
Microsoft Word38 分钟前
c++基础语法
开发语言·c++·算法
一只小小汤圆1 小时前
opencascade源码学习之BRepOffsetAPI包 -BRepOffsetAPI_DraftAngle
c++·学习·opencascade
legend_jz1 小时前
【Linux】线程控制
linux·服务器·开发语言·c++·笔记·学习·学习方法
嘿BRE2 小时前
【C++】几个基本容器的模拟实现(string,vector,list,stack,queue,priority_queue)
c++
ö Constancy2 小时前
c++ 笔记
开发语言·c++
fengbizhe3 小时前
笔试-笔记2
c++·笔记
徐霞客3203 小时前
Qt入门1——认识Qt的几个常用头文件和常用函数
开发语言·c++·笔记·qt
fpcc3 小时前
redis6.0之后的多线程版本的问题
c++·redis