29.网络游戏逆向分析与漏洞攻防-网络通信数据包分析工具-数据推测功能的算法实现

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

如果看不懂、不知道现在做的什么,那就跟着做完看效果

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

上一个内容:28.数据推测结果用提示框的形式显示

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

码云版本号:1e568175a741f03990b7df078aa6e2bc138bfb2d

代码下载地址,在 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的分享

28.数据推测结果用提示框的形式显示它的代码为基础进行修改

效果图:

CWndData.h文件的修改:新加 TimeToTxt函数

#pragma once// CWndData 对话框class CWndData : public CDialogEx
{DECLARE_DYNAMIC(CWndData)public:CWndData(CWnd* pParent = nullptr);   // 标准构造函数virtual ~CWndData();// 对话框数据
#ifdef AFX_DESIGN_TIMEenum { IDD = IDD_DIALOG1 };
#endifprotected:virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持DECLARE_MESSAGE_MAP()
public:CEdit m_Edit;HWND hTips{};virtual BOOL OnInitDialog();void loops(HWND, UINT, CWndData* _this, DWORD);void ShowTips();CString lastTxt;CString TimeToTxt(time_t* _tm);// 事件类型转字符串
};

CWndData.cpp文件的修改:新加 TimeToTxt函数,修改了 ShowTips函数,tips变量声明位置

// CWndData.cpp: 实现文件
//#include "pch.h"
#include "DataAnly.h"
#include "CWndData.h"
#include "afxdialogex.h"// CWndData 对话框IMPLEMENT_DYNAMIC(CWndData, CDialogEx)CWndData::CWndData(CWnd* pParent /*=nullptr*/): CDialogEx(IDD_DIALOG1, pParent)
{}CWndData::~CWndData()
{
}void CWndData::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);DDX_Control(pDX, IDC_EDIT1, m_Edit);
}BOOL CWndData::OnInitDialog()
{/*为了处理数据方便,我要给定时器一个成员函数然后成员函数它不满足 TIMERPROC 这个类型,编译器也不让我们强制转换所以要用一个联合体封装一下,联合体里的变量都共用一个内存内存大小由联合体里最大的变量决定*/union {TIMERPROC _address;void (CWndData::* _classProc)(HWND, UINT, CWndData*, DWORD);}v;v._classProc = &CWndData::loops;CDialogEx::OnInitDialog();//hTips = 0;/*定时器执行的函数stdcall,让它调用的函数是类的成员函数定时器调用的时候可能不会有this(也就是ecx的值不是类对象地址)所以这里要手动的把this传递过去这样可以方便在函数里对数据进行操作*/ ::SetTimer(m_hWnd, (UINT_PTR)this, 100, v._address);return TRUE;
}void CWndData::loops(HWND, UINT, CWndData* _this, DWORD)
{int nstart = 0;// 选中的内容起始下标int nend = 0; // 选中的内容结束下标_this->m_Edit.GetSel(nstart, nend); // 获取选中的文字int ncount = nend - nstart;if (ncount > 1) {CString txt;CString tmp;_this->m_Edit.GetWindowText(txt); // 获取编辑框里的内容tmp = txt.Mid(nstart, ncount);tmp.Replace(L" ", L""); // 把空格替换成空字符if (_this->lastTxt != tmp) {int lenth = tmp.GetLength();if (lenth % 2 == 0) { // 必须是2的倍数,如果不是就说明没有选择全_this->lastTxt = tmp;_this->ShowTips();}}}
}TOOLINFO tips; // 提示框结构体void CWndData::ShowTips()
{tips.cbSize = sizeof(tips);// 固定写法,也就是必须这样写,必须有这一句unsigned char ExDataBuff[0x1000]{};int ilenth = lastTxt.GetLength() / 2; // 字符串是用2字节显示一个内容if (ilenth<=0) {}CString tmp;for (int i = 0; i < ilenth; i++) {tmp = lastTxt.Mid(i*2, 2);// 这里的Mid函数的意思是从i*2下标位置往后取2个字符// wcstol函数降字符串转成long类型,这里将字符转成16进制的long类型ExDataBuff[i] = (unsigned char)wcstol(tmp, NULL, 16);}wchar_t* wBuff = (wchar_t*)ExDataBuff;CStringA Buff = (char*)ExDataBuff;time_t* _time;long long* llRead;double* dbRead;int* ntRead;float* fRead;short* stRead;CString txtUnicode, txtAscii,txttm, txtll, txtdb, txtnt, txtfloat, txtst,tmpR;txtUnicode.Format(L"%s", wBuff);txtAscii = Buff;// tmp.Format(L"\r\nUTF16:%s\r\nAscII:%s", wBuff, aBuff.GetBuffer());for (INT i = 0; i < ilenth; i++){// 推测8字节数据if ((ilenth - i > 7)&&(i%8==0)) {llRead = (long long*)&ExDataBuff[i];dbRead = (double*)&ExDataBuff[i];_time = (time_t*)&ExDataBuff[i];tmpR.Format(L"[%i64d]", llRead[0]);txtll += tmpR;tmpR.Format(L"[%1f]", dbRead[0]);txtdb += tmpR;tmpR.Format(L"[%s]", TimeToTxt(_time));txttm += tmpR;}// 推测4字节数据if ((ilenth - i > 3) && (i % 4 == 0)) {fRead = (float*)&ExDataBuff[i];ntRead = (int*)&ExDataBuff[i];tmpR.Format(L"[%d]", ntRead[0]);txtnt += tmpR;tmpR.Format(L"[%f]", fRead[0]);txtfloat += tmpR;}// 推测2字节数据if ((ilenth - i > 1) && (i % 2 == 0)) {stRead = (short*)&ExDataBuff[i];tmpR.Format(L"[%d]", stRead[0]);txtst += tmpR;}}if (txttm != "")tmp = tmp + L"\r\n[time]" + txttm;if (txtll != "")tmp = tmp + L"\r\n[int64]" + txtll;if (txtdb != "")tmp = tmp + L"\r\n[double]" + txtdb;if (txtfloat != "")tmp = tmp + L"\r\n[float]" + txtfloat;if (txtnt != "")tmp = tmp + L"\r\n[int]" + txtnt;if (txtst != "")tmp = tmp + L"\r\n[short]" + txtst;tmp = L"";int imax = txtUnicode.GetLength();if (imax > 0) {tmp = tmp + L"\r\n[Utf16]:" + txtUnicode;imax += 8;}int icount = txtAscii.GetLength();if (icount > 0) {tmp = tmp + L"\r\n[Ascii]:" + txtAscii;icount += 8;if (icount > imax) {imax = icount;}}icount = txttm.GetLength();if (icount > 0) {tmp = tmp + L"\r\n[time]:" + txttm;icount += 7;if (icount > imax) {imax = icount;}}icount = txtll.GetLength();if (icount > 0) {tmp = tmp + L"\r\n[int64]:" + txtll;icount += 8;if (icount > imax) {imax = icount;}}icount = txtdb.GetLength();if (icount > 0) {tmp = tmp + L"\r\n[double]:" + txtdb;icount += 9;if (icount > imax) {imax = icount;}}icount = txtfloat.GetLength();if (icount > 0) {tmp = tmp + L"\r\n[float]:" + txtfloat;icount += 8;if (icount > imax) {imax = icount;}}icount = txtnt.GetLength();if (icount > 0) {tmp = tmp + L"\r\n[int]:" + txtnt;icount += 6;if (icount > imax) {imax = icount;}}icount = txtst.GetLength();if (icount > 0) {tmp = tmp + L"\r\n[short]:" + txtst;icount += 8;if (icount > imax) {imax = icount;}}CString _head('=', imax);_head = _head + tmp;tips.lpszText = _head.GetBuffer();// 设置提示框的内容DWORD lPoint = GetMessagePos();// 获取鼠标位置,GetMessagePos函数返回值是一个DWORD类型,高位是x坐标,低位是y坐标if (!hTips) {/*CreateWindow函数的参数说明:第一个参数是窗口注册的类名,是一个字符串,现在写的 TOOLTIPS_CLASS 是一个提示框的类名,由Windows提供的公共控件由Windows对它们进行 RegisterClass 或 RegisterClassEx操作,所以这里可以直接执行CreateWindow操作第二个参数是窗口名称(就是窗口左上角的文字),由于是提示框用来显示描述的提示框,所以写的NULL第三个参数是正在创建的窗口的样式,详情看MSDN(MSDN是微软文档)(去MSDN里搜索 CreateWindowW或者CreateWindowA)第四个参数是窗口初始水平位置,也就是x坐标第五个参数是窗口垂直位置,也就是y坐标第六个参数是窗口的宽度第七个参数是窗口的高度第八个参数是所创建的窗口的父窗口或所有者窗口的句柄,也就是用来给它指定父窗口第九个参数菜单的句柄,没有菜单所以写0第十个参数是要与窗口关联的模块实例的句柄,这里传递的是AfxGetInstanceHandle函数,它会返回当前程序的句柄第十一个参数是给窗口传递的数据,是一个结构体,详情去MSDN看返回值是创建好的窗口句柄*/hTips = CreateWindow(TOOLTIPS_CLASS, NULL, WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP,0,0,0,0,m_Edit.m_hWnd,0,AfxGetInstanceHandle(), 0);if (hTips) {// 修改窗口,修改的目的是为了防止提示框被其它窗口遮盖,要确保这个提示框要在最顶层::SetWindowPos(hTips, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);/*给提示框发送 TTM_ADDTOOL 消息展示TOOLINFO里的lpszText它的内容详细去MSDN搜索 TTM_ADDTOOL 查看详细介绍SendMessage的第三个参数和第四个参数可以看做成是 TTM_ADDTOOL 宏的第一个参数和第二个参数也就是把 TTM_ADDTOOL它当作函数看待,忽略SendMessage这样的思路去看MSDNTTM_ADDTOOL消息处理Windows已经做好了,只需要按照MSDN文档写的说明去传参就好效果就是设置第二行-第N行的数据*/::SendMessage(hTips, TTM_ADDTOOL, (WPARAM)1, (LPARAM)&tips);/*发送 TTM_SETTITLE 消息,提示框会设置图标和标题,第四个参数是图标,详情去MSDN搜索 TTM_SETTITLEMSDN里面介绍了发送 TTM_SETTITLE 消息时,SendMessage函数第三个参数与第四个参数是什么SendMessage的第三个参数和第四个参数可以看做成是 TTM_SETTITLE 宏的第一个参数和第二个参数TTM_SETTITLE消息处理Windows已经做好了,只需要按照MSDN文档写的说明去传参就好效果就是设置第一行的内容*/::SendMessage(hTips, TTM_SETTITLE, 0, (LPARAM)L"可能的内容");}}if (hTips) {// GetWindowRect(&tips.rect);// 设置提示框提示的文本(或者说是修改文本)::SendMessage(hTips, TTM_UPDATETIPTEXT, (WPARAM)FALSE, (LPARAM)&tips);/*设置提示框的坐标,详细信息去MSDN搜索 TTM_TRACKPOSITION,扩展:MAKELONG宏可以设置高位数据与低位数据使用例子:MAKELONG(500, 50) 500就是高位数据,50就是低位数据MAKELONG宏返回一个DWORD类型(4字节的数字),它的第一个参数是这个4字节数字高位2字节的数据第二个参数是低位2字节的数据效果就是设置显示位置*/::SendMessage(hTips, TTM_TRACKPOSITION, (WPARAM)FALSE, lPoint);/*显示窗口,详细说明还是去MSDN,MSDN操作方式还是搜索 TTM_TRACKACTIVATE说明的看法与上面三个一样(TTM_SETTITLE、TTM_ADDTOOL、HWND_TOPMOST)*/::SendMessage(hTips, TTM_TRACKACTIVATE, (WPARAM)TRUE, (LPARAM)&tips);}
}CString CWndData::TimeToTxt(time_t* _tm)
{CString rt;struct tm newtiem {};localtime_s(&newtiem, _tm); // 获取时间rt.Format(L"%.4d-%.2d-%.2d %.2d:%.2d:%.2d", newtiem.tm_year + 1900, newtiem.tm_mon + 1, newtiem.tm_mday, newtiem.tm_hour, newtiem.tm_min, newtiem.tm_sec);return rt;
}BEGIN_MESSAGE_MAP(CWndData, CDialogEx)
END_MESSAGE_MAP()// CWndData 消息处理程序

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

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

相关文章

智慧公厕对于智慧城市管理的意义

近年来&#xff0c;智慧城市的概念不断被提及&#xff0c;而智慧公厕作为智慧城市管理的重要组成部分&#xff0c;其在监测、管理和养护方面发挥着重要的作用。智慧公厕不仅是城市市容提升的重要保障&#xff0c;还能提升城市环境卫生管理的质量&#xff0c;并有效助力创造清洁…

springBoot项目,无配置中心,怎么实现类似功能

实现EnvironmentPostProcessor import cn.hutool.http.HttpUtil; import org.springframework.boot.SpringApplication; import org.springframework.boot.env.EnvironmentPostProcessor; import org.springframework.boot.env.YamlPropertySourceLoader; import org.springfr…

用electron将vue项目打包成.exe文件【保姆级教程】

用electron将vue项目打包成.exe文件【保姆级教程】 说明&#xff1a; vue2项目&#xff0c;使用的vue-element-admin框架&#xff0c;用electron打包成.exe文件。 1、新建一个文件夹&#xff0c;然后右键打开终端或者cd到这个目录。执行下面的命令&#xff08;最好确认一下gith…

c语言文件操作(中)

目录 1. 文件的顺序读写1.1 顺序读写函数1.2 顺序读写函数的原型和介绍 结语 1. 文件的顺序读写 1.1 顺序读写函数 函数名功能适用于fgetc字符输入函数所有输出流fputc字符输出函数所有输出流fgets文本行输入函数所有输出流fputs文本行输出函数所有输出流fscanf格式化输入函数…

AI+权重衰退

AI权重衰退 1权重衰退2代码实现 2丢弃法 1权重衰退 AI权重衰退是指在人工智能&#xff08;AI&#xff09;领域中的一种技术或方法&#xff0c;用于训练机器学习模型时对权重进行惩罚或调整&#xff0c;以避免过拟合现象的发生。 在机器学习中&#xff0c;过拟合是指模型在训练…

红队笔记7--Web机器为Linuxdocker逃逸

其实&#xff0c;不知道大家有没有想过&#xff0c;我们之前练习的都是web机器是windows的版本&#xff0c;但是其实&#xff0c;在现实生活中&#xff0c;服务器一般都是Linux的版本&#xff0c;根本不可能用到windows的版本 那么如果是Linux的话&#xff0c;我们就有很多的困…

恒创科技:什么是BGP线路服务器?BGP机房的优点是什么?

在当今的互联网架构中&#xff0c;BGP(边界网关协议)线路服务器和BGP机房扮演着至关重要的角色。BGP作为一种用于在自治系统(AS)之间交换路由信息的路径向量协议&#xff0c;它确保了互联网上的数据能够高效、准确地从一个地方传输到另一个地方。那么&#xff0c;究竟什么是BGP…

车载电子电器架构 - 网络拓扑

车载电子电器架构 - 网络拓扑 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师 (Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自己。江湖一碗茶,喝完再挣扎,出门靠…

单点登录:一把钥匙开启所有门

单点登录&#xff08;SSO&#xff09;技术&#xff0c;就像是一把开启企业数字化大门的钥匙&#xff0c;让用户一次登录&#xff0c;随处访问&#xff0c;极大地提升了工作效率和用户体验。具体到技术实现上&#xff0c;当用户首次登录时&#xff0c;SSO系统会进行认证&#xf…

Linux权限维持后门及应急响应

本次应急响应实验用kali和centos7来充当攻击机和靶机 kali&#xff1a;192.168.10.130 centos7&#xff1a;192.168.10.155 前提&#xff1a; 用kali连接到centos7上面ssh root192.168.10.155 一、SSH软链接 任意密码登录即可发现程度&#xff1a;|||||| ln -sf /usr/sbi…

CCleaner清理软件好不好 CCleaner怎么清理运行内存

CCleaner是一款使用简单&#xff0c;功能强大的电脑清理软件&#xff0c;该软件价格低廉&#xff0c;即使是学生也可以承担。那么这个软件究竟怎么样&#xff1f;可以怎么使用呢&#xff1f;下面就来带大家看一看CCleaner清理软件好不好&#xff0c;CCleaner怎么清理运行内存。…

Java-SpringAop 编程式事物实现

SpringAop 编程式事物实现 1. 数据库事物特性 原子性 多个数据库操作是不可分割的&#xff0c;只有所有的操作都执行成功&#xff0c;事物才能被提交&#xff1b;只要有一个操作执行失败&#xff0c;那么所有的操作都要回滚&#xff0c;数据库状态必须回复到操作之前的状态 …

redis-操作数据库

0 序言 一个Redis服务器可以包含多个数据库。在默认情况下&#xff0c;Redis服务器在启动时将会创建16个数据库&#xff1a;这些数据库都使用号码进行标识&#xff0c;其中第一个数据库为0号数据库&#xff0c;第二个数据库为1号数据库&#xff0c;而第三个数据库则为2号数据库…

每日五道java面试题之mybatis篇(一)

目录&#xff1a; 第一题. MyBatis是什么&#xff1f;第二题. ORM是什么?第三题. 为什么说Mybatis是半自动ORM映射工具&#xff1f;它与全自动的区别在哪里&#xff1f;第四题. 传统JDBC开发存在的问题第五题. JDBC编程有哪些不足之处&#xff0c;MyBatis是如何解决这些问题的…

计算机考研|北航北理北邮怎么选?

北航985&#xff0c;北理985&#xff0c;北邮211 虽然北邮事211&#xff0c;但是北邮的计算机实力一点也不弱&#xff0c;学科评级&#xff0c;计算机是A 北航计算机评级也是A&#xff0c;北理的计算机评级是A- 所以&#xff0c;这三所学校在实力上来说&#xff0c;真的大差…

LeetCode 面试经典150题 274.H指数

题目&#xff1a; 给你一个整数数组 citations &#xff0c;其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。 根据维基百科上 h 指数的定义&#xff1a;h 代表“高引用次数” &#xff0c;一名科研人员的 h 指数 是指他&#xff08;她…

DM数据库安装(Linux)

Linux安装 操作系统CPU数据库CentOS7x86_64 架构dm8_20230418_x86_rh6_64 先把压缩包扔过去 新建 dmdba 用户 创建用户所在的组&#xff0c;命令如下&#xff1a; groupadd dinstall 创建用户&#xff0c;命令如下&#xff1a; useradd -g dinstall -m -d /home/dmdba -s /…

由浅到深认识C语言(13):共用体

该文章Github地址&#xff1a;https://github.com/AntonyCheng/c-notes 在此介绍一下作者开源的SpringBoot项目初始化模板&#xff08;Github仓库地址&#xff1a;https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址&#xff1a;https://blog.csdn…

ConKI: Contrastive Knowledge Injection for Multimodal Sentiment Analysis

文章目录 ConKI&#xff1a;用于多模态情感分析的对比知识注入文章信息研究目的研究内容研究方法1.总体结构2.Encoding with Knowledge Injection2.1 Pan-knowledge representations2.2 Knowledge-specific representations 3.Hierarchical Contrastive Learning4.损失函数5.训…

信息检索(十四):Simple Entity-Centric Questions Challenge Dense Retrievers

Simple Entity-Centric Questions Challenge Dense Retrievers 摘要1. 引言2. 背景和相关工作3. EntityQuestions4. 剖析问题&#xff1a;实体 vs 问题模式4.1 密集检索表现出流行偏差4.2 观察问题有助于泛化 5. 迈向稳健的密集检索6. 结论 原文链接&#xff1a;https://aclant…