当前位置: 首页 > news >正文

40.第二阶段x64游戏实战-封包-添加发包功能

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

本次游戏没法给

内容参考于:微尘网络安全

上一个内容:39.第二阶段x64游戏实战-封包-分析计数器

本次添加发送数据包功能,发送数据包需要使用主线程调用(其它线程可能会有问题)

首先改一下按钮显示的文本,然后鼠标左键双击按钮创建点击时执行的函数

创建发包按钮点击时执行的函数

代码说明

下图红框的代码说明

假设数据包是 3131313131,如下图3131313131到输入框中就变成了字符串,也就是std::string,可以看到内存是33 31 33 31...并不是3131313131了,所以使用 sscanf_s(strCode.c_str(), "%02x", &Pbyte[i / 2]); 把字符串当成十六进制放到Pbyte里进程转换成 3131313131

添加类 GameCall

发包功能逻辑,首先通过点击发包按钮执行 pCall->SendPacket(m_size, Pbyte); 代码

然后SendPacket执行 pMsg->PostFunc((QWORD)PacketAddr, nLen, 0, 0, 0, 0, 0, 0, 0x1001);

然后PostFunc执行SendMessageA发送消息

然后CMessage初始化的时候调用HookMainThread_Begin函数

然后HookMainThread_Begin函数里调用SetWindowsHookEx获取主线程的消息循环

然后SetWindowsHookEx后有消息就会调用CallBackFunction函数,然后在CallBackFunction函数中判断0x1001消息id,在里面调用send函数发送数据包

HHOOK g_HookReturn = NULL;
const DWORD g_MyID = RegisterWindowMessageA("MyMsyCode");
UINT64 g_Ret = 0;
struct stu_Msg
{UINT64 CallAddr = 0;UINT64 argRcx = 0;UINT64 argRdx = 0;UINT64 argR8 = 0;UINT64 argR9 = 0;UINT64 argRsp20 = 0;UINT64 argRsp28 = 0;UINT64 argRsp30 = 0;HANDLE CallEvent = 0;
};
LRESULT CALLBACK CallBackFunction(int nCode, WPARAM wParam, LPARAM lparam)
{CWPSTRUCT* lpArg = (CWPSTRUCT*)lparam;//结构  hwnd message wParam lParamif (nCode == HC_ACTION)//自己进程的消息{if (lpArg->hwnd == m_Hwnd && lpArg->message == g_MyID)//我们自己的消息  {stu_Msg* p_arguments;p_arguments = (stu_Msg*)lpArg->lParam;//MessageBeep(1);switch (lpArg->wParam){case 0x1001: {QWORD Socket = ReadDword64(ReadDword64(ReadDword64(g_GameBase + SOCKET地址) + 0x40 + 0x78 + 8) + 8);BYTE count = ReadByte(ReadDword64(g_GameBase + 发包计数基地址) + 0x7a0);WriteByte(p_arguments->CallAddr + 5, count);WriteByte(ReadDword64(g_GameBase + 发包计数基地址) + 0x7a0, count + 1);//LogA("%p", Socket);send(Socket, (const char*)p_arguments->CallAddr, p_arguments->argRcx, 0);SetEvent(p_arguments->CallEvent);return 1;}}//	PostFuncs(p_arguments->CallAddr,p_arguments->argRcx, p_arguments->argRdx, p_arguments->argR8, p_arguments->argR9, p_arguments->argRsp20, p_arguments->argRsp28, p_arguments->argRsp30);return 1;}}return CallNextHookEx(g_HookReturn, nCode, wParam, lparam);
}void CMessage::HookMainThread_Begin()
{if (m_Hwnd != NULL) {DWORD ndThreadId = GetWindowThreadProcessId(m_Hwnd, NULL);if (ndThreadId != 0){g_HookReturn = 0;g_HookReturn = SetWindowsHookEx(WH_CALLWNDPROC, CallBackFunction, NULL, ndThreadId);if (g_HookReturn != 0) {LogA("主线程成功");}}}}void CMessage::HookMainThread_End()
{UnhookWindowsHookEx(g_HookReturn);
}UINT64 CMessage::PostFunc(UINT64 CallAddr, UINT64 argRcx, UINT64 argRdx, UINT64 argR8, UINT64 argR9, UINT64 rsp20, UINT64 rsp28, UINT64 rsp30, UINT64 id)
{//投递消息让游戏执行函数HANDLE CallEvent = CreateEvent(NULL, TRUE, FALSE, NULL);stu_Msg stuMsg = { CallAddr ,argRcx ,argRdx ,argR8 ,argR9 ,rsp20 ,rsp28 ,rsp30 ,CallEvent };if (!CallEvent) return NULL;::SendMessageA(m_Hwnd, g_MyID, id, (LPARAM)&stuMsg);WaitForSingleObject(CallEvent, 3 * 1000);CloseHandle(CallEvent);return g_Ret;
}
void MyDialog::OnBnClickedButton6()
{CString str, str1;GetDlgItem(IDC_EDIT2)->GetWindowTextA(str1);// 包内容GetDlgItem(IDC_EDIT1)->GetWindowTextA(str);// 包长string str_size = str.GetString();QWORD m_size = stoll(str_size.c_str(), 0, 16);//装换为16进制的整数string str_nr = str1.GetString();byte* Pbyte = new byte[m_size];for (size_t i = 0; i < m_size * 2; i += 2){// 数据包到了输入框中就变成了字符,这里取两个字符,313233,第一次取两个字符就是把31取出来,第二次就是把32取出来string strCode = str_nr.substr(i, 2);// sscanf_s(strCode.c_str(), "%02x", &Pbyte[i / 2]); 第一次把31当成十六进制数,放到Pbyte里// 第二次把32当成十六进制数,放到Pbyte里sscanf_s(strCode.c_str(), "%02x", &Pbyte[i / 2]);}//R_memory((QWORD)Pbyte, m_size);pCall->SendPacket(m_size, Pbyte);
}


img

相关文章:

  • Jadx(开源AVA反编译工具) v1.5.0
  • 40 C 语言日期与时间函数详解:time、ctime、difftime、clock(含 UTC/本地时间转换)
  • ateⅹⅰt()的用法
  • 选择、填空、判断
  • c++经典好题
  • Unicode:如何让用户东方不败和[Family: Man, Woman, Girl, Boy]顺利通过用户名长度检查?
  • 从字节到对象的漂流---JavaIO流篇
  • (46)课68:查看索引 SHOW INDEX FROM 表名;删除索引 DROP INDEX index_name ON 表名;
  • 青藏高原ASTER_GDEM数据集(2011)
  • Office 365下载安装教程(超详细图文教程)从零开始的完整安装指南
  • Nuttx之mm_extend
  • ISO/IEC 14443 防碰撞协议 Type A Type B
  • NIFI在Linux系统中的系统配置最佳实践(性能调优)
  • Shuffle流程
  • 【Linux系统编程】System V
  • 大模型呼叫系统——重塑学校招生问答,提升服务效能
  • 离线部署openstack 2024.1 neutron
  • 曼昆《经济学原理》第九版 第十八章生产要素市场
  • 离线部署openstack 2024.1 nova
  • 火山引擎大模型系列都有什么内容
  • 美国惠尔润滑油官方网站/网络营销的未来发展趋势
  • 2018年做视频网站/网络营销专业怎么样
  • 做百度网站/公司网站域名续费一年多少钱
  • 泉州网站建设网站制作/重庆森林影评
  • 怎样登录建设银行官方网站/怎么弄一个网站
  • 微信网站后期运营怎么做/营销策划咨询机构