转载

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

*原创作者:CoolCmd

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

0x 0 前言

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

0x 0 2 准备工作

终极火力->【 链接 】

OllyDbg->【 链接 】

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

0x 0 3 分析

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

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

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

逆向明文加密函数,常用有效方法如下:

1、由下向上

堆栈回溯法,通过send、sendto、WSASend、WSASendTo等相关Api的调用堆栈关系回溯到加密函数.   

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

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

加密函数对应汇编代码:

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

加密函数调用汇编代码:

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

加密函数对应原型:

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); } 

全接入效果图:

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

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

2.隐身漏洞

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

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

2A00 02103F00000093CA0000 EEC48442 596C0342 40239A3C 6339000000000000000000000000000000000B02

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

1E00 0B203F000000CACA000063393C0600000000  EEC48442 596C0342 40239A3C

做些测试

修改测试:

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

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

屏蔽测试:

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

屏蔽B包:无作用

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

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

卡角色表现:

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

卡角色可实现变态功能:

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

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

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

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

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

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

3.秒杀漏洞

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

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

倍频:修改攻击速度

截取一条M4攻击封包:

390041101E000000000000002A270002A08400000200011100000000 8DBE5C42 C2449941 C822D53F 21696142 0740C141 70649B3F 02000000000000

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

尝试倍频攻击速度方法:

目前接入工具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;   }

效果图如下:

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

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

0x 0 4 附言

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

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

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

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

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

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

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

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

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

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

原文  http://www.freebuf.com/vuls/97234.html
正文到此结束
Loading...