MT4客户端通讯分析(二)——数据包解密
来源:互联网 发布:分析英语句子成分软件 编辑:程序博客网 时间:2024/06/01 20:01
免责声明:本文仅内容作为学习交流使用,不可用于任何商业途径
上次分析的登录数据包是通过一个常量MD5数组进行加密变换的,对于登录后的其它数据包, 接着上次分析的代码,上次分析的最后有这样一段代码
_text:00434C88 loc_0_434C88: ; CODE XREF: UserLogin+196j_text:00434C88 lea ecx, [esp+0B8h+var_8C] ; ECX<-271BBBC, EnMD5_text:00434C8C push 1 ; len_text:00434C8E push ecx ; buf_text:00434C8F mov ecx, esi_text:00434C91 mov [esi+1ACh], ebx ; 清空Buf_text:00434C97 mov [esi+1B0h], ebx_text:00434C9D mov [esi+1B4h], ebx_text:00434CA3 mov [esi+1B8h], ebx_text:00434CA9 call sub_0_50AE20 ; 接收数据并解密_text:00434CAE lea edx, [esi+1C0h]_text:00434CB4 push 2 ; len_text:00434CB6 push edx ; buf_text:00434CB7 mov ecx, esi_text:00434CB9 call sub_0_50AE20 ; 接收数据并解密_text:00434CBE lea eax, [esi+1C4h]_text:00434CC4 push 4 ; len_text:00434CC6 push eax ; buf_text:00434CC7 mov ecx, esi_text:00434CC9 call sub_0_50AE20 ; 接收数据并解密_text:00434CCE cmp [esp+0B8h+arg_C], ebx_text:00434CD5 jnz short loc_0_434CEB_text:00434CD7 push ebp ; ArgList_text:00434CD8 push offset aDLogin ; "'%d': login"_text:00434CDD push ebx ; __int16_text:00434CDE push offset stru_0_596558 ; lpCriticalSection_text:00434CE3 call sub_0_4AA400_text:00434CE8 add esp, 10h_text:00434CEB_text:00434CEB loc_0_434CEB: ; CODE XREF: UserLogin+205j_text:00434CEB pop edi_text:00434CEC pop esi_text:00434CED pop ebp_text:00434CEE xor eax, eax_text:00434CF0 pop ebx_text:00434CF1 add esp, 0A8h_text:00434CF7 retn 10hsub_0_50AE20这个子函数的功能就是接收数据并解密, 接收了两个参数,用于接收数据的Buf, 以及Buf的长度对sub_0_50AE20进行分析如下_text:0050AE20 push ecx_text:0050AE21 push ebx_text:0050AE22 mov ebx, [esp+8+buf]_text:0050AE26 push ebp_text:0050AE27 push esi_text:0050AE28 mov esi, ecx_text:0050AE2A push edi_text:0050AE2B mov edi, [esp+14h+len]_text:0050AE2F mov [esp+14h+var_4], 0Ah_text:0050AE37 mov eax, [esi+4]_text:0050AE3A mov ebp, ebx_text:0050AE3C cmp eax, 0FFFFFFFFh_text:0050AE3F jz loc_0_50AF12_text:0050AE45 test ebx, ebx_text:0050AE47 jz loc_0_50AF12_text:0050AE4D test edi, edi_text:0050AE4F jl loc_0_50AF12_text:0050AE55 jle short loc_0_50AEA4_text:0050AE57_text:0050AE57 loc_0_50AE57: ; CODE XREF: sub_0_50AE20+7Ej_text:0050AE57 mov eax, [esi+4]_text:0050AE5A push 0 ; flags_text:0050AE5C push edi ; len_text:0050AE5D push ebp ; buf_text:0050AE5E push eax ; s_text:0050AE5F call recv ; 从socket接收数据_text:0050AE64 cmp eax, 1_text:0050AE67 jge short loc_0_50AE8C ; 更新接收字节计数器, 地址5A1090_text:0050AE69 call WSAGetLastError ; 接收失败时取错误信息_text:0050AE6E cmp eax, 2733h_text:0050AE73 jnz short loc_0_50AEF2_text:0050AE75 mov eax, [esp+14h+var_4]_text:0050AE79 dec eax_text:0050AE7A test eax, eax_text:0050AE7C mov [esp+14h+var_4], eax_text:0050AE80 jle short loc_0_50AEF2_text:0050AE82 push 64h ; dwMilliseconds_text:0050AE84 call ds:Sleep_text:0050AE8A jmp short loc_0_50AE9C_text:0050AE8C ; ---------------------------------------------------------------------------_text:0050AE8C_text:0050AE8C loc_0_50AE8C: ; CODE XREF: sub_0_50AE20+47j_text:0050AE8C push eax ; Value_text:0050AE8D push offset dword_0_5A1090 ; Addend_text:0050AE92 sub edi, eax_text:0050AE94 add ebp, eax_text:0050AE96 call ds:InterlockedExchangeAdd_text:0050AE9C_text:0050AE9C loc_0_50AE9C: ; CODE XREF: sub_0_50AE20+6Aj_text:0050AE9C test edi, edi_text:0050AE9E jg short loc_0_50AE57_text:0050AEA0 mov edi, [esp+14h+len]_text:0050AEA4_text:0050AEA4 loc_0_50AEA4: ; CODE XREF: sub_0_50AE20+35j_text:0050AEA4 xor eax, eax_text:0050AEA6 test edi, edi ; EDI Buffer的长度_text:0050AEA6 ; EBX Buffer指针_text:0050AEA8 jle short loc_0_50AEE5_text:0050AEAA_text:0050AEAA loc_0_50AEAA: ; CODE XREF: sub_0_50AE20+C3j_text:0050AEAA mov edx, [esi+1B0h] ; 已变换的计数器_text:0050AEB0 and edx, 0Fh_text:0050AEB3 mov cl, [edx+esi+18Ch] ; 指向MD5PSW, 取其中一字节_text:0050AEBA mov dl, [esi+1ACh] ; 上一字节的变换结果, 初始为0_text:0050AEC0 add cl, dl_text:0050AEC2 mov dl, [eax+ebx]_text:0050AEC5 xor dl, cl_text:0050AEC7 mov [eax+ebx], dl_text:0050AECA mov ebp, [esi+1B0h]_text:0050AED0 movsx edx, dl_text:0050AED3 inc ebp_text:0050AED4 inc eax_text:0050AED5 cmp eax, edi_text:0050AED7 mov [esi+1ACh], edx ; 上次变换的结果_text:0050AEDD mov [esi+1B0h], ebp_text:0050AEE3 jl short loc_0_50AEAA ; 已变换的计数器_text:0050AEE5_text:0050AEE5 loc_0_50AEE5: ; CODE XREF: sub_0_50AE20+88j_text:0050AEE5 pop edi_text:0050AEE6 pop esi_text:0050AEE7 pop ebp_text:0050AEE8 mov eax, 1_text:0050AEED pop ebx_text:0050AEEE pop ecx_text:0050AEEF retn 8
解密是通过将上一字节以及MD5Psw(密码MD5运算的结果)中的一个字节做为参数, 进行异或运算,每一字节都是基于上一字节加密的, 由于第一字节使用随机数, 后面相同的内容也会加密成不一样的, 即
当前字节密文 = 当前字节明文 异或 (上一字节密文 + 密钥字节)
将通讯内容拦截下来,根据以上信息即可得到明文信息。
2 0
- MT4客户端通讯分析(二)——数据包解密
- MT4客户端通讯分析(一)——登录部分分析
- Netty源码分析(二)—客户端初始化
- mt4
- MT4
- mt4
- USB协议之二 数据包分析
- jrtplib 源码分析 (二) 数据包
- TCP(二)客户端和服务器通讯
- Linux内核IP Queue机制的分析(二)——用户态处理并回传数据包
- Linux内核IP Queue机制的分析(二)——用户态处理并回传数据包
- Linux内核IP Queue机制的分析(二)——用户态处理并回传数据包
- Linux内核IP Queue机制的分析(二)——用户态处理并回传数据包
- 一切成功源于积累——20141115 MT4交易平台心得
- 数据包加密和解密
- 并行计算(二)——通讯
- 并行计算(二)——通讯
- 数据包接收系列 — IP协议处理流程(二)
- tomcat 设置启动参数(linux 和 windows)
- MVC中的KendoGrid里的一种传值方式
- start.S进一步、更详细的、深入的解释和分析 2013.04.26更新(五)
- ngrok原理浅析
- Windows下pip安装包报错:Microsoft Visual C++ 9.0 is required Unable to find vcvarsall.bat
- MT4客户端通讯分析(二)——数据包解密
- Anemometer和pt-query-digest结合将MySQL慢查询可视化
- html仿今日头条数据列表
- 第87讲:Flume推送数据到SparkStreaming案例实战和内幕源码解密
- IEEE中的浮点编码计算
- 设计模式之六大原则——迪米特法则(LoD,LKP)
- android studio新建project的时候connect refused:connect或者卡在building project...或Refreshing
- HashTable剖析
- CCTF 2016 WriteUp(部分)