本站资源来自互联网用户收集发布,仅供用于学习和交流。如有侵权之处,请联系站长并出示版权证明以便删除,敬请谅解!(邮箱:whctwlgzs@foxmail.com)

无忧技术吧

 找回密码
 立即注册

QQ登录

只需一步,快速开始

title
广告展示页面
查看: 1127|回复: 0

[Windows内核-驱动开发] Windows内核驱动开发-读写驱动-第8章

[复制链接]
admin (帅逼1)实名认证

积分信息:
无忧币:108846
交易币:2147480567
贡献:999999

我的勋章:

灌水之王突出贡献优秀版主荣誉管理论坛元老沙发王源码大师在线王终身成就机器王知识库土豪活跃会员最佳新人热心会员


发表于 3 天前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转无忧吧。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Windows内核驱动开发-读写驱动-第8章
在 Windows 内核驱动开发中,系统回调机制是实现进程、线程、模块加载及注册表操作监控的核心技术。以下从技术原理、实现方法和实战案例三个维度,结合 Windows 内核架构和驱动开发规范,系统解析系统回调的应用逻辑:
一、系统回调机制的核心原理
Windows 内核通过事件通知机制允许驱动程序注册回调函数,以拦截关键系统操作。主要回调类型包括:
  • 进程 / 线程回调:通过PsSetCreateProcessNotifyRoutineEx和PsSetCreateThreadNotifyRoutine注册,监控进程 / 线程的创建、终止等生命周期事件。
  • 模块加载回调:使用PsSetLoadImageNotifyRoutine拦截模块加载事件,可获取模块路径、哈希值等信息。
  • 注册表回调:通过CmRegisterCallback注册,监控注册表键的创建、删除、修改等操作。
这些回调函数在内核模式下执行,可通过返回特定状态码(如STATUS_ACCESS_DENIED)直接干预系统行为。
二、关键技术实现路径
(一)进程监控与控制
  • 注册回调
NTSTATUS DriverEntry(_In_ PDRIVER_OBJECT DriverObject, _In_ PUNICODE_STRING RegistryPath) {
    UNREFERENCED_PARAMETER(RegistryPath);
    NTSTATUS status = PsSetCreateProcessNotifyRoutineEx(ProcessCreateCallback, TRUE);
    if (!NT_SUCCESS(status)) {
        return status;
    }
    DriverObject->DriverUnload = DriverUnload;
    return STATUS_SUCCESS;
}

  • 回调函数实现
NTSTATUS ProcessCreateCallback(
    _Inout_ PEPROCESS Process,
    _In_ HANDLE ProcessId,
    _In_opt_ PPS_CREATE_NOTIFY_INFO CreateInfo
) {
    UNREFERENCED_PARAMETER(ProcessId);
    UNREFERENCED_PARAMETER(CreateInfo);

    // 获取进程名称
    PCHAR processName = PsGetProcessImageFileName(Process);

    // 禁止启动notepad.exe
    if (_stricmp(processName, "notepad.exe") == 0) {
        return STATUS_ACCESS_DENIED;
    }
    return STATUS_SUCCESS;
}

(二)模块加载控制
  • 注册回调
NTSTATUS DriverEntry(_In_ PDRIVER_OBJECT DriverObject, _In_ PUNICODE_STRING RegistryPath) {
    UNREFERENCED_PARAMETER(RegistryPath);
    PsSetLoadImageNotifyRoutine(ImageLoadCallback);
    DriverObject->DriverUnload = DriverUnload;
    return STATUS_SUCCESS;
}

  • 回调函数实现
VOID ImageLoadCallback(
    _In_ PUNICODE_STRING FullImageName,
    _In_ HANDLE ProcessId,
    _In_ PIMAGE_INFO ImageInfo
) {
    UNREFERENCED_PARAMETER(ProcessId);

    // 禁止加载恶意模块
    if (wcsstr(FullImageName->Buffer, L"malware.dll") != NULL) {
        ZwUnloadDriver(ImageInfo->ImageBaseAddress);
    }
}

(三)注册表操作锁定
  • 注册回调
NTSTATUS DriverEntry(_In_ PDRIVER_OBJECT DriverObject, _In_ PUNICODE_STRING RegistryPath) {
    UNREFERENCED_PARAMETER(RegistryPath);
    OBJECT_ATTRIBUTES objAttr;
    InitializeObjectAttributes(&objAttr, NULL, 0, NULL, NULL);
    NTSTATUS status = CmRegisterCallback(RegistryCallback, &objAttr, NULL, &CallbackHandle);
    if (!NT_SUCCESS(status)) {
        return status;
    }
    DriverObject->DriverUnload = DriverUnload;
    return STATUS_SUCCESS;
}

  • 回调函数实现
NTSTATUS RegistryCallback(
    _In_ PVOID CallbackContext,
    _In_ PVOID Argument1,
    _In_ PVOID Argument2
) {
    UNREFERENCED_PARAMETER(CallbackContext);

    PREG_NOTIFY_INFORMATION notifyInfo = (PREG_NOTIFY_INFORMATION)Argument1;
    if (notifyInfo->Type == RegNtPreCreateKey) {
        // 禁止创建特定注册表键
        if (wcsstr(notifyInfo->ObjectPath->Buffer, L"Software\\Malware") != NULL) {
            return STATUS_ACCESS_DENIED;
        }
    }
    return STATUS_SUCCESS;
}

三、实战应用与优化策略
(一)多场景监控方案
  • 进程防护:结合PsSetCreateProcessNotifyRoutineEx和PsSetLoadImageNotifyRoutine,实现进程创建与模块加载的双重拦截,防止恶意程序注入。
  • 注册表保护:通过CmRegisterCallback监控RegNtPreCreateKey和RegNtPreSetValueKey事件,阻止关键注册表项的修改。
  • 线程监控:使用PsSetCreateThreadNotifyRoutine拦截线程创建,可检测隐蔽线程等恶意行为。
(二)性能优化与稳定性保障
  • 异步处理:在回调函数中避免长时间阻塞,使用IoQueueWorkItem将耗时操作转移到工作线程。
  • 错误处理:对PsGetProcessImageFileName等可能返回NULL的函数进行防御性编程。
  • 兼容性适配:针对 Windows 版本差异,使用条件编译适配PsSetCreateProcessNotifyRoutineEx等 API 的参数变化。
(三)安全加固措施
  • 驱动签名:通过 Windows 硬件开发者中心获取数字签名,确保驱动可在 64 位系统加载。
  • 内存保护:使用ExAllocatePoolWithTag分配非分页内存,并通过ProbeForRead/Write进行边界检查。
  • 日志审计:通过DbgPrint输出关键操作日志,结合WinDbg进行调试和问题定位。
四、典型案例解析
(一)禁止特定进程启动
通过进程创建回调函数,拦截notepad.exe的启动:
NTSTATUS ProcessCreateCallback(...) {
    PCHAR processName = PsGetProcessImageFileName(Process);
    if (_stricmp(processName, "notepad.exe") == 0) {
        // 记录日志
        DbgPrint("Blocked process: %s", processName);
        return STATUS_ACCESS_DENIED;
    }
    return STATUS_SUCCESS;
}

(二)阻止恶意模块加载
在模块加载回调中,检查模块路径并卸载恶意模块:
VOID ImageLoadCallback(...) {
    if (wcsstr(FullImageName->Buffer, L"malware.dll") != NULL) {
        // 记录日志
        DbgPrint("Blocked module: %wZ", FullImageName);
        ZwUnloadDriver(ImageInfo->ImageBaseAddress);
    }
}

(三)锁定注册表关键路径
通过注册表回调禁止创建Software\\Malware键:
NTSTATUS RegistryCallback(...) {
    if (notifyInfo->Type == RegNtPreCreateKey &&
        wcsstr(notifyInfo->ObjectPath->Buffer, L"Software\\Malware") != NULL) {
        // 记录日志
        DbgPrint("Blocked registry key: %wZ", notifyInfo->ObjectPath);
        return STATUS_ACCESS_DENIED;
    }
    return STATUS_SUCCESS;
}

五、开发注意事项
  • 权限控制:驱动程序需运行在内核模式,具有最高系统权限,需严格限制回调函数的执行逻辑。
  • 版本兼容性:Windows 10/11 引入PsSetCreateProcessNotifyRoutineEx2等新 API,需使用#ifdef适配不同版本。
  • 调试工具:推荐使用WinDbg进行内核调试,结合kdnet实现远程调试。
  • 代码规范:遵循微软 WDM 驱动开发规范,避免使用未文档化的函数(如PsTerminateSystemThread)。
六、参考资源
  • 微软官方文档
  • 经典书籍

    • 《Windows 驱动开发技术详解》(张帆等著)

    • 《深入解析 Windows 操作系统》(Mark Russinovich 等著)
通过系统回调机制,开发者可实现对 Windows 系统关键操作的细粒度控制。在实际开发中,需结合具体场景设计回调逻辑,并严格遵循内核编程规范,确保驱动程序的稳定性和安全性。
Windows内核驱动开发-读写驱动-第8章  4418 无忧技术吧www.whct.net
游客回复评论后点此刷新即可查看下载地址
回复




无忧技术吧-免责声明:
1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关。一切关于该内容及资源商业行为与www.whct.net无关。
2、本站提供的一切资源内容信息仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。
3、本站信息来自第三方用户,非本站自制,版权归原作者享有,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。
4、注册会员通过任何手段和方法针对论坛进行破坏,我们有权对其行为作出处理。并保留进一步追究其责任的权利。
5、无忧技术吧(www.whct.net)所讨论的技术及相关工具仅限用于研究学习,皆在提高软件产品的安全性,严禁用于不良动机。任何个人、团体、组织不得将其用于非法目的,否则,一切后果自行承担。无忧技术吧不承担任何因为技术滥用所产生的连带责任。无忧技术吧内容源于网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除。如有侵权请邮件或QQ与我们联系处理。
6、如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵犯你版权的,请邮件与我们联系删除(邮箱:whctwlgzs@foxmail.com),本站将立即改正。
联系方式:
站长邮箱:whctwlgzs@foxmail.com
站长QQ:4040068
无忧论坛关注编程安全和移动安全、程序调试与病毒分析的前沿领域,平台本身资源丰富,作为一个资源平台,为程序员及广大编程爱好者提供了一个氛围良好的交流与合作空间。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

×本站发帖友情提示
1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
2、如果存在违反国家相关法律、法规、条例的行为,我们有权在不经作者准许的情况下删除其在本论坛所发表的文章。
3、所有网友不要盗用有明确版权要求的作品,转贴请注明来源,否则文责自负。
4、本社区保护注册用户个人资料,但是在自身原因导致个人资料泄露、丢失、被盗或篡改,本论坛概不负责,也不承担相应法律责任。

站长推荐 关闭


官方交流群:805881393

官方交流群:805881393


查看

关于烛光| 支付宝站| 广告服务| 法律声明| 隐私保护| 联系我们| Archiver| | |网站地图 帮助中心

鄂公网安备42011502001700号

工业和信息化部备案:鄂ICP备2024050280号-2 广告服务/联系QQ: 4040068 投诉受理QQ: 4040068 

技术支持:Discuz!  Copyright © 2009 - 2010 联系邮箱:whctwlgzs@foxmail.com 版权所有 无忧技术吧

GMT+8, 2025-5-24 12:13 , Processed in 0.151134 second(s), 39 queries .

请输入你要搜索的关键字关键字: 百度 google 一搜 搜狐