`
varsoft
  • 浏览: 2552381 次
  • 性别: 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

    标题中的"SUOTA-iOS-3.200.8.zip_5EVU_ble ota_liond1c_suota dialog"暗示了这是一个针对iOS设备的固件更新过程,使用了特定的技术,如5EVU(可能是一个产品或技术代号)、BLE(蓝牙低功耗)以及OTA(Over-the-Air,...

    GT400_HandPunch_C#_Punch_liond87_VS2019_

    【标题】"GT400_HandPunch_C#_Punch_liond87_VS2019_" 指的是一个基于C#语言开发的手掌识别系统(HandPunch),由开发者liond87使用Visual Studio 2019进行编译和构建。这个项目可能是一个用于员工考勤管理的应用...

    li_3ck_02a_1118.pdf

    li_3ck_02a_1118

    基于MATLAB的牛顿迭代法实现

    基于MATLAB的牛顿迭代法实现

    mellitz_3ck_01_0319.pdf

    mellitz_3ck_01_0319

    2025探索银行业人工智能驱动技术转型的投资回报率

    内容概要:文章阐述了银行采用人工智能(AI)技术替代传统系统的紧迫性和收益,讨论了通过构建现代化的数据和技术平台实现效率提升的方法,同时强调实施过程中确保数据质量和建立信任的重要性。文中提及,在金融行业中,若想优化业绩则必须拥抱AI带来的机遇,并为此进行经营模式的革新。根据Workday主办的研讨会内容,PwC金融服务风险与监管领导和Workday金融服务高层指出了大部分银行对AI认知不足的问题,强调AI在金融、人力资源以及IT等领域的广泛应用潜力及具体应用场景,如欺诈检测、技能映射和财务管理方面的作用。并且提到了AI部署过程中可能出现的技术与非技术难题及相应解决办法,鼓励金融机构及时投资建设新型基础设施,以保持竞争力。 适用人群:银行及其他金融机构管理人员;金融科技领域的专业研究人员;对企业数字化和智能化转型感兴趣的商业分析师、投资者;从事信息技术咨询工作的顾问。 使用场景及目标:本文可以帮助金融机构制定合理的技术发展战略规划,评估是否有必要推进AI技术转型,同时也为希望涉足银行科技项目的开发者提供了宝贵的市场洞察,帮助理解行业内普遍存在的困难与潜在的市场需求。此外,对于想要了解银行

    matlab程序代码项目案例论文+程序 基于在线优化的快速模型预测控制Fast model predicitive control with matlab interface.zip

    matlab程序代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    [AB PLC例程源码][MMS_043071]Phase Manager and a Scalable Batching Solution.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    [AB PLC例程源码][MMS_044386]1769-SM2 Compact I-O to DSI Module - Multi Drive Mode Operation - with.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    [AB PLC例程源码][MMS_041232]Monitor I-O Connections in Logix.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    chromedriver-linux64-136.0.7058.0.zip

    chromedriver-linux64-136.0.7058.0.zip

    [AB PLC例程源码][MMS_042504]Logix5000 interface to Atlas-Copco Tool Controller over EtherNet-IP.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    [AB PLC例程源码][MMS_042349]How to read-write data to-from a PLC using OPC in Visual Basic 6.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    电力工程领域中背压热电联产电厂的设计与参数计算

    内容概要:本文档介绍了背压热电联产(CHP)发电厂的详细设计步骤,涵盖确定各状态点的压力、温度、比焓以及质量流率的具体方法。主要内容围绕计算净电功率、燃料消耗及其效率展开,并提供了T-s图绘制的指南。针对每个组件(如蒸汽轮机、冷凝器、除氧器等),都列出了详细的效率假设和压力损失表,为实际工程应用提供了宝贵的参考资料和操作指导。同时,该作业任务要求学生从给定初始值中选择合适的操作条件进行系统模拟,并利用课程讲义和Moodle平台资料完成计算流程。 适用人群:对能源转换和动力设备设计感兴趣的学生或者初涉该领域的工程师。 使用场景及目标:旨在帮助学员深入了解并掌握背压热电联产装置的工作原理和技术指标计算的方法论,通过实践练习提高他们的问题解决能力。 其他说明:文档强调了稳态运行假设的重要性,即物质平衡等于能量输入等于输出的原则,并鼓励参与者借助附录提供的典型操作参数图表来寻找解决问题的方向。此外,它还特别指出对于一些变量值求解可能需要迭代法来进行调整,直至获得稳定结果。提交的报告必须含有一份详细的T-s图和其他必要附件。

    机器学习-市财政收入分析(含数据集)

    机器学习_市财政收入分析(含数据集)

    [AB PLC例程源码][MMS_046989]KAT with Code Sequencer.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    tracy_3cd_01_0318.pdf

    tracy_3cd_01_0318

    lusted_3cd_01_0918.pdf

    lusted_3cd_01_0918

    基于51的自动分拣系统设计20250307

    题目:基于51的自动分拣系统设计 主控:AT89C52 测距模块:超声波测距模块 甲醛传感器(ADC0832+滑动变阻器模拟) 粉尘传感器(PCF8591+滑动变阻器模拟) 净化模块(继电器驱动蓝灯) 排风模块(继电器驱动绿灯) 电源电路(5V降压为3.3V供电) 显示模块(LCD1602) 声光报警 按键(3个,切换阈值选择,阈值加减) 检测物体:开关模拟 电机驱动模块(继电器驱动直流电机转动) 功能: 1.显示屏显示甲醛,粉尘浓度可以切换设置阈值。 2.通过甲醛传感器检测车间环境,大于阈值时声光报警并启动净化模块。 3.通过粉尘传感器检测车间环境,大于阈值时声光报警并启动排风模块。 4.采用超声波传感器进行物体超高监测异常(大于XX距离)时触发声光报警 5.检测到物体(开关闭合)直流电机转动(模拟传送带)

    network-server

    network_server

Global site tag (gtag.js) - Google Analytics