首页
论坛
专栏
课程

[调试逆向] [原创]某P保护的一款音乐类PC游戏的分析之----dump协议号

2019-10-16 15:50 2442

[调试逆向] [原创]某P保护的一款音乐类PC游戏的分析之----dump协议号

2019-10-16 15:50
2442

1、前言


本来是学习一下某P的技术,后来分析一下这款游戏,没有多少技术含量,就发出来献献丑,给各位看客一个抛砖引玉的作用吧。


2、Subject分析


看了一下目录结构,研究了一下3D引擎,没看出什么东西,然后又去官网看了一下,发现是该公司自研的一套引擎,也就下载不到源码分析了,只能瞎子过河了。


大厅说了几句话,然后抓包看



看了几个包,结构大概就是,4字节是包长,未知数据,协议号,数据,为什么是这样呢,再看看收包
0000   ca 00 00 00 0f 7a be 44 d0 07 00 00 00 00 00 00
0010   31 00 00 30 00 82 05 00 52 1f 8d 34 da 37 1e 00
0020   0c 00 00 00 11 11 11 11 11 11 11 11 11 11 11 11
0030   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0040   0b 00 00 00 24 74 24 31 32 31 32 31 32 24 7a 00
0050   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0060   00 00 00 00 ff ff ff ff 00 00 00 00 00 00 00 00
0070   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0080   00 00 00 00 00 00 00 00 00 00 00 00 03 00 00 00
0090   00 00 00 00 08 00 00 00 bb aa b6 ab d2 bb c7 f8
00a0   00 52 3f 2d 00 00 00 00 00 82 00 00 00 00 00 00
00b0   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00c0   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00d0   00 00
0000   ca 00 00 00 0f 7a be 44 d0 07 00 00 00 00 00 00
0010   31 00 00 30 00 82 05 00 52 1f 8d 34 da 37 1e 00
0020   0c 00 00 00 11 11 11 11 11 11 11 11 11 11 11 11
0030   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0040   0b 00 00 00 24 74 24 31 32 31 32 31 32 24 7a 00
0050   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0060   00 00 00 00 ff ff ff ff 00 00 00 00 00 00 00 00
0070   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0080   00 00 00 00 00 00 00 00 00 00 00 00 03 00 00 00
0090   00 00 00 00 08 00 00 00 bb aa b6 ab d2 bb c7 f8
00a0   00 52 3f 2d 00 00 00 00 00 82 00 00 00 00 00 00
00b0   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00c0   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00d0   00 00


所以,收包没有加密,发包加密了,他的结构就是这样,于是我在收到封包之后,在+0x4的地方下个断点
来到了关键点
.text:10009410 ; =============== S U B R O U T I N E =======================================
.text:10009410
.text:10009410
.text:10009410 sub_10009410 proc near ; CODE XREF: sub_10009660+12↓p
.text:10009410 ; sub_10009690+12↓p
.text:10009410
.text:10009410 arg_0 = dword ptr 4
.text:10009410 arg_4 = dword ptr 8
.text:10009410 arg_8 = dword ptr 0Ch
.text:10009410
.text:10009410 mov ecx, [esp+arg_4]
.text:10009414 push esi
.text:10009415 mov esi, [esp+4+arg_8]
.text:10009419 cmp ecx, esi
.text:1000941B jz short loc_1000944A
.text:1000941D mov edx, [esp+4+arg_0]
.text:10009421 push ebx
.text:10009422 push edi
.text:10009423
.text:10009423 loc_10009423: ; CODE XREF: sub_10009410+32↓j
.text:10009423 mov eax, [edx]
.text:10009425 mov edi, eax
.text:10009427 shl edi, 6
.text:1000942A mov ebx, eax
.text:1000942C shr ebx, 2
.text:1000942F add edi, ebx
.text:10009431 movsx ebx, byte ptr [ecx]
.text:10009434 lea edi, [edi+ebx-61C88647h]
.text:1000943B xor edi, eax
.text:1000943D inc ecx
.text:1000943E mov [edx], edi
.text:10009440 cmp ecx, esi
.text:10009442 jnz short loc_10009423
.text:10009444 mov eax, edi
.text:10009446 pop edi
.text:10009447 pop ebx
.text:10009448 pop esi
.text:10009449 retn
.text:1000944A ; ---------------------------------------------------------------------------
.text:1000944A
.text:1000944A loc_1000944A: ; CODE XREF: sub_10009410+B↑j
.text:1000944A mov eax, [esp+4+arg_0]
.text:1000944E mov eax, [eax]
.text:10009450 pop esi
.text:10009451 retn
.text:10009451 sub_10009410 endp
F5后
int __cdecl sub_10009410(int a1, char *a2, char *a3)
{
char *v3; // ecx
int v4; // edi

v3 = a2;
if ( a2 == a3 )
return *(_DWORD *)a1;
do
{
v4 = *(_DWORD *)a1 ^ ((*(_DWORD *)a1 >> 2) + (*(_DWORD *)a1 << 6) + *v3++ - 1640531527);
*(_DWORD *)a1 = v4;
}
while ( v3 != a3 );
return v4;
}

参数1是一个KEY,参数二data_start 参数三 data_end

所以可知那个未知的DWORD,其实就是数据包的一个HASH数值,然后继续寻找发包点
创建了一个房间,发现可以开关跳舞的位置,于是在ida中搜索一些英文,没想到一次就猜对了




在这几个字符上下了断点,然后开关位置后,成功段了下来,返回上一层,来到了这里


经过我的测试发现,这里就是我想找的,游戏组包Post给Socket系统的Dispatch点了。就是那个call dword ptr [edx+8]


然后跟进去单步,然后发现了一些有意思的东西





传入的是一个类指针,然后通过虚函数取出类名和协议号,暴露了!


于是经过研究,这是一个网络通信message类指针,里面有CEvent*开头的类名称和对应的协议ID。



message id的枚举:写一个IDA脚本,枚举出dll内所有的CEvent开头的字符串,然后反向枚举出类指针,再通过类指针获取到message id

脚本如下

import idc
import idautils
import idaapi
txt_ads = idc.FindBinary(0x64000000,SEARCH_DOWN,'43 45 76 65 6E 74',16)



while 1:
	print(hex(txt_ads))
	txt_name = idc.get_strlit_contents(txt_ads)
	print(txt_name)
	for rrr in idautils.XrefsTo(txt_ads):
    disamcode = idc.GetDisasm(rrr.frm)
    if 'mov     eax' in disamcode:
        print(disamcode)
        for rrr2 in idautils.XrefsTo(rrr.frm):
            print(hex(rrr2.frm))
            opcode_ads = idc.Dword(rrr2.frm - 4)
            opcode = idc.get_operand_value(opcode_ads , 1)
            print('[%x]%s'%(opcode,txt_name))
	
	txt_ads = idc.FindBinary(txt_ads,SEARCH_NEXT,'43 45 76 65 6E 74',16)
	if txt_ads < 0:
	break


跑完了之后看了一下结果

[9071]CEventUIOperation

[63551]CEventBeginGlobalMatch

[9003]CEventUserLogOut

[32752]CEventAddKtvStarValue

[32603]CEventPetTowerEnter

[32605]CEventPetTowerLeave

[32614]CEventPetTowerFinishNode

[6078]CEventTglogOssUIButtonLimit

[32451]CEventLoveAlbumUploadPhoto

[6063]CEventDynamicParam2Client

[9007]CEventEditRole

[1000]CEventTest

[10006]CEventNoticeHealthStatus

[6079]CEventPlayerTransform

[62379]CEventGlobalAds

[36024]CEventCollocationOSS

[9105]CEventHangUpStateChange

[5059]CEventChangeAvtarItem

[37031]CEventNotifyQQWeiblogMsg

[27525]CEventOpenVipBox

[9547]CEventKTVSaveAudio

[32332]CEventChangeVipRoomProtrait

[19010]CEventActivityRewards

[8540]CEventLoadDungeonAward2

[5058]CEventFusion

[8031]CEventPlayerChangeAvatar

[64444]CEventTangoActivityNotifySelectModelResult

[5096]CEventPetShift

[61855]CEventQuestClientTrigger

[64441]CEventTangoActivityGetTopicInfoRes

[65293]CEventLimitedTreasureExchange

[65282]CEventAMQuestLotteryOpenSubUIRes

[63774]CEventInnerActivityEnter

......



至此,协议号dump出来了


然后验证一下刚才说话,封包里面是0x7D6,也就是2006查表可知

[7020]CEventCompensateLevelupRewards
[2000]CEventToClientChatMessage
[2004]CEventSysNotice
[2005]CEventSysBoardcast
[2006]CEventToServerChatMessage
[2007]CEventGroupChatMessage
[2008]CEventRecommendFriendToClient
[2009]CEventToClientAllZoneHornChatMessage
[2010]CEventPlayerEnterGlobalCommunity
[2011]CEventClearPlayerChatMessage

所以dump出来的协议号是对的

3、后记


后续分析中,发现有的协议号调用了某P的TerSafe中封包加密,有时间再分析吧。


附件是dump出来的协议号













2020安全开发者峰会(2020 SDC)议题征集 中国.北京 7月!

最后于 2019-10-16 15:59 被少妇之友编辑 ,原因:
上传的附件:
最新回复 (9)
kongfubull 2019-10-16 18:04
2
0
学习一个。楼主这个是用IDA调试的?还是说可以直接在IDA的代码中通过你这个脚本拿到这些信息
Editor 2019-10-17 09:18
3
0
感谢分享哦~
ggsuper 2019-10-17 11:29
4
0
这不是qqx5吗,mark
mb_jrbhkper 2019-10-17 19:35
5
0
此楼层已删除
mb_jrbhkper 2019-10-17 19:36
6
0
此楼层已删除
o冰柠檬o 2019-10-17 19:57
7
0
楼主可以把idb丢一份的么?学习下idc的脚本。
yzlmars 2019-10-18 11:51
8
0
我是少妇杀手
killpy 2 2019-10-18 17:10
9
0
反向枚举出类指针  怎么反向
kgddc 2019-10-21 20:04
10
0
感谢分享哦~
游客
登录 | 注册 方可回帖
返回