Ring0级的探索
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ring0级的探索相关的知识,希望对你有一定的参考价值。
内核基础知识介绍:
内核概述:Interx86系列处理器使用“环”的概念实施访问控制,共4个权限级别。一般情况下,操作系统的内核程序、驱动程序等都在Ring0级别上运行。研究内核漏洞,需要首先掌握一些内核基础知识、例如内核驱动程序的开发、编译和运行,以及内核中重要的数据结构等。
驱动编写之Hello World
代码,保存为Helloworld.c 路径 D:\\0day\\HelloWorld\\helloworld.c
#include <ntddk.h> #define DEVICE_NAME L"\\\\Device\\\\HelloWorld" #define DEVICE_LINK L"\\\\DosDevices\\\\HelloWorld" // 创建的设备对象指针 PDEVICE_OBJECT g_DeviceObject; // 驱动卸载函数 VOID DriverUnload(IN PDRIVER_OBJECT driverObject){ // 什么都不用做,打印一句话,helloword就这套路 KdPrint(("DriverUnload: 88!\\n")); } // 驱动派遣例程函数 NTSTATUS DrvDispatch(IN PDEVICE_OBJECT driverObject, IN PIRP pIrp){ KdPrint(("Enter DrvDispatch\\n")); // 设置IRP的完成状态 pIrp->iostatus.Status = STATUS_SUCCESS; // 设置IRP的操作字节数 pIrp->IoStatus.Information = 0; // 完成IRP处理 IoCompleteRequest(pIrp, IO_NO_INCREMENT); return STATUS_SUCCESS; } // 驱动入口函数(相当于main函数) NTSTATUS DriverEntry(IN PDRIVER_OBJECT driverObject, IN PUNICODE_STRING registryPath){ NTSTATUS ntStatus; UNICODE_STRING devname; UNICODE_STRING symLinkName; int i; // 打印一句调试信息 KdPrint(("DriverEntry: Hello world driver demo!")); // 设置该驱动对象的卸载函数 //driverObject->DriverUnload = DriverUnload; // 创建设备 RtlInitUnicodeString(&devname, DEVICE_NAME); ntStatus = IoCreateDevice(driverObject, 0, &devname, FILE_DEVICE_UNKNOWN, 0, TRUE, &g_DeviceObject); if (!NT_SUCCESS(ntStatus)) { return ntStatus; } // 创建符号链接 RtlInitUnicodeString(&symLinkName, DEVICE_LINK); ntStatus = IoCreateSymbolicLink(&symLinkName, &devname); if (!NT_SUCCESS(ntStatus)){ IoDeleteDevice(g_DeviceObject); return ntStatus; } // 设置该驱动对象的派遣例程函数 for (i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++){ driverObject->MajorFunction[i] = DrvDispatch; } // 返回成功结果 return STATUS_SUCCESS; }
安装WDK
以上是关于Ring0级的探索的主要内容,如果未能解决你的问题,请参考以下文章