﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Phrancol's blog-文章分类-反汇编</title><link>http://www.blogjava.net/Phrancol/category/31828.html</link><description>To be surprised,to wonder,is to begin to understand.</description><language>zh-cn</language><lastBuildDate>Mon, 09 Jun 2008 07:22:49 GMT</lastBuildDate><pubDate>Mon, 09 Jun 2008 07:22:49 GMT</pubDate><ttl>60</ttl><item><title>[原]MIR3G反汇编分析（一）——命令体二次解密</title><link>http://www.blogjava.net/Phrancol/articles/206529.html</link><dc:creator>Phrancol Yang</dc:creator><author>Phrancol Yang</author><pubDate>Sat, 07 Jun 2008 08:06:00 GMT</pubDate><guid>http://www.blogjava.net/Phrancol/articles/206529.html</guid><wfw:comment>http://www.blogjava.net/Phrancol/comments/206529.html</wfw:comment><comments>http://www.blogjava.net/Phrancol/articles/206529.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Phrancol/comments/commentRss/206529.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Phrancol/services/trackbacks/206529.html</trackback:ping><description><![CDATA[服务器每次发来的密文，类似于<br />
#eLrBHMNx&lt;F=hgmlYA]X]ENtpGM`X@?PuN`LwT_m&gt;RmleJ_l{PAMHQ?pUCpdbENa&lt;F`pjBllQC=HSC\\pT?LduQ_y=PQM&gt;JptK!<br />
命令体部分经过普通解密后，还需要根据一个掩码来进行二次解密<br />
<br />
这里是二次解密命令体的部分<br />
&nbsp; push&nbsp;&nbsp;&nbsp; ebp<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ebp, esp<br />
&nbsp; and&nbsp;&nbsp;&nbsp;&nbsp; esp, FFFFFFF8<br />
&nbsp; push&nbsp;&nbsp;&nbsp; -1<br />
&nbsp; push&nbsp;&nbsp;&nbsp; 004C833C<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr fs:[0]<br />
&nbsp; push&nbsp;&nbsp;&nbsp; eax<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr fs:[0], esp<br />
&nbsp; push&nbsp;&nbsp;&nbsp; ecx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, 549C<br />
&nbsp; call&nbsp;&nbsp;&nbsp; 004BC0B0<br />
&nbsp; push&nbsp;&nbsp;&nbsp; ebx<br />
&nbsp; push&nbsp;&nbsp;&nbsp; esi<br />
&nbsp; push&nbsp;&nbsp;&nbsp; edi<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; edi, dword ptr [ebp+8]<br />
&nbsp; cmp&nbsp;&nbsp;&nbsp;&nbsp; byte ptr [edi], 2B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;------判断第一个字节是否为 +<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ebx, ecx<br />
&nbsp; jnz L029<br />
&nbsp; inc&nbsp;&nbsp;&nbsp;&nbsp; edi<br />
&nbsp; push&nbsp;&nbsp;&nbsp; edi<br />
&nbsp; call&nbsp;&nbsp;&nbsp; 0042B0D0<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [esp+54AC]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr fs:[0], ecx<br />
&nbsp; pop&nbsp;&nbsp;&nbsp;&nbsp; edi<br />
&nbsp; pop&nbsp;&nbsp;&nbsp;&nbsp; esi<br />
&nbsp; pop&nbsp;&nbsp;&nbsp;&nbsp; ebx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; esp, ebp<br />
&nbsp; pop&nbsp;&nbsp;&nbsp;&nbsp; ebp<br />
&nbsp; retn&nbsp;&nbsp;&nbsp; 4<br />
L029:<br />
&nbsp; push&nbsp;&nbsp;&nbsp; edi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;-----&nbsp;&nbsp; 密文<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [esp+3C]<br />
&nbsp; push&nbsp;&nbsp;&nbsp; eax&nbsp;&nbsp;&nbsp;&lt;------&nbsp; 密文解密后被保存在这里<br />
&nbsp; call&nbsp;&nbsp;&nbsp; 004A0CE0<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; cx, word ptr [ebx+49B162]<br />
&nbsp; xor&nbsp;&nbsp;&nbsp;&nbsp; word ptr [esp+3C], cx<br />
&nbsp; xor&nbsp;&nbsp;&nbsp;&nbsp; edx, edx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dh, byte ptr [esp+43]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; cl, byte ptr [ebx+49B161]<br />
&nbsp; xor&nbsp;&nbsp;&nbsp;&nbsp; eax, eax<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ah, byte ptr [esp+3F]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dl, byte ptr [esp+41]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; al, byte ptr [esp+3D]<br />
&nbsp; shl&nbsp;&nbsp;&nbsp;&nbsp; edx, 10<br />
&nbsp; or&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; edx, eax<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; al, byte ptr [ebx+49B160]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; esi, edx<br />
&nbsp; xor&nbsp;&nbsp;&nbsp;&nbsp; cl, byte ptr [esp+3C]<br />
&nbsp; xor&nbsp;&nbsp;&nbsp;&nbsp; edx, edx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dh, cl<br />
&nbsp; xor&nbsp;&nbsp;&nbsp;&nbsp; al, byte ptr [esp+38]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+1C], esi<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dl, al<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [esp+38]<br />
&nbsp; shr&nbsp;&nbsp;&nbsp;&nbsp; eax, 10<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; cx, dx<br />
&nbsp; movzx&nbsp;&nbsp; dx, byte ptr [esp+39]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dh, byte ptr [esp+3E]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; word ptr [esp+20], cx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; word ptr [esp+22], dx<br />
&nbsp; xor&nbsp;&nbsp;&nbsp;&nbsp; edx, edx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dh, byte ptr [esp+40]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dl, al<br />
&nbsp; movzx&nbsp;&nbsp; ax, ah<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ah, byte ptr [esp+42]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; word ptr [esp+24], dx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; word ptr [esp+26], ax<br />
&nbsp; movzx&nbsp;&nbsp; eax, cx<br />
&nbsp; add&nbsp;&nbsp;&nbsp;&nbsp; eax, -138A<br />
&nbsp; cmp&nbsp;&nbsp;&nbsp;&nbsp; eax, 123<br />
&nbsp; ja&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0043BF9D<br />
&nbsp; movzx&nbsp;&nbsp; ecx, byte ptr [eax+43C220]<br />
&nbsp; jmp&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [ecx*4+43BFB4]<br />
<br />
在 MIR3G二次加解密反汇编分析（三）——跟踪&nbsp; 中有4个赋值<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; byte ptr [ebx+49B160], al<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; byte ptr [ebx+49B161], ah<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; word ptr [ebx+49B162], ax<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; word ptr [ebx+49B164], ax<br />
这就是命令体二次解密时的掩码<br />
<br />
<strong style="color: #ff0000">从一次解密的消息体中提取掩码的部分<br />
</strong>&nbsp; sub&nbsp;&nbsp;&nbsp;&nbsp; eax, edx<br />
&nbsp; cmp&nbsp;&nbsp;&nbsp;&nbsp; eax, 3C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;判断消息体长度是否为60<br />
&nbsp; jnz&nbsp;&nbsp;&nbsp;&nbsp; 0043BF9D<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [esp+CA8]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; esp+CA8保存的就是经过一次解密的消息体（不包含命令体）<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; edx, dword ptr [esp+CAC]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [esp+CB0]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+38], ecx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [esp+CB4]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+44], ecx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [esp+CC0]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+3C], edx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; edx, dword ptr [esp+CB8]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+40], eax<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [esp+CBC]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+54], ecx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [esp+CCC]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+48], edx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; edx, dword ptr [esp+CC4]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+50], eax<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [esp+CC8]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+60], ecx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [esp+CD8]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+58], edx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; edx, dword ptr [esp+CD0]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+5C], eax<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [esp+CD4]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+24], ecx<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [esp+1C]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+1C], edx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;最后20个字节<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; edx, dword ptr [esp+CDC]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+20], eax<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [esp+CE0]<br />
&nbsp; push&nbsp;&nbsp;&nbsp; ecx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, ebx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; byte ptr [esp+50], 0<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; byte ptr [esp+68], 0<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+2C], edx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+30], eax<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; byte ptr [esp+34], 0<br />
&nbsp; call&nbsp;&nbsp;&nbsp; 0042BD60<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; edx, dword ptr [esp+38]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 前20个字节<br />
&nbsp; push&nbsp;&nbsp;&nbsp; edx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, ebx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; byte ptr [ebx+49B160], al<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; byte ptr [ebx+49B161], ah<br />
&nbsp; call&nbsp;&nbsp;&nbsp; 0042BD60<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; word ptr [ebx+49B162], ax<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [esp+50]<br />
&nbsp; push&nbsp;&nbsp;&nbsp; eax<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, ebx<br />
&nbsp; call&nbsp;&nbsp;&nbsp; 0042BD60<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; word ptr [ebx+49B164], ax<br />
<br />
<br />
<strong style="color: #ff0000">提取掩码的函数 0042BD60</strong><br />
&nbsp; push&nbsp;&nbsp;&nbsp; ebx<br />
&nbsp; push&nbsp;&nbsp;&nbsp; esi<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; esi, dword ptr [esp+C]&nbsp; esi = arg1&nbsp;&nbsp;&nbsp; ;消息体<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, esi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eax = arg1<br />
&nbsp; xor&nbsp;&nbsp;&nbsp;&nbsp; ebx, ebx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ebx = 0<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; edx, dword ptr [eax+1]&nbsp; edx = arg+1 ，从第二个字节开始<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [ecx]<br />
L007:<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; cl, byte ptr [eax]<br />
&nbsp; inc&nbsp;&nbsp;&nbsp;&nbsp; eax<br />
&nbsp; test&nbsp;&nbsp;&nbsp; cl, cl<br />
&nbsp; jnz L007&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; sub&nbsp;&nbsp;&nbsp;&nbsp; eax, edx<br />
&nbsp; cmp&nbsp;&nbsp;&nbsp;&nbsp; eax, 14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 检查参数长度是否是20<br />
&nbsp; jnb L018<br />
&nbsp; pop&nbsp;&nbsp;&nbsp;&nbsp; esi<br />
&nbsp; xor&nbsp;&nbsp;&nbsp;&nbsp; ax, ax<br />
&nbsp; pop&nbsp;&nbsp;&nbsp;&nbsp; ebx<br />
&nbsp; retn&nbsp;&nbsp;&nbsp; 4<br />
L018:<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;eax =2<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; edx, dword ptr [esi+1] ;edx指向第二个字节&nbsp; edx = 1<br />
&nbsp; push&nbsp;&nbsp;&nbsp; edi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
L022:<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; cl, byte ptr [edx-1]&nbsp;&nbsp; ;cl = arg[edx-1]<br />
&nbsp; movzx&nbsp;&nbsp; esi, byte ptr [edx+8]&nbsp; ;esi = ((long)(arg[edx+8]))<br />
&nbsp; movzx&nbsp;&nbsp; ecx, cl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;ecx = ((long)cl)<br />
&nbsp; add&nbsp;&nbsp;&nbsp;&nbsp; esi, ecx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;esi = esi+ecx<br />
&nbsp; movzx&nbsp;&nbsp; ecx, byte ptr [edx]&nbsp;&nbsp;&nbsp; ;ecx = (long)arg[edx]<br />
&nbsp; cmp&nbsp;&nbsp;&nbsp;&nbsp; ecx, esi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;if(ecx &lt; esi) 跳转到 L033<br />
&nbsp; jl L033<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [eax-2] ; ecx = eax-2<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; edi, 8000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; edi = 0x8000<br />
&nbsp; sar&nbsp;&nbsp;&nbsp;&nbsp; edi, cl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; edi = edi &gt;&gt; cl<br />
&nbsp; or&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ebx, edi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; ebx = ebx | edi<br />
L033:<br />
&nbsp; movzx&nbsp;&nbsp; ecx, byte ptr [edx+1]&nbsp; ;ecx = (long)arg[edx+1]<br />
&nbsp; cmp&nbsp;&nbsp;&nbsp;&nbsp; ecx, esi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;if(ecx&lt;esi) 跳转到 L040<br />
&nbsp; jl L040<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [eax-1] ;ecx = eax-2<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; edi, 8000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;edi = 0x8000<br />
&nbsp; sar&nbsp;&nbsp;&nbsp;&nbsp; edi, cl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;edi = edi &gt;&gt; arg[eax-1]<br />
&nbsp; or&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ebx, edi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;ebx = ebx | edi<br />
L040:<br />
&nbsp; movzx&nbsp;&nbsp; ecx, byte ptr [edx+2]&nbsp; ;ecx = (long)arg[edx+2]<br />
&nbsp; cmp&nbsp;&nbsp;&nbsp;&nbsp; ecx, esi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;if(ecx &lt; esi) 跳转到 L047<br />
&nbsp; jl L047<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; edi, 8000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;edi = 0x8000<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;ecx = eax<br />
&nbsp; sar&nbsp;&nbsp;&nbsp;&nbsp; edi, cl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;edi = edi &gt;&gt; cl<br />
&nbsp; or&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ebx, edi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;ebx = ebx | edi<br />
L047:<br />
&nbsp; movzx&nbsp;&nbsp; ecx, byte ptr [edx+3]&nbsp; ;ecx = (long)arg[edx+3]<br />
&nbsp; cmp&nbsp;&nbsp;&nbsp;&nbsp; ecx, esi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; if(ecx &lt; esi) 跳转到 L054<br />
&nbsp; jl L054<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [eax+1] ;ecx = eax+1<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; edi, 8000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;edi = 0x8000 <br />
&nbsp; sar&nbsp;&nbsp;&nbsp;&nbsp; edi, cl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;edi = edi &gt;&gt; cl<br />
&nbsp; or&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ebx, edi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;ebx = ebx | edi<br />
L054:<br />
&nbsp; movzx&nbsp;&nbsp; ecx, byte ptr [edx+4]&nbsp; ;ecx = (long)arg[edx+4]<br />
&nbsp; cmp&nbsp;&nbsp;&nbsp;&nbsp; ecx, esi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; if(ecx &lt; esi) 跳转到 L061<br />
&nbsp; jl L061<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [eax+2] ;ecx = eax+2<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; edi, 8000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;edi = 0x8000 <br />
&nbsp; sar&nbsp;&nbsp;&nbsp;&nbsp; edi, cl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;edi = edi &gt;&gt; cl<br />
&nbsp; or&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ebx, edi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;ebx = ebx | edi<br />
L061:<br />
&nbsp; movzx&nbsp;&nbsp; ecx, byte ptr [edx+5]&nbsp;&nbsp; ;ecx = (long)arg[edx+5]<br />
&nbsp; cmp&nbsp;&nbsp;&nbsp;&nbsp; ecx, esi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; if(ecx &lt; esi) 跳转到 L068<br />
&nbsp; jl L068<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [eax+3] ;ecx = eax+3<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; edi, 8000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;edi = 0x8000<br />
&nbsp; sar&nbsp;&nbsp;&nbsp;&nbsp; edi, cl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;edi = edi &gt;&gt; cl<br />
&nbsp; or&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ebx, edi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;ebx = ebx | edi<br />
L068:<br />
&nbsp; movzx&nbsp;&nbsp; ecx, byte ptr [edx+6]&nbsp; ;ecx = (long)arg[edx+6]<br />
&nbsp; cmp&nbsp;&nbsp;&nbsp;&nbsp; ecx, esi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; if(ecx &lt; esi) 跳转到 L075<br />
&nbsp; jl L075<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [eax+4] ;ecx = eax+4<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; edi, 8000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;edi = 0x8000<br />
&nbsp; sar&nbsp;&nbsp;&nbsp;&nbsp; edi, cl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;edi = edi &gt;&gt; cl<br />
&nbsp; or&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ebx, edi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;ebx = ebx | edi<br />
L075:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; movzx&nbsp;&nbsp; ecx, byte ptr [edx+7]&nbsp;&nbsp; ;ecx = (long)arg[edx+7]<br />
&nbsp; cmp&nbsp;&nbsp;&nbsp;&nbsp; ecx, esi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; if(ecx &lt; esi) 跳转到 L082<br />
&nbsp; jl L082<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [eax+5] ;ecx = eax+5<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; esi, 8000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;edi = 0x8000<br />
&nbsp; sar&nbsp;&nbsp;&nbsp;&nbsp; esi, cl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;edi = edi &gt;&gt; cl<br />
&nbsp; or&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ebx, esi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;ebx = ebx | edi<br />
L082:<br />
&nbsp; add&nbsp;&nbsp;&nbsp;&nbsp; eax, 8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;eax = eax+8<br />
&nbsp; add&nbsp;&nbsp;&nbsp;&nbsp; edx, 0A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;edx = edx+0x0A<br />
&nbsp; cmp&nbsp;&nbsp;&nbsp;&nbsp; eax, 0A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;if(eax &lt;= 0X0A) 跳转到 L022<br />
&nbsp; jle L022<br />
&nbsp; movzx&nbsp;&nbsp; edx, bl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;edx = (long)bl&nbsp;&nbsp; 低8位0扩展<br />
&nbsp; movzx&nbsp;&nbsp; eax, bh&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;eax = (long)bh&nbsp;&nbsp; 高8位0扩展<br />
&nbsp; pop&nbsp;&nbsp;&nbsp;&nbsp; edi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;<br />
&nbsp; xor&nbsp;&nbsp;&nbsp;&nbsp; edx, 87&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;edx = edx ^ 0x87<br />
&nbsp; xor&nbsp;&nbsp;&nbsp;&nbsp; eax, 87&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;eax = eax ^ 0x87<br />
&nbsp; shl&nbsp;&nbsp;&nbsp;&nbsp; edx, 8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;edx &lt;&lt; 8<br />
&nbsp; pop&nbsp;&nbsp;&nbsp;&nbsp; esi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; or&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eax, edx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;eax = eax | edx&nbsp;&nbsp;<br />
&nbsp; pop&nbsp;&nbsp;&nbsp;&nbsp; ebx<br />
&nbsp; retn&nbsp;&nbsp;&nbsp; 4<br />
<br />
至此，消息的加解密部分已经全部还原 
<img src ="http://www.blogjava.net/Phrancol/aggbug/206529.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Phrancol/" target="_blank">Phrancol Yang</a> 2008-06-07 16:06 <a href="http://www.blogjava.net/Phrancol/articles/206529.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[原]MIR3G二次加解密反汇编分析（四）——还原</title><link>http://www.blogjava.net/Phrancol/articles/205936.html</link><dc:creator>Phrancol Yang</dc:creator><author>Phrancol Yang</author><pubDate>Sat, 07 Jun 2008 02:20:00 GMT</pubDate><guid>http://www.blogjava.net/Phrancol/articles/205936.html</guid><wfw:comment>http://www.blogjava.net/Phrancol/comments/205936.html</wfw:comment><comments>http://www.blogjava.net/Phrancol/articles/205936.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Phrancol/comments/commentRss/205936.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Phrancol/services/trackbacks/205936.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在上一篇的跟踪中，调试后发现二次加密的密匙其实就是一个常量008B480C，分析一下整个二次加密的过程，以下代码均在VC6.0中运行通过，加密后数据与客户端实际发送数据一致。函数1&nbsp;- _declspec(naked) void _stdcall getEncryptMsg(long *nIdentity, char * dest)nIdentity - 008B480C...&nbsp;&nbsp;<a href='http://www.blogjava.net/Phrancol/articles/205936.html'>阅读全文</a><img src ="http://www.blogjava.net/Phrancol/aggbug/205936.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Phrancol/" target="_blank">Phrancol Yang</a> 2008-06-07 10:20 <a href="http://www.blogjava.net/Phrancol/articles/205936.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[原]MIR3G二次加解密反汇编分析（三）——跟踪 </title><link>http://www.blogjava.net/Phrancol/articles/205195.html</link><dc:creator>Phrancol Yang</dc:creator><author>Phrancol Yang</author><pubDate>Sun, 01 Jun 2008 12:12:00 GMT</pubDate><guid>http://www.blogjava.net/Phrancol/articles/205195.html</guid><wfw:comment>http://www.blogjava.net/Phrancol/comments/205195.html</wfw:comment><comments>http://www.blogjava.net/Phrancol/articles/205195.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Phrancol/comments/commentRss/205195.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Phrancol/services/trackbacks/205195.html</trackback:ping><description><![CDATA[<p>根据3EF找到生成命令体的函数，该函数只有一个参数——消息体，转到上一个函数得到以下代码</p>
<p>&nbsp; push&nbsp;&nbsp;&nbsp; 1FFF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;1FFF入栈<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [esp+CAC] ;(3244)&nbsp; 距离栈顶811个存储单元 <br />
&nbsp; push&nbsp;&nbsp;&nbsp; eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;eax入栈 解密后要存入的地址入栈<br />
&nbsp; add&nbsp;&nbsp;&nbsp;&nbsp; edi, 10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;edi=从字符串第17个字节开始往后的串<br />
&nbsp; push&nbsp;&nbsp;&nbsp; edi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;密文入栈 <br />
&nbsp; call&nbsp;&nbsp;&nbsp; 004A0BD0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;跟进发现这是普通的一次解密，解密后数据存在esp+CAC里 <br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; byte ptr [esp+eax+CA8], 0 <br />
&nbsp; xor&nbsp;&nbsp;&nbsp;&nbsp; eax, eax<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, 100&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;ecx=100 (256) 循环次数<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; edi, dword ptr [esp+3F8]&nbsp;&nbsp; ;edi<br />
&nbsp; rep&nbsp;&nbsp;&nbsp;&nbsp; stos dword ptr es:[edi]&nbsp;&nbsp;&nbsp; ;<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [esp+3F8]&nbsp;&nbsp; <br />
&nbsp; push&nbsp;&nbsp;&nbsp; ecx<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; edx, dword ptr [ebx+3CD864]<br />
&nbsp; push&nbsp;&nbsp;&nbsp; edx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, ebx<br />
&nbsp; call&nbsp;&nbsp;&nbsp; 0042C440&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;二次解密，生成回复密文<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [esp+3F8]<br />
&nbsp; push&nbsp;&nbsp;&nbsp; eax<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, 004D5C70&nbsp; <br />
&nbsp; call&nbsp;&nbsp;&nbsp; 0049F770&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;调用messageSend(char* msg)<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [esp+CA8]<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; edx, dword ptr [eax+1]<br />
L023:<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; cl, byte ptr [eax]<br />
&nbsp; inc&nbsp;&nbsp;&nbsp;&nbsp; eax<br />
&nbsp; test&nbsp;&nbsp;&nbsp; cl, cl<br />
&nbsp; jnz L023<br />
&nbsp; sub&nbsp;&nbsp;&nbsp;&nbsp; eax, edx<br />
&nbsp; cmp&nbsp;&nbsp;&nbsp;&nbsp; eax, 3C<br />
&nbsp; jnz&nbsp;&nbsp;&nbsp;&nbsp; 0043BF9D<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [esp+CA8]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; edx, dword ptr [esp+CAC]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [esp+CB0]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+38], ecx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [esp+CB4]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+44], ecx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [esp+CC0]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+3C], edx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; edx, dword ptr [esp+CB8]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+40], eax<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [esp+CBC]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+54], ecx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [esp+CCC]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+48], edx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; edx, dword ptr [esp+CC4]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+50], eax<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [esp+CC8]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+60], ecx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [esp+CD8]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+58], edx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; edx, dword ptr [esp+CD0]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+5C], eax<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [esp+CD4]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+24], ecx<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [esp+1C]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+1C], edx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; edx, dword ptr [esp+CDC]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+20], eax<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [esp+CE0]<br />
&nbsp; push&nbsp;&nbsp;&nbsp; ecx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, ebx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; byte ptr [esp+50], 0<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; byte ptr [esp+68], 0<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+2C], edx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esp+30], eax<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; byte ptr [esp+34], 0<br />
&nbsp; call&nbsp;&nbsp;&nbsp; 0042BD60<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; edx, dword ptr [esp+38]<br />
&nbsp; push&nbsp;&nbsp;&nbsp; edx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, ebx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; byte ptr [ebx+49B160], al<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; byte ptr [ebx+49B161], ah<br />
&nbsp; call&nbsp;&nbsp;&nbsp; 0042BD60<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; word ptr [ebx+49B162], ax<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [esp+50]<br />
&nbsp; push&nbsp;&nbsp;&nbsp; eax<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, ebx<br />
&nbsp; call&nbsp;&nbsp;&nbsp; 0042BD60<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; word ptr [ebx+49B164], ax<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [esp+54AC]<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr fs:[0], ecx<br />
&nbsp; pop&nbsp;&nbsp;&nbsp;&nbsp; edi<br />
&nbsp; pop&nbsp;&nbsp;&nbsp;&nbsp; esi<br />
&nbsp; pop&nbsp;&nbsp;&nbsp;&nbsp; ebx<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; esp, ebp<br />
&nbsp; pop&nbsp;&nbsp;&nbsp;&nbsp; ebp<br />
&nbsp; retn&nbsp;&nbsp;&nbsp; 4</p>
<p><br />
分析以上代码可以简单得出以下结论<br />
1. 从call&nbsp; 004A0BD0 的调用可以简单分析出二次密文可能也是标准消息结构<br />
2. 通过对比未更新版本与最新版本对3EF的发送情况，未更新版本发送3EF时，消息体是空，命令体其他参数不为0，再细分析，<br />
未更新的版本的3EF其实就是割肉的命令...........<br />
最新版本的客户端收到二次密文后，经过一些处理，以3EF为命令发向服务器<br />
3. 从add edi, 10可以猜测，二次密文的命令体可能是迷惑人用的<br />
4. 从call 0049F770这个调用断定 esp+3F8 就是二次解密后的明文<br />
5. 对于call 0042C440这个调用，可以猜测，这个就是二次解密的函数<br />
6. 服务器发来的密文对于本次解密是没有影响的，只是对它进行了一些操作，生成了4个数并进行如下保存<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; byte ptr [ebx+49B160], al<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; byte ptr [ebx+49B161], ah<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; word ptr [ebx+49B162], ax<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; word ptr [ebx+49B164], ax<br />
7. 二次解密函数有2个参数: arg1 = dword ptr [ebx+3CD864] , arg2 = [esp+3F8]<br />
&nbsp;&nbsp; 也就是根据dword ptr [ebx+3CD864]来生成解密明文，并存入地址esp+3F8，于是ebx+3CD864就成了解密的关键<br />
</p>
  <img src ="http://www.blogjava.net/Phrancol/aggbug/205195.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Phrancol/" target="_blank">Phrancol Yang</a> 2008-06-01 20:12 <a href="http://www.blogjava.net/Phrancol/articles/205195.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[原]MIR3G二次加解密反汇编分析（二）——分析</title><link>http://www.blogjava.net/Phrancol/articles/205127.html</link><dc:creator>Phrancol Yang</dc:creator><author>Phrancol Yang</author><pubDate>Sun, 01 Jun 2008 02:48:00 GMT</pubDate><guid>http://www.blogjava.net/Phrancol/articles/205127.html</guid><wfw:comment>http://www.blogjava.net/Phrancol/comments/205127.html</wfw:comment><comments>http://www.blogjava.net/Phrancol/articles/205127.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Phrancol/comments/commentRss/205127.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Phrancol/services/trackbacks/205127.html</trackback:ping><description><![CDATA[<p>数据发送接收情况:<br />
........客户端与Gateserver,Loginserver的数据互换，省略<br />
1. 客户端向Gameserver发送[**登录用户名/角色名/验证数1/验证数2/版本验证数/1/0]<br />
2. Gameserver向客户端发送密文，类似#eLrBHMNx&lt;F=hgmlYA]X]ENtpGM`X@?PuN`LwT_m&gt;RmleJ_l{PAMHQ?pUCpdbENa&lt;F`pjBllQC=HSC\\pT?LduQ_y=PQM&gt;JptK!<br />
3. 客户端向Gameserver发送解密后密文，类似#3&lt;&lt;&lt;&lt;&lt;Jx?&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;A&gt;xZCNLSHoPpAnQRF?ljIaaUPmlSF^L_BmtfFODJA_X\\A]T`GNlq@L!<br />
........欢迎信息，装备信息等省略</p>
<p>数据格式<br />
[#][标识位][指令头][消息体][!]<br />
例如 #3&lt;&lt;&lt;&lt;&lt;B\\&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;mi{EhL!</p>
<p>命令结构体<br />
typedef struct tag_TDEFAULTMESSAGE<br />
{<br />
&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp;&nbsp;&nbsp; nRecog;<br />
&nbsp;&nbsp;&nbsp; WORD&nbsp;&nbsp;&nbsp; wIdent;&nbsp; 3EF<br />
&nbsp;&nbsp;&nbsp; WORD&nbsp;&nbsp;&nbsp; wParam;<br />
&nbsp;&nbsp;&nbsp; WORD&nbsp;&nbsp;&nbsp; wTag;<br />
&nbsp;&nbsp;&nbsp; WORD&nbsp;&nbsp;&nbsp; wSeries;<br />
} _TDEFAULTMESSAGE, *_LPTDEFAULTMESSAGE;</p>
<p>解密命令体&lt;&lt;&lt;&lt;&lt;Jx?&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;得到wIdent值是3EF(1007)，OD打开Mir3.exe，查找常量000003EF，跟踪进入，得到如下代码<br />
&gt;&gt;Method1(未知参数)<br />
&nbsp; push&nbsp;&nbsp;&nbsp; esi<br />
&nbsp; push&nbsp;&nbsp;&nbsp; edi<br />
&nbsp; push&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; <br />
&nbsp; push&nbsp;&nbsp;&nbsp; 0<br />
&nbsp; push&nbsp;&nbsp;&nbsp; 0<br />
&nbsp; push&nbsp;&nbsp;&nbsp; 0<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; esi, ecx<br />
&nbsp; push&nbsp;&nbsp;&nbsp; 3EF<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; edi, dword ptr [esi+18]&nbsp; ;esi+18 是命令结构体的首地址<br />
&nbsp; push&nbsp;&nbsp;&nbsp; edi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;命令结构体首地址<br />
&nbsp; call&nbsp;&nbsp;&nbsp; 004A0D00&nbsp;&nbsp;&nbsp; ;生成命令结构体 (edi,3ef,0,0,0,0)<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [esp+C] ; eax保存第一个参数<br />
&nbsp; push&nbsp;&nbsp;&nbsp; 0<br />
&nbsp; push&nbsp;&nbsp;&nbsp; eax<br />
&nbsp; push&nbsp;&nbsp;&nbsp; edi<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, esi&nbsp;&nbsp;&nbsp; ;传递this指针，<br />
&nbsp; call&nbsp;&nbsp;&nbsp; 0049E450&nbsp;&nbsp;&nbsp; ;发送数据，arg3: 0, arg2: 第一个参数, arg1: 命令结构体<br />
&nbsp; pop&nbsp;&nbsp;&nbsp;&nbsp; edi<br />
&nbsp; pop&nbsp;&nbsp;&nbsp;&nbsp; esi<br />
&nbsp; retn&nbsp;&nbsp;&nbsp; 4</p>
<p>简单分析，入栈的4个0和3EF,则对应结构体,该函数至少1个参数，目前不知这个参数是什么意思，跟进0049E450看看<br />
&gt;&gt;Method2(命令结构体,未知参数,0)<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [esp+4]&nbsp; ;eax=命令结构体<br />
&nbsp; push&nbsp;&nbsp;&nbsp; ebx<br />
&nbsp; push&nbsp;&nbsp;&nbsp; ebp<br />
&nbsp; push&nbsp;&nbsp;&nbsp; esi<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; esi, ecx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;得到this指针<br />
&nbsp; push&nbsp;&nbsp;&nbsp; 20<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; ebp, dword ptr [esi+24] ;esi+18是命令结构体，加密命令结构体得到的字符串保存在esi+24中<br />
&nbsp; push&nbsp;&nbsp;&nbsp; ebp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; push&nbsp;&nbsp;&nbsp; eax<br />
&nbsp; call&nbsp;&nbsp;&nbsp; 004A0CA0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;跟进发现是加密命令结构体,arg3: 20(32), arg2: esi+24, arg1: 命令结构体地址 <br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [esi+14] ;eax=esi+14=标识位<br />
&nbsp; cmp&nbsp;&nbsp;&nbsp;&nbsp; eax, 9 <br />
&nbsp; jl L015&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;如果标识位小于9，则跳到L015<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esi+14], 1&nbsp;&nbsp; ;否则标识位重设为1<br />
&nbsp; jmp L017<br />
L015:<br />
&nbsp; inc&nbsp;&nbsp;&nbsp;&nbsp; eax<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [esi+14], eax ;标识位自加1<br />
L017:<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; edx, dword ptr [esp+14] ;edx=第2个参数<br />
&nbsp; test&nbsp;&nbsp;&nbsp; edx, edx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;<br />
&nbsp; je L048&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;如果第2个参数为0，则跳转到L048<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [esp+18] ;eax=第3个参数: 0<br />
&nbsp; test&nbsp;&nbsp;&nbsp; eax, eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; push&nbsp;&nbsp;&nbsp; edi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; jnz L031&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;eax不等于0则跳转<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, edx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;eax=第2个参数<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; edi, dword ptr [eax+1]&nbsp; <br />
L026:<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; cl, byte ptr [eax]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;cl=第2个参数第1个字节<br />
&nbsp; inc&nbsp;&nbsp;&nbsp;&nbsp; eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; test&nbsp;&nbsp;&nbsp; cl, cl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;循环得到第一个参数的长度<br />
&nbsp; jnz L026&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;没到字符串尾则继续循环<br />
&nbsp; sub&nbsp;&nbsp;&nbsp;&nbsp; eax, edi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
L031:<br />
&nbsp; push&nbsp;&nbsp;&nbsp; 2000<br />
&nbsp; push&nbsp;&nbsp;&nbsp; eax<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; edi, dword ptr [esi+44]<br />
&nbsp; push&nbsp;&nbsp;&nbsp; edi<br />
&nbsp; push&nbsp;&nbsp;&nbsp; edx<br />
&nbsp; call&nbsp;&nbsp;&nbsp; 004A0B10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;调用加密函数，将edx加密，保存在esi+44中<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [esi+14]<br />
&nbsp; push&nbsp;&nbsp;&nbsp; edi<br />
&nbsp; push&nbsp;&nbsp;&nbsp; ebp<br />
&nbsp; push&nbsp;&nbsp;&nbsp; ecx<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; ebx, dword ptr [esi+2044]<br />
&nbsp; push&nbsp;&nbsp;&nbsp; 004CBFE4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; #%d%s%s!<br />
&nbsp; push&nbsp;&nbsp;&nbsp; ebx<br />
&nbsp; call&nbsp;&nbsp;&nbsp; 004BB568<br />
&nbsp; add&nbsp;&nbsp;&nbsp;&nbsp; esp, 14<br />
&nbsp; pop&nbsp;&nbsp;&nbsp;&nbsp; edi<br />
&nbsp; jmp L056<br />
L048:<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; edx, dword ptr [esi+14]<br />
&nbsp; push&nbsp;&nbsp;&nbsp; ebp<br />
&nbsp; push&nbsp;&nbsp;&nbsp; edx<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; ebx, dword ptr [esi+2044]<br />
&nbsp; push&nbsp;&nbsp;&nbsp; 004CBFC4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; #%d%s! <br />
&nbsp; push&nbsp;&nbsp;&nbsp; ebx<br />
&nbsp; call&nbsp;&nbsp;&nbsp; 004BB568&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;sprintf&nbsp; 格式化发送给服务器端的数据<br />
&nbsp; add&nbsp;&nbsp;&nbsp;&nbsp; esp, 10<br />
L056:<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, ebx<br />
&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; edx, dword ptr [eax+1]<br />
L058:<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; cl, byte ptr [eax]<br />
&nbsp; inc&nbsp;&nbsp;&nbsp;&nbsp; eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;这个循环得到数据长度<br />
&nbsp; test&nbsp;&nbsp;&nbsp; cl, cl<br />
&nbsp; jnz L058<br />
&nbsp; push&nbsp;&nbsp;&nbsp; 0<br />
&nbsp; sub&nbsp;&nbsp;&nbsp;&nbsp; eax, edx<br />
&nbsp; push&nbsp;&nbsp;&nbsp; eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; 数据长度<br />
&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [esi+6044]<br />
&nbsp; push&nbsp;&nbsp;&nbsp; ebx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; Data ，要发送的数据<br />
&nbsp; push&nbsp;&nbsp;&nbsp; eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; Socket对象<br />
&nbsp; call&nbsp;&nbsp;&nbsp; &lt;jmp.&amp;WS2_32.#19&gt;&nbsp;&nbsp; ;这里是调用send(Socket对象, 要发送的数据, 数据长度, 0 (flag));<br />
&nbsp; pop&nbsp;&nbsp;&nbsp;&nbsp; esi<br />
&nbsp; pop&nbsp;&nbsp;&nbsp;&nbsp; ebp<br />
&nbsp; pop&nbsp;&nbsp;&nbsp;&nbsp; ebx<br />
&nbsp; retn&nbsp;&nbsp;&nbsp; 0C</p>
<p>L017和L031说明Method1和Method2中的未知参数就是明文消息体，Method1只有1个消息体参数<br />
</p>
<p><br />
&nbsp;</p>
 <img src ="http://www.blogjava.net/Phrancol/aggbug/205127.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Phrancol/" target="_blank">Phrancol Yang</a> 2008-06-01 10:48 <a href="http://www.blogjava.net/Phrancol/articles/205127.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[原]MIR3G二次加解密反汇编分析（一）——初探</title><link>http://www.blogjava.net/Phrancol/articles/204124.html</link><dc:creator>Phrancol Yang</dc:creator><author>Phrancol Yang</author><pubDate>Fri, 30 May 2008 08:34:00 GMT</pubDate><guid>http://www.blogjava.net/Phrancol/articles/204124.html</guid><wfw:comment>http://www.blogjava.net/Phrancol/comments/204124.html</wfw:comment><comments>http://www.blogjava.net/Phrancol/articles/204124.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Phrancol/comments/commentRss/204124.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Phrancol/services/trackbacks/204124.html</trackback:ping><description><![CDATA[<p>突击了一个星期的汇编，再对照民间流传的传奇源码(C++版本)，基本摸清了这部分的代码</p>
<p>OD打开Mir3.exe(Mir3G_20070108) -&gt; ASCII -&gt;找到**%s/%s/%d/%d/%d/1/%d-&gt;双击，得到如下代码</p>
<p><br />
这段代码是将几个参数，使用sprintf生成字符串，然后6BIT加密，以#%d%s!格式发送到服务器端<br />
0049E2D0&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [esp+14]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; eax=arg5（第5个参数）<br />
0049E2D4&nbsp; sub&nbsp;&nbsp;&nbsp;&nbsp; esp, 600&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; 预留1536个存储单元<br />
0049E2DA&nbsp; push&nbsp;&nbsp;&nbsp; esi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
0049E2DB&nbsp; push&nbsp;&nbsp;&nbsp; edi<br />
0049E2DC&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; edi, dword ptr [&lt;&amp;USER32.wsprint&gt;;&nbsp; USER32.wsprintfA&nbsp;&nbsp;&nbsp; <br />
0049E2E2&nbsp; push&nbsp;&nbsp;&nbsp; eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; /&lt;%d&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;eax入栈<br />
**%s/%s/%d/%d/%d/1/arg5<br />
0049E2E3&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [esp+618]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; |&nbsp; eax = arg3<br />
0049E2EA&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; esi, ecx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; |<br />
0049E2EC&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [esp+61C]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; | ecx = arg4<br />
0049E2F3&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; edx, ecx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;edx=ecx=arg4<br />
0049E2F5&nbsp; xor&nbsp;&nbsp;&nbsp;&nbsp; edx, FA0280AF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; |&nbsp;&nbsp;&nbsp; edx=arg4异或FA0280AF&nbsp;<br />
0049E2FB&nbsp; push&nbsp;&nbsp;&nbsp; edx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; |&lt;%d&gt;&nbsp;&nbsp; edx入栈<br />
**%s/%s/%d/%d/arg4异或FA0280AF/1/arg5<br />
0049E2FC&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; edx, eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; edx=eax=arg3<br />
0049E2FE&nbsp; xor&nbsp;&nbsp;&nbsp;&nbsp; edx, ecx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; edx=arg3异或arg4<br />
0049E300&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [esp+614]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; |&nbsp;&nbsp; ecx=arg1<br />
0049E307&nbsp; xor&nbsp;&nbsp;&nbsp;&nbsp; edx, 5580AF27&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; edx = edx异或5580AF27<br />
0049E30D&nbsp; push&nbsp;&nbsp;&nbsp; edx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; |&lt;%d&gt;&nbsp;&nbsp; edx入栈<br />
**%s/%s/%d/arg3异或arg4再异或5580AF27/arg4异或FA0280AF/1/arg5<br />
0049E30E&nbsp; xor&nbsp;&nbsp;&nbsp;&nbsp; eax, 3EB2C5CC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; |&nbsp; eax = arg3异或3EB2C5CC<br />
0049E313&nbsp; push&nbsp;&nbsp;&nbsp; eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; |&lt;%d&gt;<br />
**%s/%s/arg3异或3EB2C5CC/arg3异或arg4再异或5580AF27/arg4异或FA0280AF/1/arg5<br />
0049E314&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [esp+620]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; | eax = arg2<br />
0049E31B&nbsp; push&nbsp;&nbsp;&nbsp; eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; |&lt;%s&gt; <br />
**%s/arg2/arg3异或3EB2C5CC/arg3异或arg4再异或5580AF27/arg4异或FA0280AF/1/arg5<br />
0049E31C&nbsp; push&nbsp;&nbsp;&nbsp; ecx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; |&lt;%s&gt;<br />
**arg1/arg2/arg3异或3EB2C5CC/arg3异或arg4再异或5580AF27/arg4异或FA0280AF/1/arg5<br />
0049E31D&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; edx, dword ptr [esp+220]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; |&nbsp; edx 指向上面预留的1536个存储单元中最后512个单元的首地址<br />
0049E324&nbsp; push&nbsp;&nbsp;&nbsp; 004CBFCC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; |**%s/%s/%d/%d/%d/1/%d<br />
0049E329&nbsp; push&nbsp;&nbsp;&nbsp; edx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; |s<br />
0049E32A&nbsp; call&nbsp;&nbsp;&nbsp; edi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; \wsprintfA&nbsp; edx指向生成的明文字符串首地址<br />
0049E32C&nbsp; add&nbsp;&nbsp;&nbsp;&nbsp; esp, 20&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; 前移32个存储单元<br />
0049E32F&nbsp; push&nbsp;&nbsp;&nbsp; 1FF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 512入栈&nbsp; &lt;加密函数第4个参数&gt;<br />
0049E334&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; eax, dword ptr [esp+20C]&nbsp; eax =明文字符串<br />
0049E33B&nbsp; push&nbsp;&nbsp;&nbsp; eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; /String&nbsp;&nbsp; <br />
0049E33C&nbsp; call&nbsp;&nbsp;&nbsp; dword ptr [&lt;&amp;KERNEL32.lstrlenA&gt;] ; \lstrlenA 得到明文的长度，保存在eax中<br />
0049E342&nbsp; push&nbsp;&nbsp;&nbsp; eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eax入栈&nbsp;&nbsp; 明文长度入栈&lt;加密函数第3个参数&gt;<br />
0049E343&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; ecx, dword ptr [esp+10]&nbsp;&nbsp;&nbsp;&nbsp; ecx=第一次入栈的edi的值，应该是某个成员变量<br />
0049E347&nbsp; push&nbsp;&nbsp;&nbsp; ecx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ecx入栈&lt;加密函数第2个参数&gt;<br />
0049E348&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp; edx, dword ptr [esp+214]&nbsp; <br />
0049E34F&nbsp; push&nbsp;&nbsp;&nbsp; edx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 明文字符串首&lt;加密函数第1个参数&gt;<br />
0049E350&nbsp; call&nbsp;&nbsp;&nbsp; 004A0B10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 调用加密函数<br />
fnEncode(char *strSrc, char *strDest, int lenSrc, 512)<br />
...................<br />
后面是发送信息</p>
 <img src ="http://www.blogjava.net/Phrancol/aggbug/204124.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Phrancol/" target="_blank">Phrancol Yang</a> 2008-05-30 16:34 <a href="http://www.blogjava.net/Phrancol/articles/204124.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>