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:\下,否则系统会蓝屏死机。
其应该作为一个驱动启动程序,具体什么作用自己也不太清楚。
现在这里标记一下,弄懂之后回来补上。
RootKit随手记(一)RootKit的驱动隐藏、读取配置、卸载安装的更多相关文章
- 基于Ubuntu14.04系统的nvidia tesla K40驱动和cuda 7.5安装笔记
基于Ubuntu14.04系统的nvidia tesla K40驱动和cuda 7.5安装笔记 飞翔的蜘蛛人 注1:本人新手,文章中不准确的地方,欢迎批评指正 注2:知识储备应达到Linux入门级水平 ...
- 安装VS组件提示“所选驱动不再有效。继续安装之前,请先检查安装路径的设置。”要怎么办?
电脑里面原来装了VS2010,包括的组件有VB和C++,现在想添加C#,结果安装的时候就提示“所选驱动不再有效.继续安装之前,请先检查安装路径的设置”,安装路径在C盘,还有40个G,不知道该怎么办? ...
- 摄像头驱动的使能配置、V4L2编程接口的设计应用
摄像头采集子系统 一.摄像头驱动的使能配置 摄像头软件驱动构架 摄像头采集系统由上图所示,硬件(摄像头) -> 驱动(Linux内核配置中,选择支持V4L2的驱动选项) -> V4L2接口 ...
- Ubuntu系统---“NVIDIA 驱动+CUDA+cuDNN ”之后 OpenCV安装
Ubuntu系统---“NVIDIA 驱动+CUDA+cuDNN ”之后 OpenCV安装 目录: 一.OpenCV安装包下载 二.cmake安装 三.OpenCV安装 正文 一.OpenCV安装包下 ...
- Win8.1+VS2013+WDK8.1+VirtualBox or VMware 驱动开发环境配置
https://blog.csdn.net/charlessimonyi/article/details/50904956 Win8.1+VS2013+WDK8.1+VirtualBox or VMw ...
- 隐藏windows7/8“卸载或更改程序”里的软件
隐藏windows7/8“卸载或更改程序”里的软件 通过修改注册表即可隐藏电脑中已安装的软件,这个方法会造成卸载列表无法加载已安装的软件,请谨慎操作!提示:删除注册表后windows自带的卸载程序.其 ...
- CE驱动动态加载卸载
加载: #define DEV_KEY TEXT("Drivers\\Builtin\\WCDMA") BOOL CGPRSCTRLDlg::Load() { //DWORD dw ...
- Window7 驱动编程环境配置
1. 安装VS2010,WDK7.60(GRMWDK_EN_7600_1) 2. 新建VC 控制台项目(选择为空项目) 3. 新建项目配置“driver” ,点击下拉按钮-点击(配置管理器) 输 ...
- 用Setup系列函数完成驱动卸载安装[驱动安装卸载程序]
// InstallWDFDriver.cpp : Defines the entry point for the console application. // #include "std ...
随机推荐
- SpringBoot(14)—注解装配Bean
SpringBoot(14)-注解装配Bean SpringBoot装配Bean方式主要有两种 通过Java配置文件@Bean的方式定义Bean. 通过注解扫描的方式@Component/@Compo ...
- Java 比较器
比较器 Arrays 类 主要功能: 完成所有与数组有关的操作的工具类 二分查找: 在一个有序的数字序列中进行二分查找 public static int binarySearch(数据类型 [] a ...
- DevOps 工程师成长日记系列三:版本
原文地址:https://medium.com/@devfire/how-to-become-a-devops-engineer-in-six-months-or-less-part-3-versio ...
- I2C硬件与模拟的区别
硬件I2C对应芯片上的I2C外设,有相应I2C驱动电路,其所使用的I2C管脚也是专用的,因而效率要远高于软件模拟的I2C:一般也较为稳定,但是程序较为繁琐. 硬件(固件)I2C是直接调用内部寄存器进行 ...
- 九、Swift对象存储服务(双节点搭建)
九.Swift对象存储服务(双节点搭建) 要求:Controoler节点需要2块空盘 Compute节点需要再加2块空盘 本次搭建采用Controller 和 Compute双节点节点做swift组件 ...
- 01-CSS3-justify-content: space-around; justify-content: space-between;
/* justify-content: space-around; 运用在父级元素上 第一个子元素距离左边的距离==最后一个子元素距离右边的距离 除第一个子元素和最后一个子元素外,第2个,第3个... ...
- 【cf343】D. Water Tree(dfs序+线段树)
传送门 题意: 给出一个以\(1\)为根的有根树,起始每个结点都为\(0\),现在有三种操作: 1.将\(v\)及\(v\)的子树都置为\(1\): 2.将\(v\)及其所有的祖先都置为\(0\): ...
- 二,java框架学习
二,java框架学习 实体类的编写规则 实体类里面的属性是私有的 私有属性使用公开的set,get,方法操作 要求实体类有属性作为唯一值(一般使用id值) 实体类属性建议不使用基本数据类型,使用基本数 ...
- alias别名
alias一般用法 1.默认rm是"rm -i"的别名,ll就是"ls -l"的别名.可以自定义别名来代替某些命令配合某些选项,也可以定义别名组合多个命令.例如 ...
- monkey参数
一.参数分类 常规类参数:包括帮助参数和日志信息参数. 帮助类参数:monkey -h -- 输出monkey命令使用指导 日志信息参数:monkey -v <event-count&g ...