zoukankan      html  css  js  c++  java
  • 关于魔兽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%的精神,帮助别人得到他想要的,你就能得到你想要的! ♪

  • 相关阅读:
    钉钉outgoing机器人小项目开发
    js根据cookie判断,一天之内只弹出一次弹窗
    js倒计时功能
    jquery的$().each,$.each的区别
    VS代码提示自动高亮
    winform当前屏幕大小
    动态增删改控件
    datagridveiw样式
    sql 语句 提取中文的首字母
    按键监听及重写
  • 原文地址:https://www.cnblogs.com/intcry/p/2159524.html
Copyright © 2011-2022 走看看