随笔 - 1  文章 - 37  trackbacks - 0
<2024年5月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

留言簿(16)

随笔分类

随笔档案

文章分类

文章档案

test

搜索

  •  

最新评论

突击了一个星期的汇编,再对照民间流传的传奇源码(C++版本),基本摸清了这部分的代码

OD打开Mir3.exe(Mir3G_20070108) -> ASCII ->找到**%s/%s/%d/%d/%d/1/%d->双击,得到如下代码


这段代码是将几个参数,使用sprintf生成字符串,然后6BIT加密,以#%d%s!格式发送到服务器端
0049E2D0  mov     eax, dword ptr [esp+14]          ; eax=arg5(第5个参数)
0049E2D4  sub     esp, 600                                    ; 预留1536个存储单元
0049E2DA  push    esi                                           
0049E2DB  push    edi
0049E2DC  mov     edi, dword ptr [<&USER32.wsprint>;  USER32.wsprintfA   
0049E2E2  push    eax                              ; /<%d>      ;eax入栈
**%s/%s/%d/%d/%d/1/arg5
0049E2E3  mov     eax, dword ptr [esp+618]         ; |  eax = arg3
0049E2EA  mov     esi, ecx                         ; |
0049E2EC  mov     ecx, dword ptr [esp+61C]         ; | ecx = arg4
0049E2F3  mov     edx, ecx                         ; |             edx=ecx=arg4
0049E2F5  xor     edx, FA0280AF                    ; |    edx=arg4异或FA0280AF 
0049E2FB  push    edx                              ; |<%d>   edx入栈
**%s/%s/%d/%d/arg4异或FA0280AF/1/arg5
0049E2FC  mov     edx, eax                         ; |          edx=eax=arg3
0049E2FE  xor     edx, ecx                         ; |            edx=arg3异或arg4
0049E300  mov     ecx, dword ptr [esp+614]         ; |   ecx=arg1
0049E307  xor     edx, 5580AF27                    ; |      edx = edx异或5580AF27
0049E30D  push    edx                              ; |<%d>   edx入栈
**%s/%s/%d/arg3异或arg4再异或5580AF27/arg4异或FA0280AF/1/arg5
0049E30E  xor     eax, 3EB2C5CC                    ; |  eax = arg3异或3EB2C5CC
0049E313  push    eax                              ; |<%d>
**%s/%s/arg3异或3EB2C5CC/arg3异或arg4再异或5580AF27/arg4异或FA0280AF/1/arg5
0049E314  mov     eax, dword ptr [esp+620]         ; | eax = arg2
0049E31B  push    eax                              ; |<%s>
**%s/arg2/arg3异或3EB2C5CC/arg3异或arg4再异或5580AF27/arg4异或FA0280AF/1/arg5
0049E31C  push    ecx                              ; |<%s>
**arg1/arg2/arg3异或3EB2C5CC/arg3异或arg4再异或5580AF27/arg4异或FA0280AF/1/arg5
0049E31D  lea     edx, dword ptr [esp+220]         ; |  edx 指向上面预留的1536个存储单元中最后512个单元的首地址
0049E324  push    004CBFCC                         ; |**%s/%s/%d/%d/%d/1/%d
0049E329  push    edx                              ; |s
0049E32A  call    edi                              ; \wsprintfA  edx指向生成的明文字符串首地址
0049E32C  add     esp, 20                      ; 前移32个存储单元
0049E32F  push    1FF                             512入栈  <加密函数第4个参数>
0049E334  lea     eax, dword ptr [esp+20C]  eax =明文字符串
0049E33B  push    eax                              ; /String  
0049E33C  call    dword ptr [<&KERNEL32.lstrlenA>] ; \lstrlenA 得到明文的长度,保存在eax中
0049E342  push    eax                                   eax入栈   明文长度入栈<加密函数第3个参数>
0049E343  lea     ecx, dword ptr [esp+10]     ecx=第一次入栈的edi的值,应该是某个成员变量
0049E347  push    ecx                                   ecx入栈<加密函数第2个参数>
0049E348  lea     edx, dword ptr [esp+214] 
0049E34F  push    edx                                    明文字符串首<加密函数第1个参数>
0049E350  call    004A0B10                           调用加密函数
fnEncode(char *strSrc, char *strDest, int lenSrc, 512)
...................
后面是发送信息

posted on 2008-05-30 16:34 Phrancol Yang 阅读(606) 评论(0)  编辑  收藏 所属分类: 反汇编

只有注册用户登录后才能发表评论。


网站导航: