首页
社区
课程
招聘
[原创]一个魔兽争霸官方平台天梯机制的漏洞分析
发表于: 2017-9-25 03:45 11140

[原创]一个魔兽争霸官方平台天梯机制的漏洞分析

2017-9-25 03:45
11140

重要的事情先说三遍:写服务端的人真菜!写服务端的人真菜!写服务端的人真菜!算是炒个冷饭。

  在本文发布的时候,漏洞已经被提交并被网易修复,想做坏事的还是算了。

  先提一下网易为了这个天梯系统写的“DzApi”,其实就是仿照jass虚拟机注册函数的方式向jass虚拟机注册自定义函数。

关键函数原型如下:

   uintptr_twar3_searcher::search_get_instance()const

    {

uintptr_tget_instance;

//=========================================

//  (1)

//

//    push    493E0h

//    push    1

//    push    1

//    push    0

//    mov     edx, offset s_Config ; "config"

//    mov     ecx, esi

//    call    UnknowFunc <----

//=========================================

get_instance=search_string("config");

get_instance+=sizeofuintptr_t;

get_instance=next_opcode(get_instance, 0xE8, 5);

get_instance=convert_function(get_instance);

//=========================================

//  (2)

//

//  UnknowFunc:

//    push    esi

//    mov     esi, edx

//    call    jGetVMInstance <---

//=========================================

get_instance=next_opcode(get_instance, 0xE8, 5);

get_instance=convert_function(get_instance);

//=========================================

//  (3)

//

//  jGetVMInstance:

//    jmp    jGetVMInstance2 <----

//=========================================

get_instance=convert_function(get_instance);

//=========================================

//  (4)

//

// jGetVMInstance2:

//    push    esi

//    mov     esi, ecx

//    mov     ecx, 5

//    call    GetInstance <----

//    push    esi

//    mov     ecx, eax

//    call    UnknowFunc

//    pop     esi

//    retn

//=========================================

get_instance=next_opcode(get_instance, 0xE8, 5);

get_instance=convert_function(get_instance);

returnget_instance;

   uint32_twar3_searcher::get_instance(uint32_tindex)

    {

return((uint32_t(_fastcall*)(uint32_t))get_instance_)(index);

    hashtable::native_func_table*get_native_function_hashtable()

    {

return(hashtable::native_func_table*)(get_war3_searcher().get_instance(5)+0x18);

   booltable_hook     (constchar*proc_name,uintptr_t*old_proc_ptr,uintptr_tnew_proc)

    {

        hashtable::native_func_node*node_ptr=get_native_function_hashtable()->get(proc_name);

if(!node_ptr)

returnfalse;

        *old_proc_ptr= (uintptr_t)node_ptr->func_address_;

node_ptr->func_address_  = (uint32_t)new_proc;

returntrue;

namespaceDzApi

{

   uint32_tget_adress(std::stringdz_api_name);

   voidhook(std::stringdz_api_name,uintptr_t*old_proc_ptr,uintptr_tnew_proc);

   voidunhook(std::stringdz_api_name,uintptr_t*old_proc_ptr,uintptr_tnew_proc);

}

//native DzAPI_Map_SaveServerValue takesplayer whichPlayer, string key, string value returns boolean

//native DzAPI_Map_GetServerValue takesplayer whichPlayer, string key returns string

//native DzAPI_Map_Ladder_SetStat takesplayer whichPlayer, string key, string value returns nothing

//native DzAPI_Map_IsRPGLobby takesnothing returns boolean

//native DzAPI_Map_IsRPGLadder takesnothing returns boolean

//native DzAPI_Map_GetGameStartTime takesnothing returns integer

//native DzAPI_Map_Stat_SetStat takesplayer whichPlayer, string key, string value returns nothing

//native DzAPI_Map_GetMapLevel takesplayer whichPlayer returns integer

//native DzAPI_Map_MissionComplete takesplayer whichPlayer, string key, string value returns nothing

//native DzAPI_Map_GetActivityData takesnothing returns string

//native DzAPI_Map_GetMatchType takesnothing returns integer

usingbase::warcraft3::jass::jboolean_t;

usingbase::warcraft3::jass::jinteger_t;

usingbase::warcraft3::jass::jnothing_t;

usingbase::warcraft3::jass::jstring_t;

usingbase::warcraft3::jass::jhandle_t;

usingbase::warcraft3::jass::table_hook;

usingbase::warcraft3::jass::async_hook;

usingbase::warcraft3::jass::table_unhook;

usingbase::warcraft3::jass::async_unhook;

typedefbase::warcraft3::hashtable::native_func_nodeDzApiFunc;

namespaceDzApi

{

   uint32_tget_adress(std::stringdz_api_name)

    {

DzApiFunc*dz_func= base::warcraft3::get_native_function_hashtable()->get(dz_api_name.c_str());

if(dz_func!=nullptr)

        {


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 1
支持
分享
最新回复 (13)
雪    币: 30
活跃值: (760)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
楼主分析得不错,  就是排版有点问题。还有毕竟是别人的劳动成果,  请不要随便喷
2017-9-25 11:46
0
雪    币: 6124
活跃值: (4671)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
3
uvbs 楼主分析得不错, 就是排版有点问题。还有毕竟是别人的劳动成果, 请不要随便喷
我喷是有原因的,半年前就发现了,直接说没用,连他们主管都在骂人
2017-9-25 13:08
0
雪    币: 5855
活跃值: (438)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
4
网易的开发水平有这么差么。。
2017-9-25 15:06
0
雪    币: 108
活跃值: (35)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
mark
2017-9-27 17:17
0
雪    币: 108
活跃值: (35)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
mark
2017-9-27 17:17
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
外包公司  参差不齐
2017-9-30 01:30
0
雪    币: 6818
活跃值: (153)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
不错!!!!
2017-10-6 20:27
0
雪    币: 12502
活跃值: (3058)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
估计是找的外包。然后接手的人匆忙
2017-10-7 12:19
0
雪    币: 3279
活跃值: (1997)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
懵逼了,表示看不懂。
2017-10-7 17:31
0
雪    币: 20
活跃值: (77)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
惊现神话
2018-1-17 22:55
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
表示看不懂
2018-1-18 17:01
0
雪    币: 19
活跃值: (128)
能力值: ( LV9,RANK:146 )
在线值:
发帖
回帖
粉丝
13
老哥威武
2018-2-14 19:05
0
雪    币: 246
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
14
给力,能加个好友交流下吗?
2019-2-13 02:06
0
游客
登录 | 注册 方可回帖
返回
//