记录黑客技术中优秀的内容,传播黑客文化,分享黑客技术精华

360端游终极火力“隐身”、“秒杀”等漏洞解析

2016-03-06 19:55

*原创作者:CoolCmd

免责声明:逆向终极火力纯属娱乐,请勿将文中内容用于非法目的。

0x0前言

之前发过一贴通用D3D游戏降压透视插件,一哥们因为股票被套,用插件玩终极火力解闷,奈何水平太菜光有透视还是被虐,请我帮他整点杀手锏,于是逆向分析之,现如今哥们几天前已解套脱离苦海,与其弃于硬盘,不如整篇文章娱乐大众。

0x02准备工作

终极火力->【链接

OllyDbg->【链接

CoolCmd协议工具->网上搜索或进官方QQ群下载

0x03分析

1、实现游戏明文协议工具

网游客户端与服务端通过协议包通讯,所以协议包是我们挖掘网游漏洞的重要途径,而网游的协议包通常都是加密的,一个能注入并对网游的明文协议直接进行增、改、删等基本操作的工具就成了必备品.

准备的协议工具支持注入NP、HS、XTRAP、XIGNCODE、TP等各式主流反外挂系统保护的各式网游(魔兽、剑灵、LOL等都是OK的,一个插件支持国内网游龙头TX所有自研游戏也OK的),所以针对终极火力我们只需逆向加密接口,按示例填充代码写出插件即可开工.

逆向明文加密函数,常用有效方法如下:
  1、由下向上
  堆栈回溯法,通过send、sendto、WSASend、WSASendTo等相关Api的调用堆栈关系回溯到加密函数.   

   2、由上向下
    以任何一个明文信息为切入点,比如喊话内容或使用物品条件未达成的提示字符串,CE搜索内存定位然后内存断点分析,尤其适用于下层被VM的情况.

 此游戏相对简单,我们用堆栈回溯法即可

加密函数对应汇编代码:

加密函数接口头部.jpg

加密函数调用汇编代码:

调用汇编代码.jpg

加密函数对应原型:

typedef DWORD (__cdecl *TEncryptProc)(DWORD dwBuff,DWORD dwLen,DWORD dwOut,DWORD dwParamB,DWORD dwParamA);

插件中HOOK处理函数如下:

DWORD __cdecl NewEncrypt(DWORD dwBuff,DWORD dwLen,DWORD dwOut,DWORD dwParamB,DWORD dwParamA)
{
TFilterRet FltRet;
g_b_SendFill = true;
//调用滤镜接口,解析序号对应CheckBox创建序号
g_InitIO.Api.FilterOper((char*)(dwBuff),dwLen,2,&FltRet);
if (FltRet.bVis){
if (strlen(FltRet.cName) != 0){
g_InitIO.Api.WriteLog("Send明文",FltRet.cName,(char*)(dwBuff),dwLen,0);
}
else{
g_InitIO.Api.WriteLog("Send明文",CN_PUB_DEFHINT,(char*)(dwBuff),dwLen,0);
}
}
//屏蔽发送则直接返回
if (!FltRet.bCom){
return 1;
}
//调用原发包函数
return OldEncrypt(dwBuff, dwLen, dwOut, dwParamB, dwParamA);
}

全接入效果图:

完整图.jpg

具体接入过程可参考:CoolCmd接入教程(某游戏协议破解及完整可编译插件源码)

2.隐身漏洞

进游戏对战场景后,客户端不停的向服务器发送两个包含角色坐标相关信息的协议包

坐标A(长度0x2A+2):

2A00 02103F00000093CA0000
EEC48442 596C0342 40239A3C
6339000000000000000000000000000000000B02

坐标B(长度0x1E+2):

1E00 0B203F000000CACA000063393C0600000000 
EEC48442 596C0342 40239A3C

做些测试

修改测试:

修改发送封包中的坐标,因客户端不停把客户端内存中实际坐标发向服务器,看不出效果

分析内存角色坐标数据,直接内存修改之,存在角色被拉回的情况,说明服务器做了加速、瞬移类判断

屏蔽测试:

屏蔽A包:可实现卡怪效果但不稳定

屏蔽B包:无作用

同时屏蔽AB包:可以实现卡角色效果且稳定

(关键点:屏蔽必须在进游戏场景首次发送坐标封包之前,否则会被服务器T出房间)

卡角色表现:

即服务器认为以及玩家看到作弊角色一直在出生的基地,而作弊角色实际上可全地图做任何操作。

卡角色可实现变态功能:

对战中可一直隐身,全图杀人(已方及敌对玩家看到的作弊角色一直在出生点),效果图如下:

Kill.jpg

狩猎副本房可卡怪无敌(服务器认为作弊角色一直在出生点,怪物一直卡在出生点攻击不存在的角色),效果图如下:

卡怪.jpg

隐身安、解雷(隐身安、解雷在其他人看来是远程安、解雷):

这里做土匪的话更有趣点,隐身安雷,隐身守株待兔,来多少敌人都轻松灭之(玩过CS的秒懂)。

3.秒杀漏洞

CPU超频有超外频、倍频两类方法,秒杀类漏洞亦如此:

外频:修改角色、武器攻击力

倍频:修改攻击速度

截取一条M4攻击封包:

390041101E000000000000002A270002A08400000200011100000000
8DBE5C42C2449941C822D53F
216961420740C14170649B3F02000000000000

封包里里包含弹道等信息,并没有攻击力等数据,显然伤害计算是在服务器进行,修改攻击力属性不会有任何效果。

尝试倍频攻击速度方法:

目前接入工具HOOK点是加密接口,加密处重复调用不会有效果,所以我们需要根据加密函数继续堆栈回溯出开枪函数接口

HOOK开枪函数接口处,把调用一次开枪修改为调用N次开枪(重放测试),发现服务器对开枪技能并无严谨的CD判断,可实现N倍秒杀效果

当然仅仅如此还不能秒杀BOSS,还需要逆向出换弹夹函数结合一下,不然光换子弹时间加起来就得浪费1分钟。可能早被BOSS的群体技能秒杀而不是秒杀BOSS了。

HOOK后完整的处理函数如下:

void __stdcall DoAttack(DWORD dwParam,DWORD dwEcx)
{
    int i,iMax;
    //攻击轮数
    if (g_b_Seckill){
        iMax = g_i_BulletCountAll;
    }
    else{
        iMax = 1;
    }
    while (iMax > 0){

        if (g_b_Slow){
            //执行一轮攻击,节省子弹模式
            for (i = 0;i<4;i++){
                _asm{
                    mov ecx,dwEcx
                }
                OldAttack(dwParam);
            }
        }
        else{
            //执行一轮攻击,打光弹匣
            for (i = 0;i<g_i_BulletCount;i++){
                _asm{
                    mov ecx,dwEcx
                }
                OldAttack(dwParam);
            }
        }
        //秒换子弹
        _asm{
            pushad
            call DoReloadBullet
            popad
        }
        iMax--;
    }
}

于是乎,几个高等级、极品武器腾挪躲闪几分钟不一定能打死的大BOSS,被个小号拿初级喷子一两枪秒杀之,之前测试偶录视频为证:

卡怪和秒杀漏洞结合,单练高难度副本毫无压力。

视频链接

4.透视

D3D游戏通病,透视用第83个函数IDirect3DDevice9::DrawIndexedPrimitive实现透视

关键点:渲染前后对Z轴缓冲的过滤处理,核心代码:

HRESULT __stdcall NewDrawIndexedPrimitive(LPDIRECT3DDEVICE9 pDevice,D3DPRIMITIVETYPE type,INT BaseVertexIndex,UINT MinVertexIndex,UINT NumVertices,UINT startIndex,UINT primCount)
{
    HRESULT hRet = S_OK;
    IDirect3DVertexBuffer9* pStreamData = NULL;
    UINT iOffsetInBytes,iStride;
    if(D3D_OK == pDevice->GetStreamSource(0,&pStreamData,&iOffsetInBytes,&iStride)){
        pStreamData->Release();
    }
    if(iStride == g_Stride){                         //g_Stride为调试获得的过滤角色的Stride值
        pDevice->SetRenderState(D3DRS_ZENABLE,FALSE);//禁用Z轴缓冲
        hRet = OldDrawIndexedPrimitive(pDevice,type,BaseVertexIndex,MinVertexIndex,NumVertices,startIndex,primCount);
        pDevice->SetRenderState(D3DRS_ZENABLE,TRUE );//恢复Z轴缓冲
    }
    else{
        hRet = OldDrawIndexedPrimitive(pDevice,type,BaseVertexIndex,MinVertexIndex,NumVertices,startIndex,primCount);
    }
    return hRet;  
}

效果图如下:

透视.jpg

具体实现以及源码详见:CoolCmd_通用D3D降压透视插件(附源码)

0x04 附言

1.鉴于枪战类游戏的特殊性,市面所有枪战类网游都是可以实现不同程度的速杀效果的。

 2.协议挖掘游戏漏洞常规方法有重放测试、修改测试、屏蔽测试、时序逻辑测试、模糊测试。

其中逻辑时序测试又尤其重要,比如出售、丢弃、存取、捡取、邮寄、交易、修理等涉及同一物品进行操作时,同样的几个协议。

协议的排列组合是呈几何级数增长的,不同时序逻辑组合下会出现很多不可预料的情形。

3.相对于一般的网络软件,网游各子系统相对繁杂,单纯复制就可能出现数值溢出复制、异常拆分叠加复制、服务器切换复制(传送门复制)、

FWG.jpg 状态锁定失败复制、服务器权限指令复制、重复填充包结构复制、宕角色、宕服复制、多角色在线复制等等。

对游戏漏洞挖掘步骤和方法感兴趣的可关注另一篇文章游戏漏洞挖掘概述》。

最后感慨下,360安全综合实力国内NO1,但是游戏安全貌似还没重视,代理的游戏好好体检还是有必要的。

FWG.jpg

*作者:CoolCmd,本文属FreeBuf原创奖励计划文章,未经许可禁止转载


知识来源: www.freebuf.com/vuls/97234.html

阅读:243802 | 评论:0 | 标签:漏洞 游戏安全 终极火力

想收藏或者和大家分享这篇好文章→复制链接地址

“360端游终极火力“隐身”、“秒杀”等漏洞解析”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

公告

永久免费持续更新精选优质黑客技术文章Hackdig,帮你成为掌握黑客技术的英雄

求赞助求支持·广告位💖

标签云