數(shù)據(jù)發(fā)送接收情況:
........客戶端與Gateserver,Loginserver的數(shù)據(jù)互換,省略
1. 客戶端向Gameserver發(fā)送[**登錄用戶名/角色名/驗(yàn)證數(shù)1/驗(yàn)證數(shù)2/版本驗(yàn)證數(shù)/1/0]
2. Gameserver向客戶端發(fā)送密文,類似#eLrBHMNx<F=hgmlYA]X]ENtpGM`X@?PuN`LwT_m>RmleJ_l{PAMHQ?pUCpdbENa<F`pjBllQC=HSC\\pT?LduQ_y=PQM>JptK!
3. 客戶端向Gameserver發(fā)送解密后密文,類似#3<<<<<Jx?<<<<<<<<A>xZCNLSHoPpAnQRF?ljIaaUPmlSF^L_BmtfFODJA_X\\A]T`GNlq@L!
........歡迎信息,裝備信息等省略
數(shù)據(jù)格式
[#][標(biāo)識位][指令頭][消息體][!]
例如 #3<<<<<B\\<<<<<<<<<mi{EhL!
命令結(jié)構(gòu)體
typedef struct tag_TDEFAULTMESSAGE
{
int nRecog;
WORD wIdent; 3EF
WORD wParam;
WORD wTag;
WORD wSeries;
} _TDEFAULTMESSAGE, *_LPTDEFAULTMESSAGE;
解密命令體<<<<<Jx?<<<<<<<<得到wIdent值是3EF(1007),OD打開Mir3.exe,查找常量000003EF,跟蹤進(jìn)入,得到如下代碼
>>Method1(未知參數(shù))
push esi
push edi
push 0
push 0
push 0
push 0
mov esi, ecx
push 3EF
lea edi, dword ptr [esi+18] ;esi+18 是命令結(jié)構(gòu)體的首地址
push edi ;命令結(jié)構(gòu)體首地址
call 004A0D00 ;生成命令結(jié)構(gòu)體 (edi,3ef,0,0,0,0)
mov eax, dword ptr [esp+C] ; eax保存第一個(gè)參數(shù)
push 0
push eax
push edi
mov ecx, esi ;傳遞this指針,
call 0049E450 ;發(fā)送數(shù)據(jù),arg3: 0, arg2: 第一個(gè)參數(shù), arg1: 命令結(jié)構(gòu)體
pop edi
pop esi
retn 4
簡單分析,入棧的4個(gè)0和3EF,則對應(yīng)結(jié)構(gòu)體,該函數(shù)至少1個(gè)參數(shù),目前不知這個(gè)參數(shù)是什么意思,跟進(jìn)0049E450看看
>>Method2(命令結(jié)構(gòu)體,未知參數(shù),0)
mov eax, dword ptr [esp+4] ;eax=命令結(jié)構(gòu)體
push ebx
push ebp
push esi
mov esi, ecx ;得到this指針
push 20
lea ebp, dword ptr [esi+24] ;esi+18是命令結(jié)構(gòu)體,加密命令結(jié)構(gòu)體得到的字符串保存在esi+24中
push ebp
push eax
call 004A0CA0 ;跟進(jìn)發(fā)現(xiàn)是加密命令結(jié)構(gòu)體,arg3: 20(32), arg2: esi+24, arg1: 命令結(jié)構(gòu)體地址
mov eax, dword ptr [esi+14] ;eax=esi+14=標(biāo)識位
cmp eax, 9
jl L015 ;如果標(biāo)識位小于9,則跳到L015
mov dword ptr [esi+14], 1 ;否則標(biāo)識位重設(shè)為1
jmp L017
L015:
inc eax
mov dword ptr [esi+14], eax ;標(biāo)識位自加1
L017:
mov edx, dword ptr [esp+14] ;edx=第2個(gè)參數(shù)
test edx, edx ;
je L048 ;如果第2個(gè)參數(shù)為0,則跳轉(zhuǎn)到L048
mov eax, dword ptr [esp+18] ;eax=第3個(gè)參數(shù): 0
test eax, eax
push edi
jnz L031 ;eax不等于0則跳轉(zhuǎn)
mov eax, edx ;eax=第2個(gè)參數(shù)
lea edi, dword ptr [eax+1]
L026:
mov cl, byte ptr [eax] ;cl=第2個(gè)參數(shù)第1個(gè)字節(jié)
inc eax ;eax
test cl, cl ;循環(huán)得到第一個(gè)參數(shù)的長度
jnz L026 ;沒到字符串尾則繼續(xù)循環(huán)
sub eax, edi
L031:
push 2000
push eax
lea edi, dword ptr [esi+44]
push edi
push edx
call 004A0B10 ;調(diào)用加密函數(shù),將edx加密,保存在esi+44中
mov ecx, dword ptr [esi+14]
push edi
push ebp
push ecx
lea ebx, dword ptr [esi+2044]
push 004CBFE4 ; #%d%s%s!
push ebx
call 004BB568
add esp, 14
pop edi
jmp L056
L048:
mov edx, dword ptr [esi+14]
push ebp
push edx
lea ebx, dword ptr [esi+2044]
push 004CBFC4 ; #%d%s!
push ebx
call 004BB568 ;sprintf 格式化發(fā)送給服務(wù)器端的數(shù)據(jù)
add esp, 10
L056:
mov eax, ebx
lea edx, dword ptr [eax+1]
L058:
mov cl, byte ptr [eax]
inc eax ;這個(gè)循環(huán)得到數(shù)據(jù)長度
test cl, cl
jnz L058
push 0
sub eax, edx
push eax ; 數(shù)據(jù)長度
mov eax, dword ptr [esi+6044]
push ebx ; Data ,要發(fā)送的數(shù)據(jù)
push eax ; Socket對象
call <jmp.&WS2_32.#19> ;這里是調(diào)用send(Socket對象, 要發(fā)送的數(shù)據(jù), 數(shù)據(jù)長度, 0 (flag));
pop esi
pop ebp
pop ebx
retn 0C
L017和L031說明Method1和Method2中的未知參數(shù)就是明文消息體,Method1只有1個(gè)消息體參數(shù)
posted on 2008-06-01 10:48
Phrancol Yang 閱讀(558)
評論(0) 編輯 收藏 所屬分類:
反匯編