根据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 阅读(311)
评论(0) 编辑 收藏 所属分类:
反汇编