免责声明:本文仅内容作为学习交流使用,不可用于任何商业途径
MT4客户端225通讯协议分析。
通过对send下断,找到第一个发送的数据包,即登录内容,通过调用栈往上找到关键的函数调用,登录函数接收以下4个参数
(1) 用户ID(int) (2) 密码(pchar) (3) 0 (4) 0
相关代码如下
_text:00434AD0 sub esp, 0A8h
_text:00434AD6 push ebx
_text:00434AD7 push ebp
_text:00434AD8 push esi
_text:00434AD9 mov esi, ecx
_text:00434ADB push edi
_text:00434ADC xor ebx, ebx
_text:00434ADE mov ecx, 6
_text:00434AE3 xor eax, eax
_text:00434AE5 lea edi, [esp+0B8h+var_A7] ; 指向Buf的第二字节
_text:00434AE9 mov [esp+0B8h+buf], bl ; Buf的第一字节赋0
_text:00434AED rep stosd
_text:00434AEF mov ebp, [esp+0B8h+arg_4] ; 参数密码
_text:00434AF6 stosw
_text:00434AF8 cmp ebp, ebx
_text:00434AFA stosb
_text:00434AFB jz loc_0_434CFA ; 密码为空则退出
_text:00434B01 cmp dword ptr [esp+0B8h+ArgList], 1 ; 用户ID为1则退出
(1是MT4的默认管理员, 不能用于客户端登录)
_text:00434B09 jl loc_0_434CFA
_text:00434B0F mov edi, ebp ; 计算密码的长度存于ECX
_text:00434B11 or ecx, 0FFFFFFFFh
_text:00434B14 xor eax, eax
_text:00434B16 repne scasb
_text:00434B18 not ecx
_text:00434B1A dec ecx
_text:00434B1B cmp ecx, 1 ; 密码最小长度1
_text:00434B1E jb loc_0_434CFA
_text:00434B24 cmp dword ptr [esi+4], 0FFFFFFFFh
_text:00434B28 jnz short loc_0_434B3C ; ECX=271BBDC 一个空的Buffer
_text:00434B2A pop edi
_text:00434B2B pop esi
_text:00434B2C pop ebp
_text:00434B2D mov eax, 6
_text:00434B32 pop ebx
_text:00434B33 add esp, 0A8h
_text:00434B39 retn 10h
_text:00434B3C ; ---------------------------------------------------------------------------
_text:00434B3C
_text:00434B3C loc_0_434B3C: ; CODE XREF: UserLogin+58j
_text:00434B3C lea ecx, [esp+0B8h+var_6C] ; ECX=271BBDC 一个空的Buffer
_text:00434B40 call sub_0_433A10 ; SetMagicBufferTo ECX
_text:00434B45 mov edi, ebp ; EDI = PSW
_text:00434B47 or ecx, 0FFFFFFFFh ; EXC = LEN(PSW)
_text:00434B4A xor eax, eax
_text:00434B4C repne scasb
_text:00434B4E not ecx
_text:00434B50 dec ecx
_text:00434B51 push ecx
_text:00434B52 push ebp
_text:00434B53