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

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:\下,否则系统会蓝屏死机。

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

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

  

  

  

RootKit随手记(一)RootKit的驱动隐藏、读取配置、卸载安装的更多相关文章

  1. 基于Ubuntu14.04系统的nvidia tesla K40驱动和cuda 7.5安装笔记

    基于Ubuntu14.04系统的nvidia tesla K40驱动和cuda 7.5安装笔记 飞翔的蜘蛛人 注1:本人新手,文章中不准确的地方,欢迎批评指正 注2:知识储备应达到Linux入门级水平 ...

  2. 安装VS组件提示“所选驱动不再有效。继续安装之前,请先检查安装路径的设置。”要怎么办?

    电脑里面原来装了VS2010,包括的组件有VB和C++,现在想添加C#,结果安装的时候就提示“所选驱动不再有效.继续安装之前,请先检查安装路径的设置”,安装路径在C盘,还有40个G,不知道该怎么办? ...

  3. 摄像头驱动的使能配置、V4L2编程接口的设计应用

    摄像头采集子系统 一.摄像头驱动的使能配置 摄像头软件驱动构架 摄像头采集系统由上图所示,硬件(摄像头) -> 驱动(Linux内核配置中,选择支持V4L2的驱动选项) -> V4L2接口 ...

  4. Ubuntu系统---“NVIDIA 驱动+CUDA+cuDNN ”之后 OpenCV安装

    Ubuntu系统---“NVIDIA 驱动+CUDA+cuDNN ”之后 OpenCV安装 目录: 一.OpenCV安装包下载 二.cmake安装 三.OpenCV安装 正文 一.OpenCV安装包下 ...

  5. Win8.1+VS2013+WDK8.1+VirtualBox or VMware 驱动开发环境配置

    https://blog.csdn.net/charlessimonyi/article/details/50904956 Win8.1+VS2013+WDK8.1+VirtualBox or VMw ...

  6. 隐藏windows7/8“卸载或更改程序”里的软件

    隐藏windows7/8“卸载或更改程序”里的软件 通过修改注册表即可隐藏电脑中已安装的软件,这个方法会造成卸载列表无法加载已安装的软件,请谨慎操作!提示:删除注册表后windows自带的卸载程序.其 ...

  7. CE驱动动态加载卸载

    加载: #define DEV_KEY TEXT("Drivers\\Builtin\\WCDMA") BOOL CGPRSCTRLDlg::Load() { //DWORD dw ...

  8. Window7 驱动编程环境配置

    1.  安装VS2010,WDK7.60(GRMWDK_EN_7600_1) 2.  新建VC 控制台项目(选择为空项目) 3.  新建项目配置“driver” ,点击下拉按钮-点击(配置管理器) 输 ...

  9. 用Setup系列函数完成驱动卸载安装[驱动安装卸载程序]

    // InstallWDFDriver.cpp : Defines the entry point for the console application. // #include "std ...

随机推荐

  1. 项目中出现多个域名下的Cookie

    前言:我们在查看一个项目的Cookie时,有时会看到多个域名下的Cookie,如下图: 其中一种常见的原因是:因为我们在项目中引用了另一个项目的资源.如下图: 重点:浏览器的一种默认机制:如果我们引用 ...

  2. Object(Asp.NET核心机制内置对象汇总)

    ASP.NET有个大佬,HttpContext(在.Net Core中依然是它)Http请求的上下文,任何一个环节都是需要HttpContext的,需要的参数信息,处理的中间结果,最终的结果,都是放在 ...

  3. python基础(13):函数名的使用、第一类对象、闭包、迭代器

    1. 函数名的运用 函数名是⼀个变量,但它是⼀个特殊的变量,与括号配合可以执⾏函数的变量. 1.1 函数名的内存地址 def func(): print("呵呵") print(f ...

  4. 高强度学习训练第九天总结:5道剑指offer的题目

    实在不想看JVM了.刷几道剑指Offer的题,今天就水一水吧,脑子迷糊. 1.二维数组中的查找 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增 ...

  5. python web框架Django入门

    Django 简介 背景及介绍 Django是一个开放源代码的Web应用框架,由Python写成.采用了MVC的框架模式,即模型M,视图V和控制器C.它最初是被开发来用于管理劳伦斯出版集团旗下的一些以 ...

  6. 干货:Wireshark使用技巧-显示规则

    - 显示规则使用 在Wireshark界面对已经抓取的报文在界面的显示进行控制的规则,称为显示规则,显示规则只是让一部分不符合规则的报文不被显示,但未被丢弃,这些报文仍然存在在Wireshark的系统 ...

  7. 熟悉的味道——从Java单例写到C++单例

    设计模式中,单例模式是常见的一种.单例模式需要满足以下两个条件: 保证一个类只能创建一个示例: 提供对该实例的全局访问点. 关于单例最经典的问题就是DCL(Double-Checked Lock),今 ...

  8. FileZilla搭建FTP服务器

    一.基础环境1.服务端机器:192.168.0.104 FillaZilla Server端下载2.客户端机器:192.168.0.100 FillaZilla客户端下载 !!!搭建FTP服务端的机器 ...

  9. [b0037] python 归纳 (二二)_多进程数据共享和同步_管道Pipe

    # -*- coding: utf-8 -*- """ 多进程数据共享 管道Pipe 逻辑: 2个进程,各自发送数据到管道,对方从管道中取到数据 总结: 1.只适合两个进 ...

  10. MySQL数据库(三)锁机制

    MyISAM默认使用表级锁,不支持行级锁 InnoDB默认使用行级锁,也支持表级锁 表级锁:开销小,加锁快:不会出现死锁:锁定粒度大,发生锁冲突的概率最高,并发度最低. 行级锁:开销大,加锁慢:会出现 ...