`
varsoft
  • 浏览: 2430554 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

[网友LionD8的毕业论文]Windows2000 内核级进程隐藏、侦测技术

阅读更多

Windows2000 内核级进程隐藏、侦测技术

指导老师:龙老师

学生:LionDB 学号:0137506

摘要

信息对抗是目前计算机发展的一个重要的方向,为了更好的防御,必须去深入的了解敌人进攻的招式。信息对抗促使信息技术飞速的发展。下面我选取了信息对抗技术的中一个很小一角关于windows内核级病毒隐藏技术和反病毒侦测技术作为议题详细讨论。

关键字:

内核, 拦截, 活动进程链表, 系统服务派遣表, 线程调度链

Abstract

Nowadays, information opposability is a very important development aspect in computer techniqueIn order to defense better, we must to deeply know army intrusion system by various methodsInformation opposability technology cause Information technology development at very fast speedThen I choose process hiding and detection in windows kernel model as my topic for particular discussionIt is a very small part of information opposability technology only

KeyWord

Kernel Hook Active Process Link System Service Dispath Table Dispatcher Thread Link

目录

1. 驱动程序简介

1.1 为什么选驱动程序

1.2 入口例程DriverEntry

1.3 Unload例程

1.4 派遣例程

1.5 驱动程序的安装

2. 通过Hook SSDT (System Service Dispath Table) 隐藏进程

2.1 原理介绍

2.2 Hook

2.3 NtQuerySystemInformation返回的数据进行删改

2.4 核心实现

3. 枚举和修改活动进程链表来检测和隐藏进程

3.1 介绍EPROCESS块(进程执行块)

3.2 查看EPROCESS结构

3.3 什么是活动进程链表

3.4 进程枚举检测Hook SSDT隐藏的进程

3.5 解决硬编码问题

3.6 删除活动进程链表实现进程隐藏

4. 基于线程调度链表的检测和隐藏技术

4.1 什么是ETHREADKTHREAD

4.2 线程调度

4.3 通过线程调度链表进行隐藏进程的检测

4.4 绕过内核调度链表隐藏进程

4.5 检测绕过内核调度链表隐藏进程

5. Hook 内核函数(KiReadyThread)检测进程

5.1 介绍通用Hook内核函数的方法

5.2 检测隐藏进程

6. 结论

驱动程序简介

1.为什么选驱动程序

驱动程序是运行在系统信任的Ring0环境下在代码,她拥有对系统任何软件和硬件的访问权限。这意味着内核驱动可以访问所有的系统资源,可以读取所有的内存空间,而且也被允许执行CPU的特权指令,如,读取CPU控制寄存器的当前值等。而处于用户模式下的程序如果试图从内核空间中读取一个字节或者试图执行像MOV EAX,CR3这样的汇编指令都会被立即终止掉。不过,这种强大的底线是驱动程序的一个很小的错误就会让整个系统崩溃。所以对隐藏和反隐藏技术来说都提供了一个极好的环境。但是又对攻击者和反查杀者提出了更高的技术要求。

2.入口例程DriverEntry

DriverEntry是内核模式驱动程序主入口点常用的名字,她的作用和mainWinMain,是一样的。

extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)

{

 ...

}

DriverEntry的第一个参数是一个指针,指向一个刚被初始化的驱动程序对象,该对象就代表你的驱动程序,DriverEntry的第二个参数是设备服务键的键名。DriverEntry函数返回一个NTSTATUS值。NTSTATUS实际就是一个长整型,但你应该使用NTSTATUS定义该函数的返回值而不是LONG,这样代码的可读性会更好。大部分内核模式支持例程都返回NTSTATUS状态代码,你可以在DDK头文件NTSTATUS.H中找到NTSTATUS的代码列表。

DriverEntry的作用主要就是创建设备对象,建立设备对象的符号链接,设置好各个类型的回调函数等。

例如:

extern "C"

NTSTATUS

DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)

{

DriverObject->DriverUnload = DriverUnload; <--1

DriverObject->DriverExtension->AddDevice = AddDevice;

DriverObject->DriverStartIo = StartIo;

DriverObject->MajorFunction[IRP_MJ_PNP] = DispatchPnp; <--2

DriverObject->MajorFunction[IRP_MJ_POWER] = DispatchPower;

DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = DispatchWmi;

...

}

WDM中通过设置AddDevice回调函数来创建设备对象。在NT驱动中在DriverEntry例程中创建设备对象和符号链接。

例如:

RtlInitUnicodeString (&deviceNameUnicodeString, deviceNameBuffer); //初始化设备名字
//
创建设备

ntStatus = IoCreateDevice (DriverObject,

0,

&deviceNameUnicodeString,

##DeviceId,

0,

FALSE,

&deviceObject

);
if ( NT_SUCCESS ( ntStatus ) ) {

RtlInitUnicodeString (&deviceLinkUnicodeString, deviceLinkBuffer); //初始化符号链接名字

//创建符号链接
ntStatus = IoCreateSymbolicLink (&deviceLinkUnicodeString, &deviceNameUnicodeString);
if ( !NT_SUCCESS ( ntStatus ) ) {

IoDeleteDevice (deviceObject); //如果创建符号链接失败,删除设备
return ntStatus;

}

}

建立符号链接的作用就是暴露一个给应用程序的接口,应用程序可以通过CreateFile API打开链接符号,得到一个语柄,和我们的驱动程序进行交互操作。

3. Unload例程

虽然各个驱动程序的Unload例程不尽相同,但是它大致执行下列工作

释放属于驱动程序的任何硬件。

Win32的名字空间移除符号连接名。

这个动作可以调用IoDeleteSymbolicLink来实现。

使用IoDeleteDevice移除设备对象。

释放驱动程序持有的任何缓冲池等。

VOID DriverUnload ( IN PDRIVER_OBJECT pDriverObject )

{

PDEVICE_OBJECT pNextObj;

// 循环每一个驱动过程控制的设备

pNextObj = pDriverObject->DeviceObject;

while (pNextObj != NULL)

{

//从设备对象中取出设备Extension

PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)extObj->DeviceExtension;

// 取出符号连接名

UNICODE_STRING pLinkName = pDevExt->ustrSymLinkName;

IoDeleteSymbolicLink(&pLinkName); //删除符号连接名

IoDeleteDevice(pNextObj); // 删除设备

pNextObj = pNextObj->NextDevice;

}

}

4. 派遣例程

Win2000I/O请求是包驱动的,当一个I/O请求开始,I/O管理器先创建一个IRP去跟踪这个请求,另外,它存储一个功能代码在IRPI/O堆栈区的MajorField域中来唯一的标识请求的类型。 MajorField域是被I/O管理器用来索引驱动程序对象的MajorFunction表,这个表包含一个指向一个特殊I/O请求的派遣例程的功能指针,如果驱动程序不支持这个请求,MajorFunction表就会指向I/O管理器函数_IopInvalidDeviceRequest,该函数返回一个错误给原始的调用者。驱动程序的作者有责任提供所有的驱动程序支持的派遣例程。所有的驱动程序必须支持IRP_MJ_CREATE功能代码,因为这个功能代码是用来响应Win32用户模式的CreateFile调用,如果不支持这功能代码,Win32程序就没有办法获得设备的句柄,类似的,驱动程序必须支持IRP_MJ_CLOSE功能代码,因为它用来响应Win32用户模式的CloseHandle调用。顺便提一下,系统自动调用CloseHandle函数,因为在程序退出的时候,所有的句柄都没有被关闭。

static NTSTATUS MydrvDispatch (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)

{

NTSTATUS status;

PIO_STACK_LOCATION irpSp;

//得到当前IRP (I/O请求包)

irpSp = IoGetCurrentIrpStackLocation( Irp );

switch (irpSp->MajorFunction)

{

case IRP_MJ_CREATE:

DbgPrint("IRP_MJ_CREATE\n");

Irp->IoStatus.Status = STATUS_SUCCESS;

Irp->IoStatus.Information = 0L;

break;

case IRP_MJ_CLOSE:

DbgPrint("IRP_MJ_CLOSE\n");

Irp->IoStatus.Status = STATUS_SUCCESS;

Irp->IoStatus.Information = 0L;

break;

}

IoCompleteRequest(Irp, 0);

return STATUS_SUCCESS;

}

大部分的I/O管理器的操作支持一个标准的读写提取,IRP_MJ_DEVICE_CONTROL允许扩展的I/O请求,使用用户模式的DeviceIoControl函数来调用,I/O管理器创建一个IRP,这个IRPMajorFunctionIoControlCode是被DeviceIoControl函数指定其内容。传递给驱动程序的IOCTL遵循一个特殊的结构,它有32-bit大小,DDK包含一个方便的产生IOCTL值的机制的宏,CTL_CODE。可以使用CTL_CODE宏来定义我们自己的IOCTL

例如:

#define IOCTL_MISSLEDEVICE_AIM CTL_CODE \

( FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_ACCESS_ANY )

NTSTATUS DispatchIoControl( IN PDEVICE_OBJECT pDO, IN PIRP pIrp )

{

NTSTATUS status = STATUS_SUCCESS;

PDEVICE_EXTENSION pDE;

PVOID userBuffer;

ULONG inSize;

ULONG outSize;

ULONG controlCode; // IOCTL请求代码

PIO_STACK_LOCATION pIrpStack; //堆栈区域存储了用户缓冲区信息

pIrpStack = IoGetCurrentIrpStackLocation( pIrp );

// 取出IOCTL请求代码

controlCode = pIrpStack-> Parameters.DeviceIoControl.IoControlCode;

// 得到请求缓冲区大小

inSize = pIrpStack-> Parameters.DeviceIoControl.InputBufferLength;

OutSize = pIrpStack-> Parameters.DeivceIoControl.OutputBufferLength;

//现在执行二次派遣

switch (controlCode)

{

case IOCTL_MISSLEDEVICEAIM:

......

case IOCTL_DEVICE_LAUNCH:

......

default: // 驱动程序收到了未被承认的控制代码

status = STATUS_INVALID_DEVICE_REQUEST;

}

pIrp->IoStatus.Information = 0; // 数据没有传输

IoCompleteRequest( pIrp, IO_NO_INCREMENT ) ;

return status;

}

5.驱动程序的安装

SC管理器(即服务控制管理器)可以控制服务和驱动程序。

加载和运行一个服务需要执行的典型操作步骤:

1.调用OpenSCManager()以获取一个管理器句柄

2.调用CreateService()来向系统中添加一个服务

3.调用StartService()来运行一个服务

4.调用CloseServiceHandle()来释放管理器或服务句柄

BOOL InstallDriver()

{

SC_HANDLE hSCManager = NULL;

hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);

if(hSCManager == NULL)

{

fprintf(stderr, "OpenSCManager() failed. --err: %d\n", GetLastError());

return FALSE;

}

SC_HANDLE schService;

schService = CreateService( hSCManager, //SCManager database

"MyDriver", // name of service

"MyDriver", // name to display

SERVICE_ALL_ACCESS, // desired access

SERVICE_KERNEL_DRIVER, // service type

SERVICE_AUTO_START, // start type

SERVICE_ERROR_NORMAL, // error control type

DriverPath, // service's binary

NULL, // no load ordering group

NULL, // no tag identifier

NULL, // no dependencies

NULL, // LocalSystem account

NULL // no password

);

if (schService == NULL)

{

if(GetLastError() == ERROR_SERVICE_EXISTS)

{

printf("Service has already installed!\n");

}

printf("Install driver false!");

return FALSE;

}

BOOL nRet = StartService(schService, 0, NULL);

if(!nRet)

{

if(GetLastError() == ERROR_SERVICE_ALREADY_RUNNING)

{

printf("Service is already running!\n");

return FALSE;

}

}

CloseServiceHandle(schService);

CloseServiceHandle(hSCManager);

return TRUE;

}

以上对驱动程序大致框架做了一个非常简单的介绍,这仅仅是驱动程序中的一个”Hello World!”。驱动程序是相当复杂的,由于我们只是利用驱动程序的特权,对windows内核进行修改,所以就不对驱动驱动程序进行深入讨论了。

通过Hook SSDT (System Service Dispath Table) 隐藏进程

分享到:
评论

相关推荐

    SUOTA-iOS-3.200.8.zip_5EVU_ble ota_liond1c_suota dialog

    dialog BLE设备OTA升级ios手机端

    GT400_HandPunch_C#_Punch_liond87_VS2019_

    To manipulate GT400 Hand Punch

    框架搭建内容合成的描述

    框架搭建内容合成的描述

    【Godot4自学手册】第三十八节给游戏添加音效

    【Godot4自学手册】第三十八节给游戏添加音效

    人工智能BBSO算法,MATLAB实现,很基本的人工智能算法,里面有很多源程序

    人工智能BBSO算法,MATLAB实现,很基本的人工智能算法,里面有很多源程序 (Artificial intelligence bbso) 文件列表: BBSO\alea.m (99, 2013-11-02) BBSO\alea_normal.m (532, 2013-11-02) BBSO\alea_sphere.m (483, 2013-11-02) BBSO\BBSO.m (5647, 2015-05-03) BBSO\BSO.asv (3521, 2013-11-02) BBSO\calef.m (375, 2014-02-08) BBSO\cauchy.txt (1282, 2013-11-02) BBSO\cauchy.zip (9607, 2013-11-02) BBSO\cauchycdf.m (1225, 2013-11-02) BBSO\cauchyfit.m (5565, 2013-11-02) BBSO\cauchyinv.m (1379, 2013-11-02) BBSO\cauchypdf.m (1221, 2013-11-02) BBSO\cauchyr

    人工智能神经网络.ppt

    人工智能神经网络.ppt

    Free Download Manager CRX 3.0.59 for Chrome.crx

    Free Download Manager 谷歌浏览器插件

    基于QT+C++开发的炫酷九宫格主界面+源码

    用法链接:https://menghui666.blog.csdn.net/article/details/137977868?spm=1001.2014.3001.5502 基于QT+C++开发的炫酷九宫格主界面+源码 基于QT+C++开发的炫酷九宫格主界面+源码 基于QT+C++开发的炫酷九宫格主界面+源码 基于QT+C++开发的炫酷九宫格主界面+源码 基于QT+C++开发的炫酷九宫格主界面+源码 基于QT+C++开发的炫酷九宫格主界面+源码

    S7200 SMART PLC远程下载教程.docx

    S7200 SMART PLC远程下载教程.docx

    29.基于Web的社区医院管理服务系统的设计与实现-Springboot+ Mysql+Java+ B/S源码+数据库+设计文档

    29.基于Web的社区医院管理服务系统的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码(含数据库脚本)+开发文档+lw(高分毕设项目) 详细设计文档介绍链接:http://t.csdnimg.cn/NgQjJ 内容概要: 社区医院管理服务系统采用java技术,基于springboot框架,mysql数据库进行开发,实现了首页、个人中心、用户管理、医生管理、预约医生管理、就诊信息管理、诊疗方案管理、病历信息管理、健康档案管理、费用信息管理、系统管理等内容进行管理,本系统具有良好的兼容性和适应性,为用户提供更多的社区医院管理服务信息,也提供了良好的平台,从而提高系统 全套项目源码+详尽文档,一站式解决您的学习与项目需求。 适用人群: 计算机、通信、人工智能、自动化等专业的学生、老师及从业者。 使用场景及目标: 无论是毕设、期末大作业还是课程设计,一键下载,轻松部署,助您轻松完成项目。 项目代码经过调试测试,确保直接运行,节省您的时间和精力。 其他说明: 项目整体具有较高的学习借鉴价值,基础能力强的可以在此基础上修改调整,以实现不同的功能。

    Ylanne_Sini_Salmi_Janna-3.pdf

    Ylanne_Sini_Salmi_Janna-3.pdf

    实现SAMI大脑的知识积累.zip

    七维大脑 七维大脑是一个多维度的思维模型,它强调大脑在时间管理、选择决策、行动执行和学习成长等方面的能力。这个模型为我们提供了一个全新的视角,帮助我们更深入地理解和利用大脑的功能。 首先,七维大脑中的时间维度是我们感知世界的基础,也是大脑处理信息的重要维度。大脑不仅记录事件的发生,还对其在时间轴上的位置进行编码。这种时间感知能力使我们能够区分先后顺序,预测未来事件,并在记忆中回溯过去。在日常生活中,大脑需要快速处理信息,做出决策,同时也要学会在慢节奏中放松,享受当下。 其次,选择维度体现了大脑在决策过程中的关键作用。在面对多个选项时,大脑会评估每个选项的潜在价值和风险,并结合我们的个人偏好、经验和目标来做出决策。这个过程涉及到复杂的认知和情感计算,展示了大脑在选择维度上的高度灵活性。 除了时间维度和选择维度,七维大脑还涵盖了认知功能、情感功能、行为功能、语言功能、社会功能以及自我意识功能等多个方面。认知功能使大脑能够接收和处理外界信息,产生感知觉,如视觉、听觉、触觉等,并进行记忆和思考。情感功能则让大脑能够体验并表达情感,与他人建立情感联系。行为功能使大脑能够指导身体进行各种动作

    基于java的讯友网络相册源码

    讯友网络相册是一个基于Web的应用程序,旨在为用户提供一个在线分享和浏览照片的平台。这个.rar文件包含了整个项目的所有源代码文件,是一份精心打包的源码包,非常适合作为计算机科学或软件工程专业学生的毕业设计或课程设计项目。它涵盖了前端界面设计和开发、后端逻辑处理、数据库设计与管理等多个方面。在功能上,讯友网络相册支持用户注册与登录,允许用户上传、下载、编辑和删除自己的图片。同时,它还提供了图片分类、搜索、评论和点赞等社交互动特性,使用户能够方便地管理和分享他们的数字记忆。此外,系统还可能包括管理员端的功能,用于内容审核、用户管理以及数据分析等后台操作。技术栈通常包括但不限于HTML、CSS和JavaScript用于前端开发,可能还会使用诸如React、Vue或Angular这样的现代JavaScript框架;后端则可能采用Node.js、Python(Django或Flask)、Java(Spring Boot)等语言和框架;数据库设计则可能涉及MySQL、PostgreSQL或MongoDB等数据库系统。该源码文件包为学生提供了一个实战练习的机会,通过亲自搭建和配置环境,不仅能够锻炼

    FlashFXP4-OYKSOFT

    FlashFXP4linux上传工具 FlashFXP提供了最简便和快速的途径来通过FTP传输任何文件,提供了一个格外稳定和强大的程序,确保你的工作能够快速和高效地完成 FlashFXP是一款功能强大的FXP/FTP软件,集成了其它优秀的FTP软件的优点 支持目录(和子目录)的文件传输,删除;支持上传,下载,以及第三方文件续传 有避免闲置断线功能,防止被FTP平台踢出;可显示或隐藏具有“隐藏”属性的文档和目录

    libADLMIDI1-1.5.0-bp153.1.1.x86-64.rpm

    libADLMIDI1-1.5.0-bp153.1.1.x86_64.rpm 是用于在 x86_64 架构的设备上安装的 RPM 包,具体功能如下: 名称:libADLMIDI1 版本:1.5.0 摘要:带有 OPL3 (YMF262) 模拟器的软件 MIDI 合成器库 许可证:GPL-3.0-only 和 LGPL-3.0-only 该库提供了一个基于 ADLMIDI 的软件 MIDI 合成器,它模拟了 OPL3 音源芯片(FM 合成)。它可以通过使用 ADLMIDI 库来实现多平台的 MIDI 播放和 OPL3 模拟。 该 RPM 包适用于 x86_64 架构,用于在相关设备上安装 libADLMIDI1 库文件。库文件包括: /usr/lib64/libADLMIDI.so.1 和 /usr/lib64/libADLMIDI.so.1.5.0:库文件 /usr/share/doc/packages/libADLMIDI1/AUTHORS、/usr/share/doc/packages/libADLMIDI1/README.md 等文档文件:文档文件

    libADLMIDI1-1.5.0-bp153.1.1.aarch64.rpm

    libADLMIDI1-1.5.0-bp153.1.1.aarch64.rpm 是用于在 aarch64 架构的设备上安装的 RPM 包,具体功能如下: 名称:libADLMIDI1 版本:1.5.0 摘要:带有 OPL3 (YMF262) 模拟器的软件 MIDI 合成器库 许可证:GPL-3.0-only 和 LGPL-3.0-only 该库提供了一个基于 ADLMIDI 的软件 MIDI 合成器,它模拟了 OPL3 音源芯片(FM 合成)。它可以通过使用 ADLMIDI 库来实现多平台的 MIDI 播放和 OPL3 模拟。 该 RPM 包适用于 aarch64 架构,用于在相关设备上安装 libADLMIDI1 库文件。库文件包括: /usr/lib64/libADLMIDI.so.1 和 /usr/lib64/libADLMIDI.so.1.5.0:库文件 /usr/share/doc/packages/libADLMIDI1/AUTHORS、/usr/share/doc/packages/libADLMIDI1/README.md 等文档文件:文档文件

    PHP颜色的编程怎么写代码

    PHP颜色的编程怎么写代码

    多选库.zip

    android 源码学习. 资料部分来源于合法的互联网渠道收集和整理,供大家学习参考与交流。本人不对所涉及的版权问题或内容负法律责任。如有侵权,请通知本人删除。感谢CSDN官方提供大家交流的平台

    “不确定作业处理时间的并行机器调度的无分布模型和算法matlab代码,.zip

    1.版本:matlab2014/2019a/2021a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    基于OpenCV+CNN的汉字手写识别系统源码+使用文档+全部资料(优秀项目).zip

    【资源说明】 基于OpenCV+CNN的汉字手写识别系统源码+使用文档+全部资料(优秀项目).zip基于OpenCV+CNN的汉字手写识别系统源码+使用文档+全部资料(优秀项目).zip基于OpenCV+CNN的汉字手写识别系统源码+使用文档+全部资料(优秀项目).zip 【备注】 1、该项目是个人高分毕业设计项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(如软件工程、计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

Global site tag (gtag.js) - Google Analytics