根據3EF找到生成命令體的函數,該函數只有一個參數——消息體,轉到上一個函數得到以下代碼
push 1FFF ;1FFF入棧
lea eax, dword ptr [esp+CAC] ;(3244) 距離棧頂811個存儲單元
push eax ;eax入棧 解密后要存入的地址入棧
add edi, 10 ;edi=從字符串第17個字節開始往后的串
push edi ;密文入棧
call 004A0BD0 ;跟進發現這是普通的一次解密,解密后數據存在esp+CAC里
mov byte ptr [esp+eax+CA8], 0
xor eax, eax
mov ecx, 100 ;ecx=100 (256) 循環次數
lea edi, dword ptr [esp+3F8] ;edi
rep stos dword ptr es:[edi] ;
lea ecx, dword ptr [esp+3F8]
push ecx
lea edx, dword ptr [ebx+3CD864]
push edx
mov ecx, ebx
call 0042C440 ;二次解密,生成回復密文
lea eax, dword ptr [esp+3F8]
push eax
mov ecx, 004D5C70
call 0049F770 ;調用messageSend(char* msg)
lea eax, dword ptr [esp+CA8]
lea edx, dword ptr [eax+1]
L023:
mov cl, byte ptr [eax]
inc eax
test cl, cl
jnz L023
sub eax, edx
cmp eax, 3C
jnz 0043BF9D
mov ecx, dword ptr [esp+CA8]
mov edx, dword ptr [esp+CAC]
mov eax, dword ptr [esp+CB0]
mov dword ptr [esp+38], ecx
mov ecx, dword ptr [esp+CB4]
mov dword ptr [esp+44], ecx
mov ecx, dword ptr [esp+CC0]
mov dword ptr [esp+3C], edx
mov edx, dword ptr [esp+CB8]
mov dword ptr [esp+40], eax
mov eax, dword ptr [esp+CBC]
mov dword ptr [esp+54], ecx
mov ecx, dword ptr [esp+CCC]
mov dword ptr [esp+48], edx
mov edx, dword ptr [esp+CC4]
mov dword ptr [esp+50], eax
mov eax, dword ptr [esp+CC8]
mov dword ptr [esp+60], ecx
mov ecx, dword ptr [esp+CD8]
mov dword ptr [esp+58], edx
mov edx, dword ptr [esp+CD0]
mov dword ptr [esp+5C], eax
mov eax, dword ptr [esp+CD4]
mov dword ptr [esp+24], ecx
lea ecx, dword ptr [esp+1C]
mov dword ptr [esp+1C], edx
mov edx, dword ptr [esp+CDC]
mov dword ptr [esp+20], eax
mov eax, dword ptr [esp+CE0]
push ecx
mov ecx, ebx
mov byte ptr [esp+50], 0
mov byte ptr [esp+68], 0
mov dword ptr [esp+2C], edx
mov dword ptr [esp+30], eax
mov byte ptr [esp+34], 0
call 0042BD60
lea edx, dword ptr [esp+38]
push edx
mov ecx, ebx
mov byte ptr [ebx+49B160], al
mov byte ptr [ebx+49B161], ah
call 0042BD60
mov word ptr [ebx+49B162], ax
lea eax, dword ptr [esp+50]
push eax
mov ecx, ebx
call 0042BD60
mov word ptr [ebx+49B164], ax
mov ecx, dword ptr [esp+54AC]
mov dword ptr fs:[0], ecx
pop edi
pop esi
pop ebx
mov esp, ebp
pop ebp
retn 4
分析以上代碼可以簡單得出以下結論
1. 從call 004A0BD0 的調用可以簡單分析出二次密文可能也是標準消息結構
2. 通過對比未更新版本與最新版本對3EF的發送情況,未更新版本發送3EF時,消息體是空,命令體其他參數不為0,再細分析,
未更新的版本的3EF其實就是割肉的命令...........
最新版本的客戶端收到二次密文后,經過一些處理,以3EF為命令發向服務器
3. 從add edi, 10可以猜測,二次密文的命令體可能是迷惑人用的
4. 從call 0049F770這個調用斷定 esp+3F8 就是二次解密后的明文
5. 對于call 0042C440這個調用,可以猜測,這個就是二次解密的函數
6. 服務器發來的密文對于本次解密是沒有影響的,只是對它進行了一些操作,生成了4個數并進行如下保存
mov byte ptr [ebx+49B160], al
mov byte ptr [ebx+49B161], ah
mov word ptr [ebx+49B162], ax
mov word ptr [ebx+49B164], ax
7. 二次解密函數有2個參數: arg1 = dword ptr [ebx+3CD864] , arg2 = [esp+3F8]
也就是根據dword ptr [ebx+3CD864]來生成解密明文,并存入地址esp+3F8,于是ebx+3CD864就成了解密的關鍵
posted on 2008-06-01 20:12
Phrancol Yang 閱讀(319)
評論(0) 編輯 收藏 所屬分類:
反匯編