关于魔兽T人和延迟的恶劣挂原理及实现

现如今在平台打魔兽,全图泛滥,基本上每一把都有好几个开图的,而且好多主机开延迟挂 T人挂,非常恶劣的行为,打不过开挂T人....

从魔兽机制上讲,是没办法防止主机踢人的,你跟主机连接,主机就可以获取你的IP地址和端口,断开你连接没办法。

我对其中踢人和延迟比较感兴趣,所以自己编写着试了试,完全乃杀人放火之必备利器!

延迟挂和T人挂原理都差不多,延迟就是在IP数据包发送之前,加个延迟函数sleep(),然后再把数据包返回给你,

这样就造成你比如释放技能,要过好久才有反应,如果延迟比较高,则直接掉线;

而T人则直接断开你的连接,就造成掉线了。

魔兽通过winsocket 传输数据,使用的是 wsock32.dll 我们可以HOOK "send" 和 "sendto",在WSPRecv()上做手脚;

比如要延迟玩家,可以Sleep()几秒后再把数据发送出去。

int WSPAPI WSPRecv(  
                   SOCKET           s,  
                   LPWSABUF     lpBuffers,  
                   DWORD            dwBufferCount, 
                   LPDWORD          lpNumberOfBytesRecvd,  
                   LPDWORD          lpFlags,  
                   LPWSAOVERLAPPED  lpOverlapped,  
                   LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,  
                   LPWSATHREADID    lpThreadId,  
                   LPINT            lpErrno  
                   )  
{  
    int     iError;  
    int iRet;  
    //判断如果开启全部延迟 则全部延迟  
    if(g_AllToBlock)  
    {  
        Sleep(g_DelaySec);    
    }  
    else if(g_IsDelay)  
    {  
        //s_Socket里面存的是玩家的Socket 判断如果不为null 则延迟  
        for (int i=0;i<10;i++)  
        {  
            if(s_Socket[i]!=NULL && s==s_Socket[i])  
                Sleep(g_DelaySec);   
        }   
    }  
    return g_NextProcTable.lpWSPRecv(s, lpBuffers, dwBufferCount, lpNumberOfBytesRecvd, lpFlags, lpOverlapped  
        , lpCompletionRoutine, lpThreadId, lpErrno);  
} 

然后我们可以拦截WSPSend()函数来得到聊天信息,判断是否开启踢人和延迟;

int WSPAPI WSPSend(
				   SOCKET			s,
				   LPWSABUF		lpBuffers,
				   DWORD			dwBufferCount,
				   LPDWORD			lpNumberOfBytesSent,
				   DWORD			dwFlags,
				   LPWSAOVERLAPPED	lpOverlapped,
				   LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
				   LPWSATHREADID	lpThreadId,
				   LPINT			lpErrno
				   )
{
	unsigned char * bp=(unsigned char *)lpBuffers->buf;
	DWORD i=0;
	BOOL flag=TRUE;
	u_long bufferlen=lpBuffers->len;
	int		iError;

	if(*(bp+i) == 0xf7)
	{
		if(*(bp+i+1) == 0x0F)
		{			
			if(*(bp+i+12)=='-' )
			{
				if(*(bp+i+13)=='d' && *(bp+i+14)=='e'&& *(bp+i+15)=='l' && *(bp+i+16)=='a' && *(bp+i+16)=='y')
				{ 
					g_DelaySec= 2000;//延迟2000毫秒
					AddSocket(s); 	 //把该玩家Socket存到数组里面
					g_IsDelay=TRUE;  
				}
				else if( *(bp+i+13)=='a' && *(bp+i+14)=='g')
				{ 	
					g_DelaySec =2000;
					g_AllToBlock=TRUE;   			
				}
				return 0;
			}
			
		}
	} 
	return g_NextProcTable.lpWSPSend(s, lpBuffers, dwBufferCount, lpNumberOfBytesSent, dwFlags, lpOverlapped
		, lpCompletionRoutine, lpThreadId, lpErrno);
}

我在BreezeMH V2.5的基础上编写了延迟功能,测试开启延迟,对方根本没办法玩!

  聊天输入-ag延迟全部玩家 连续打几次 -ag 全部掉线  加分或VS显示‘游戏由于网络异常结束’

  私聊-laji 延迟对方  延迟毫秒数可以在配置文件修改 点击托盘的M图标打开配置文件 修改默认延迟毫秒  如果需要对方掉线 请在配置文件把默认延迟毫秒设置高点

  随便找个人私聊 -jia 增加延迟 -jian 减少延迟  每次加减延迟毫秒可以在配置文件修改

  聊天输入-as 取消所有延迟  为了防止打错命令 所有“-”开头的命令对方都看不到

以下是软件的下载地址:
https://files.cnblogs.com/intcry/%E4%BC%98%E5%8C%96%E7%89%88.rar

此软件仅供学习交流使用

作者:Crazy Ma
出处:http://www.cnblogs.com/intcry
♪:30%的技术+70%的精神,帮助别人得到他想要的,你就能得到你想要的! ♪

原文地址:https://www.cnblogs.com/intcry/p/2159524.html