关于WSADuplicateSocket的理解~(整理)
WSADuplicateSocket这个函数网上有少部分人问它的用法,其实它就是
int WSADuplicateSocket( __in SOCKET s, __in DWORD dwProcessId, __out LPWSAPROTOCOL_INFO lpProtocolInfo );
很明显就是把s,processId里面的部分值copy到ProtocolInfo里面,如果是指针就copy地址~
下面转载一篇关于这个函数的好文`
有过脱机外挂编写经历的童鞋们大概都会遇到一个很纠结的问题,现在大多数游戏都要求客户端每几秒给服务器发送一个数据包以确定是否掉线,这样一来在调试程序的时候,无论是对客户端的逆向调试,还是对自己外挂的调试,一旦下了断点程序暂停后,如果不能在短短的几秒中恢复程序运行,那么游戏就会掉线。
在彩虹岛中,心跳包的发送间隔是10秒,我发誓这个问题困扰了我两年。。
比较容易想到的是,看有没有办法能直接截取数据链路层的raw packets,再看看有没有API,或者直接操作网卡驱动来模拟封包。然而这对计算机网络知识要求很高,并且貌似Windows下raw packets的操作很少很少,并且有各种各样的安全限制(防止有人乱发包)。这个设想至今没有能够实现。
今天上课时突然想到一个点子。socket在Windows中是个文件句柄(不严格的),那么是否子进程能够继承这个句柄而做到由子进程来按时发送心跳包。这样就不会造成调试时“心跳暂停”了。
Google以后发现,socket是可以通过DuplicateHandle复制后继承的。但是MSDN给出了一种更好的多进程共享socket的方法,那就是使用WSADuplicateSocket。
查阅MSDN:http://msdn.microsoft.com/en-us/library/ms741565(VS.85).aspx
利用WSADuplicateSocket,socket更是一种共享,而不简单是继承了,亦即任何的进程之间均可共享socket。使用的方法也很简单,源进程对要共享的socket调用WSADuplicateSocket,将返回的WSAPROTOCOL_INFO结构体传递给目标进程,然后目标进程用这个结构体调用WSASocket创建一个新的socket描述符,这个socket即指向原来的socket。
需要注意的是,每次生成的WSAPROTOCOL_INFO结构只能用于创建一次共享socket。另外就是不要Windows并没有对共享socket有IO访问控制的机制,这意味这如果在新的socket上调用recv,那么原程序就没法再recv了;如果两个程序同时调用了send而没有执行同步机制,那么send的数据也将会是乱掉的。事实上,无论在linux还是Windows上,socket的共享目的主要在于父进程accept连接,然后子进程负责通讯。
我在LibCHD中写了个测试,在Socket类的connect和disconnect中分别加入以下代码:
//Connect
#ifdef USE_HELPER_PING
PROCESS_INFORMATION ProcessInformation;
char cmdLine[128];
sprintf(cmdLine, "pinghelper.exe %d %d", GetCurrentProcessId(), (int)&ProtocolInfo);
STARTUPINFO si = {sizeof(STARTUPINFO)};
CreateProcess(NULL, cmdLine, NULL, NULL, NULL, CREATE_SUSPENDED, NULL, NULL, &si, &ProcessInformation);
hPingProcess = ProcessInformation.hProcess;
WSADuplicateSocket(m_fd, ProcessInformation.dwProcessId, &ProtocolInfo);
ResumeThread(ProcessInformation.hThread);
CloseHandle(ProcessInformation.hThread);
#endif
//Disconnect
#ifdef USE_HELPER_PING
TerminateProcess(hPingProcess, -1);
CloseHandle(hPingProcess);
#endif
然后新建一个工程,命名为pinghelper,代码如下:
#include <WinSock2.h>
#include <Windows.h>
#include <ShellAPI.h>
INT WINAPI WinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in_opt LPSTR lpCmdLine, __in int nShowCmd )
{
DWORD PID;
WSAPROTOCOL_INFO *lpRemoteProtocolInfo;
WSAPROTOCOL_INFO LocalProtocolInfo;
WSADATA wsaData;
int argc;
WCHAR **argv = CommandLineToArgvW(GetCommandLineW(), &argc);
PID = _wtoi(argv[1]);
lpRemoteProtocolInfo = (WSAPROTOCOL_INFO *)_wtoi(argv[2]);
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID);
ReadProcessMemory(hProcess, lpRemoteProtocolInfo, &LocalProtocolInfo, sizeof(WSAPROTOCOL_INFO), NULL);
WSAStartup(0x202, &wsaData);
SOCKET fd = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, &LocalProtocolInfo, 0, 0);
while (WaitForSingleObject(hProcess, 10000) == WAIT_TIMEOUT)
{
char Data[12] = {12, 0, 3 ,0, 0, 0, 0, 0, 0, 0, 0, 0};
send(fd, Data, 12, 0);
}
closesocket(fd);
WSACleanup();
CloseHandle(hProcess);
return 0;
}
这样就实现了即便暂停程序的运行,依然能够保持与服务器的连接。
在客户端程序里也可以通过Dll注入来做到逆向时不掉线,甚至能做到将正在运行的游戏“替换”成脱机外挂,然后将游戏关掉而不掉线。
从Google的结果来看,目前外挂开发中鲜有共享socket的技术文档,仅仅在某几个Pascal写的脱机外挂的源代码中出现过。希望这篇文章能给大家一些帮助。GMSJ0001@GMSJ.ORG首发,转载请注明出处~
关于WSADuplicateSocket的理解~(整理)相关推荐
- 2021秋招-机器阅读理解整理
机器阅读理解整理 经典模型整理 笔记 后Bert时代机器阅读理解 后续 自己论文整理 已经分类整 大的实验室: UCL MRC_Group: AI2: 微软: THU: PKU: 数据集文章 ROPE ...
- OpenGL中的上下文 理解整理
OpenGL中的上下文(Context) OpenGL状态机与上下文 OpenGL是一个状态机,它拥有非常多的状态变量,并且每个状态变量都有默认值. OpenGL在渲染的时候需要一个Context来记 ...
- linux分区理解整理
linux分区理解: 1. /boot 分区, 跟启动有关的分区,放在启动易硬盘上,不要让系统找的太艰难. 2. /swap 分区, 跟windows的虚拟物理内存功能相同,一般设为内存的一倍至两倍. ...
- 关于WSADuplicateSocket的理解
转自:http://blog.csdn.net/qq276592716/article/details/6760283 WSADuplicateSocket这个函数网上有少部分人问它的用法,其实它就是 ...
- Android SurfaceFlinger中Fence机制--个人理解整理
1 Fence 是什么? Fence中文是栅栏/围墙的意思,理解成分界/界限的东西.android中的一个资源锁机制.(i.e. a kind of memory barrier) 下面链接是engl ...
- spark中stage的划分与宽依赖/窄依赖(转载+自己理解/整理)
[1]宽依赖和窄依赖,这是Spark计算引擎划分Stage的根源所在,遇到宽依赖,则划分为多个stage,针对每个Stage,提交一个TaskSet: 上图:一张网上的图: (个人笔记,rdd中有多个 ...
- OPenGL 基本知识(根据自己理解整理)
1.坐标系 计算机利用OpenGL可以把三维世界中的三维物体,在二维屏幕上显示出来.如下图(来源于网络): OpenGL图形渲染管线(Pipeline)学习 一部摄像机放在视椎体的顶部,也就是视椎体四 ...
- 前端知识及项目中常用的的概念和个人理解整理分享-1(其它前端知识可来我的博客主页查看o,有高见的时候,可以密我哦)
1.Vue的核心概念:数据驱动(双向数据绑定),组件复用(降低重复开发,简化开发): 2.关于v-model指令:实现MVVM思想的核心指令,双向数据绑定,即数据发生变化,同步视图,视图发生变化,同步 ...
- Oracle 表分区的理解整理
1.表空间及分区表的概念 表空间:是一个或多个数据文件的集合,所有的数据对象都存放在指定的表空间中,但主要存放的是表,所以称作表空间. 分区表:当表中的数据量不断增大,查询数据的速度就 ...
最新文章
- Gut:刘星吟/王益超/曹爱华等揭示孤独症患儿肠道菌群发育轨迹图谱(赵方庆点评)...
- #2006 - MySQL server has gone away 问题解决方法 (全) (转)
- 【深度学习】基于Pytorch进行深度神经网络计算(二)
- 笔记-项目管理ITTO-高项/PMP第五版-全
- 前端常见知识点四之webscoket
- chromium浏览器_微软将全面向Windows 10用户推送Chromium版Edge浏览器
- chrome开启touch屏幕点击事件
- mysql触发器不起作用 navicat的bug?
- 三、bootstrap4 组件(警告和提示框、徽章和面包屑、按钮按钮组、卡片、列表组、导航和选项卡、分页和进度条、巨幕和旋转图标、轮播图、折叠菜单、下拉菜单、导航条、滚动监听、轻量弹框、模态框、表单)
- 微信上线“拍一拍”功能,结果被网友激情吐槽...
- Leecode刷题热题HOT100(4)——寻找两个正序数组的中位数
- 卡巴2009与word冲突完美解决方案,经测试几十台计算机全部通过
- 计算机基础教学模式,计算机基础行动导向教学模式的应用
- volatile工作原理学习总结
- 阅读学术论文的心得体会
- css-对号/叉号(纯css)
- CVE-2018-1273漏洞复现
- GAN_1——基础知识
- 超多面试题合集,来瞅瞅你碰到了几道题~
- iOS_计步_获取运动与健康