首页 > 代码库 > Ring0级的探索

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级的探索