当前位置: 首页 > news >正文

白帽黑客系列教程之Windows驱动开发(64位环境)入门教程(七)

为什么要写这篇文章呢?

作为一名白帽黑客,如果想要学习ROOTKIT攻防技术,就必须要有能力进行驱动开发!

本文章仅提供学习,切勿将其用于不法手段!

在Windows操作系统的64位环境中,进行ROOTKIT攻防,就必须要学会Windows驱动开发!

Windows驱动开发,是掌握Rootkit技术的硬性基础之一!

不会Windows环境下的驱动开发,你就难以透彻理解ROOTKIT攻防技术的真相!

接上一篇文章,我们主要来讲解一下,KMDF项目开发中的一些代码内容编写!

接下来,我们来讲解下,相应的源文件(device.c)中的代码内容  ^ _ ^  请看下文!

/*++


Module Name: 文件名和功能描述

    device.c - Device handling events for example driver. ( device.c 是KMDF驱动程序中设备处理文件,device.c 用于处理设备相关的事件,device.c 用于处理示例驱动程序的设备事件 )

Abstract: 文件内容的简要说明

   This file contains the device entry points and callbacks. ( device.c 包含设备的入口点和回调函数;Entry Points 是驱动程序的入口函数(例如:设备创建、初始化等);Callbacks 是驱动程序的事件回调函数(例如:设备插入、移除、I/O请求处理等) )
    
Environment: 开发或运行环境

    Kernel-mode Driver Framework 当前驱动程序是基于内核模式驱动框架(KMDF)开发的

--*/

#include "driver.h"   //驱动的主要头文件,通常包含驱动所需的函数声明、宏定义和数据结构
#include "device.tmh" //WPP(Windows Software Trace Preprocessor)相关的跟踪文件,用于调试和日志记录

//检查是否定义了ALLOC_PRAGMA宏
#ifdef ALLOC_PRAGMA                                 
#pragma alloc_text (PAGE, KMDFDriver1CreateDevice)  //将KMDFDriver1CreateDevice函数放置在可分页的内存段中(PAGE)(这是为了优化内存使用,当函数不运行时,可以将其从内存中换出,PAGE是KMDF中用于分页内存的宏)
#endif

//KMDF驱动程序中的设备创建函数(用于创建设备对象、初始化设备上下文、创建设备接口,并初始化I/O包和队列)

NTSTATUS
KMDFDriver1CreateDevice(
    _Inout_ PWDFDEVICE_INIT DeviceInit //_Inout_ 指示参数 DeviceInit 既是输入也是输出,PWDFDEVICE_INIT 表示参数 DeviceInit 是一个指向设备初始化结构的指针(框架会在设备创建成功后释放该结构)
    )
/*++

Routine Description: 函数的功能描述

    Worker routine called to create a device and its software resources. 这是一个工作例程(worker routine),用于创建设备及其软件资源(在KMDF驱动程序中,这通常是设备创建函数的一部分,负责初始化设备对象和相关资源)

Arguments: 函数的参数说明

    DeviceInit - Pointer to an opaque init structure. Memory for this
                    structure will be freed by the framework when the WdfDeviceCreate
                    succeeds. So don't access the structure after that point.

    DeviceInit:参数名称,指向一个不透明的初始化结构(PWDFDEVICE_INIT)。

                opaque init structure:表示该结构的具体内容对开发者是隐藏的,只能通过框架提供的API进行操作。

                Memory for this structure will be freed by the framework when the WdfDeviceCreate succeeds:

                当 WdfDeviceCreate 成功时,框架会释放该结构的内存。

                因此,在调用 WdfDeviceCreate 后,不应再访问该结构。

Return Value: 函数的返回值

    NTSTATUS  返回类型,表示函数执行的状态(NTSTATUS 是Windows内核开发中常用的状态码类型,用于指示成功或失败)

--*/
{
    WDF_OBJECT_ATTRIBUTES deviceAttributes; //设备对象的属性
    PDEVICE_CONTEXT deviceContext;          //指向设备上下文的指针 
    WDFDEVICE device;                       //设备对象句柄
    NTSTATUS status;                        //用于存储函数调用的返回状态

    PAGED_CODE(); //分页内存检查(确保函数在分页内存中运行,如果函数在非分页内存中运行,会触发断言)

    WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&deviceAttributes, DEVICE_CONTEXT); //初始化设备属性(初始化设备对象的属性,并指定设备上下文类型为 DEVICE_CONTEXT(自定义的数据结构,通常在 device.h 中定义))

    status = WdfDeviceCreate(&DeviceInit, &deviceAttributes, &device); //创建设备对象(调用 WdfDeviceCreate 创建设备对象,如果创建设备对象成功,device 将包含新创建设备的句柄)

    if (NT_SUCCESS(status)) { //检查设备创建状态(如果创建设备对象成功)
        //
        // Get a pointer to the device context structure that we just associated
        // with the device object. We define this structure in the device.h
        // header file. DeviceGetContext is an inline function generated by
        // using the WDF_DECLARE_CONTEXT_TYPE_WITH_NAME macro in device.h.
        // This function will do the type checking and return the device context.
        // If you pass a wrong object handle it will return NULL and assert if
        // run under framework verifier mode.
        //
        deviceContext = DeviceGetContext(device); //获取设备上下文(使用 DeviceGetContext 获取设备上下文,它是一个由 WDF_DECLARE_CONTEXT_TYPE_WITH_NAME 宏生成的函数,用于类型检查和获取上下文)

        //
        // Initialize the context.
        //
        deviceContext->PrivateDeviceData = 0; //初始化设备上下文(初始化设备上下文中的私有数据,这里将 PrivateDeviceData 设置为 0)

        //
        // Create a device interface so that applications can find and talk
        // to us.
        //
        //创建设备接口(调用 WdfDeviceCreateDeviceInterface 创建设备接口)

        status = WdfDeviceCreateDeviceInterface(
            device,                         //设备对象句柄
            &GUID_DEVINTERFACE_KMDFDriver1, //设备接口的GUID(用于标识设备)
            NULL // ReferenceString           引用字符串,通常为 NULL
            );

        if (NT_SUCCESS(status)) { //检查设备接口创建状态(如果设备接口创建成功,继续初始化I/O包和队列)
            //
            // Initialize the I/O Package and any Queues
            //
            status = KMDFDriver1QueueInitialize(device); //初始化I/O包和队列(调用 KMDFDriver1QueueInitialize 初始化I/O包和队列,它是自定义函数,在 queue.c 中定义实现)
        }
    }

    return status; //返回状态码,表示函数执行结果
}
 

我在上面的代码中,增加了相应的注释,有助于学习Windows驱动开发的小白们能够理解每一行代码的用途!毕竟,学习 从 阅读 开始 !嘿嘿

(未完待续)

相关文章:

  • C++初阶——简单实现stack和queue
  • Linux运维——网络管理
  • 【AIGC】使用Python实现科大讯飞语音服务ASR转录功能:完整指南
  • ow rank decomposition如何用于矩阵的分解
  • 【CPP面经】大厂CPP后台开发面试经历
  • vue3:项目创建
  • Ollama部署与常用命令
  • C++初阶:C++入门基础
  • 什么是DrawCall?DrawCall为什么会影响游戏运行效率?如何减少DrawCall?
  • 如何将文件中的一部分段落整体删除
  • Grafana使用日志5--如何重置Grafana密码
  • 基于 sklearn 的均值偏移聚类算法的应用
  • [前端] 学习内容总结,css样式居中以及点击包裹a标签的容器元素也能触发a标签的点击事件
  • PyTorch 环境中 CUDA 版本冲突问题排查与解决
  • Linux相关知识(文件系统、目录树、权限管理)和Shell相关知识(字符串、数组)
  • Android 常用命令和工具解析之存储相关
  • 潜水泵,高效排水,守护城市与农田|深圳鼎跃
  • 最快安装ESP8266 ESP832 开发板·Arduino环境的方法
  • Android OpenGLES2.0开发(十一):渲染YUV
  • kafka数据拉取和发送
  • 苏州马可波罗网站建设/seo排名技巧
  • 广州在线网站制作推荐/网站域名注册查询
  • 南通动态网站建设/软文范例
  • 湛江定制建站/信息流广告是什么意思
  • 做医疗竞价网站/百度指数批量查询工具
  • vps主机可以做几个网站/陕西seo顾问服务