• Sality 病毒的驱动模块分析报告


    一、概述

    这个驱动是的sality病毒的rootkit部分,代码比较简单,主要功能有两个
    一是拦截内容含有以下字符串的TCP和UDP数据包,还有TCP 25端口的数据包

    upload_virus
    sality-remov
    virusinfo.
    cureit.
    drweb.
    onlinescan.
    spywareinfo.
    ewido.
    virusscan.
    windowsecurity.
    spywareguide.
    bitdefender.
    pandasoftware.
    agnmitum.
    virustotal.
    sophos.
    trendmicro.
    etrust.com
    symantec.
    mcafee.
    f-secure.
    eset.com
    kaspersky

    二是 接收应用层的命令,应用层主要传递了系统的SSDT地址表和一个进程id,驱动获取NtTerminateProcess函数的地址,强制关闭指定的进程。

    主要的功能很明显,就是为了对抗杀软,涉及的操作系统有win2000到windows Vista的32位版本。

    特征有:
    设备对象名为\Device\amsint32,
    符号链接名为\DosDevices\amsint32
    MD5 bf31a8d79f704f488e3dbcb6eea3b3e3

    二 分析情况

    IDA显示的函数列表
    函数的代码量比较小,使用IDA PRO进行静态分析,代码结构基本理清。

    1.DriverEntry函数

    DriverEntry函数为驱动程序的入口函数,其中完成了一些初始化工作。
    在DriverEntry中创建了设备对象和符号链接,设备对象名为\Device\amsint32,符号链接名为\DosDevices\amsint32,用于接收应用层的发送的命令和数据
    D
    设置了派遣函数
    在这里插入图片描述
    解密一个全局字符串数组,这是要过滤的字符串
    在这里插入图片描述
    创建了两个系统线程
    在这里插入图片描述

    2.进程1

    在进程1中,获取系统驱动ipfltdrv.sys的设备对象,调用IoBuildDeviceIoControlRequest函数,使用IOCTL_PF_SET_EXTENSION_POINTER这个控制码,注册一个回调函数,这样系统会将数据包发送给这个回调函数来处理
    在这里插入图片描述
    回调函数的逻辑如下,若全局开关dwFilterEnable为1,若为TCP的端口为25,拦截这个包,不知道为啥?
    若数据包中含有上面的解密出来的字符串,拦截,否则放行
    在这里插入图片描述

    3.进程2

    等待应用层发送数据,驱动程序接收到应用层的数据后,会在DriverDispath中的设置Event
    进程2中首先等待ServiceTableBase值,通过加上NtTerminateProcess的ssdt index得到其地址
    在这里插入图片描述
    然后等待应用层发来pid的值 获取进程的handle,调用NtTerminateProcess关闭这个进程,这里有一个全局变量dwEnableSwitch,应该是作者调试程序留下的,在代码中一直为0

    在这里插入图片描述

    4.派遣函数

    派遣函数主要用于接收应用层的数据,这里只对WRITE类型的IRP进行处理,大体逻辑如下,
    当UserBuffer的第一个双字为666时,其中UserBuffer中存储是的这是的SSDT的地址表(KeServiceDescriptorTable.ServiceTableBase),只是作者将第一个地址改成为666,用来当命令,将ServiceTableBase的内容拷贝到全局变量中, SetEvent,告诉ThreadFunc1 SSDT的地址表来了。
    当UserBuffer的第一个双字为777时,将全局变量dwFilterEnable置为1,ThreadFunc1开启过滤TCP 25端口的数据包;
    当UserBuffer的第一个双字为888时,将全局变量dwFilterEnable置为0,ThreadFunc1停止过滤TCP 25端口的数据包;
    当UserBuffer的第一个双字不是666、777、888,且大小为一个ULONG, ServiceTableBase不为空时,此时userbuffer中的内容为进程id,将进程id复制出来给dwPid,SetEvent,告诉ThreadFunc1用户层的pid来了,可以关闭这个进程了。
    在这里插入图片描述

    参考资料

    https://www.freebuf.com/column/206442.html
    https://blog.csdn.net/namelcx/article/details/9254137
    https://guanjia.qq.com/news/n3/2567.html

  • 相关阅读:
    计算机网络——TCP / IP 网络模型
    【已解决】pyinstaller 将程序打包成 exe 文件后,无法保存视频或者保存的视频为空文件
    区域地表蒸散发及其组分(土壤蒸发、植被蒸腾、冠层截留蒸发)、植被总初级生产力数据的下载、处理、显示与统计
    C#__资源访问冲突和死锁问题
    [附源码]Python计算机毕业设计Django的低碳生活记录网站
    了解被测系统(二)接入链路--包括域名解析和Nginx代理
    https跟http有什么区别?
    24点问题(带输出构造方式)
    CSS中如何隐藏元素但保留其占位空间(display:nonevsvisibility:hidden)?
    C. Rings---Codeforces Round #741 (Div. 2)
  • 原文地址:https://blog.csdn.net/a854596855/article/details/126778287