zoukankan      html  css  js  c++  java
  • RootKit随手记(一)RootKit的驱动隐藏、读取配置、卸载安装

    边学习边更新这专题,随手记录一下用到的思路,给自己看的(所以读者看可能有些懵,不好意思...)

    RootKit随手记(一)RootKit的驱动隐藏、读取配置、卸载安装

    一、驱动隐藏

    1. 隐藏原理

      一款好的ROOTKIT一定会隐藏自己,检测驱动时经过一串链表,该链表的结点在 DRIVER_OBJECT->DriverSection 中,数据结构如下图。

      kd> dt _DRIVER_OBJECT
        ntdll!_DRIVER_OBJECT
           +0x000 Type             : Int2B
           +0x002 Size             : Int2B
           +0x004 DeviceObject     : Ptr32 _DEVICE_OBJECT
           +0x008 Flags            : Uint4B
           +0x00c DriverStart      : Ptr32 Void
           +0x010 DriverSize       : Uint4B
           +0x014 DriverSection    : Ptr32 Void
           +0x018 DriverExtension  : Ptr32 _DRIVER_EXTENSION

      DriverSection指向了一个_LDR_DATA_TABLE_ENTRY结构体,该结构体我们在模块隐藏那里了解过.

      这是R0环的地址,所以存储的是R0环的模块(驱动文件等),与R3环的dll.exe文件可能不同。

      kd> dt _LDR_DATA_TABLE_ENTRY
        ntdll!_LDR_DATA_TABLE_ENTRY
           +0x000 InLoadOrderLinks : _LIST_ENTRY
           +0x008 InMemoryOrderLinks : _LIST_ENTRY
           +0x010 InInitializationOrderLinks : _LIST_ENTRY
      因此,我们采用断链就很好的隐藏。

      PDRIVER_DATA pDriverData = (PDRIVER_DATA)((DWORD32)pDriverObject + 20);
        if (pDriverData != NULL) {
            // 从链表中删除该模块
            pDriverData->listEntry.Blink->Flink = pDriverData->listEntry.Flink; // 后一个的前指针指向前一个
            pDriverData->listEntry.Flink->Blink = pDriverData->listEntry.Blink;  // 前一个的后指针指向后一个

       }

    2. 反制手段

      清除一个设备条目,将会被anti-rootkit发现。可以采用挂钩内核函数来检测设备驱动的不一致性。

    3.反反制手段

      可以通过修改原内核函数之前将条目增加保存到设备驱动链表中,再调用原内核函数之后将列表条目清楚的方法,欺骗anti-rootkit软件。

    二、配置文件

    1.ADS介绍:NTFS ADS的前世今生

      下面内容可能是错误的,有误导性,请注意!

      我们对磁盘文件结构暂时还不太熟悉,就先了解一下,日后再来深究一下。

      举个例子:

        rootkit必须和控制者服务器建立连接,此时就需要IP地址:xxx.xxx.xxx.xxx:yyyyy,此时该地址必须要被保存在一个文件中。

        我们可以通过ADS技术直接将该地址写入文件中,并不需要直接打开该文件(因为直接打开写入文件时内核所发现)。

        

          我们只需要使用" echo 写入内容  > 写入文件,即可将配置写入文件中。

    2.读取配置文件

      使用 ZwCreateFile 函数获取文件内核句柄,其一个参数 ioStatusBlock,存储返回结果以及返回要读取的IO字符串数字。

      使用 ZwWriteFile 函数来读取内容 / 使用 ZwWriteFile 函数来向文件写入内容。

      使用 ZwClose 函数来关闭文件句柄。

    三、安装与卸载

      经过一与二,我们已经建立起了一个基本的“RootKit”,其具有基本的“隐藏自己”和“配置自己”的功能。

      下面介绍一下如何开启自己的服务:

      

      因此我们要建立一个R3环的SCMLoader与SCMUnLoader程序来进行处理:

      - SCMLoader程序处理步骤:

        1)使用该函数 OpenSCManager建立一个连接。

        2)使用 CreateService 将服务名MyDeviceDriver 与 驱动文件 c:\comint32.sys 建立链接。

      - SCMUnloader程序处理步骤:

        1)使用 OpenService 函数打开已经创建好的服务。

        2)使用 ControlService 来修改其属性 SERVICE_CONTROL_STOP,之后将服务句柄关闭。

        3)当内核检测该句柄值为零且没有程序调用,其会删除。

      - RootKit安装与卸载步骤 在cmd下

        1)运行 SCMLoader.exe程序,在系统中注册一服务MyDeviceDriver并于ghost.sys绑定。

        2)使用命令 net start MyDeviceDriver 开启服务,之后驱动会开始运行。

        3)使用 net stop MyDeviceDriver 来关闭驱动。

        4)使用 SCMUnloader 来关闭程序。

      注意:必须将Driver.exe这个程序一起打包放在C:下,否则系统会蓝屏死机。

         其应该作为一个驱动启动程序,具体什么作用自己也不太清楚。

         现在这里标记一下,弄懂之后回来补上。 

      

      

      

  • 相关阅读:
    apache2三种模式及切换到event模式
    MySQL添加用户、创建数据库、分配权限
    ExcelHelper导出
    C#中将错误写进日志文件
    k3 cloud金蝶云参数设置云之家集成,提示无法推送企业消息
    k3 cloud中用视图类型来展示数据
    k3 cloud python 插件实现点击对应的单据编号打开单据
    k3 cloud单据转换的表
    sql server查询某个表对应的触发器
    QPainter::begin: Paint device returned engine == 0, type: 3
  • 原文地址:https://www.cnblogs.com/onetrainee/p/11736755.html
Copyright © 2011-2022 走看看