C++驱动程序怎么利用断链技术(ActiveProcessLinks双向链表摘除)隐藏自身进程

老晨小哥_3528

老晨小哥_3528

2026-10-23

438人浏览

原创

断链activeprocesslinks能让进程“消失”,因为ntquerysysteminformation等系统调用枚举进程时仅遍历psactiveprocesshead链表;摘除目标eprocess节点后,任务管理器、tasklist等标准工具便无法发现该进程,但其仍正常运行且不受影响。

c++驱动程序怎么利用断链技术(activeprocesslinks双向链表摘除)隐藏自身进程

为什么断链 ActiveProcessLinks 能让进程“消失”

因为 Windows 内核枚举进程(比如 NtQuerySystemInformation 传 SystemProcessInformation)时,底层只做一件事:从全局头指针 PsActiveProcessList 出发,顺着每个 EPROCESS->ActiveProcessLinks 的 Flink 一路遍历。只要把目标 EPROCESS 从这个双向链表里摘掉(即修改前后节点的指针),它就彻底不在标准枚举路径上——任务管理器、tasklist、EnumProcesses 全部查不到。

但要注意:这不等于进程被终止,也不影响其线程调度、内存、句柄或网络连接;只是“不可见”,不是“不存在”。EDR 若注册了 PsSetCreateProcessNotifyRoutine 回调,仍能捕获进程创建事件。

断链前必须获取目标 EPROCESS 地址

驱动不能靠 PID 直接硬算地址,必须用内核 API 安全获取。常见错误是直接读取用户传入的 PID 后调用 PsLookupProcessByProcessId,却忽略返回值检查和引用计数管理:

  • PsLookupProcessByProcessId 返回的是带引用的 PEPROCESS,必须配对调用 ObDereferenceObject,否则对象泄漏、系统不稳定
  • 若目标进程已退出,该函数返回 STATUS_INVALID_CID,不检查就断链会蓝屏(BSOD)
  • 64 位系统下,EPROCESS 地址是内核态有效地址,不能在用户态缓存或跨进程传递

正确做法是:在驱动中封装一个安全查找函数,内部用 ExAcquireResourceSharedLite 保护(某些 Windows 版本需),并始终校验返回状态。

摘链操作本身要原子且可逆

断链不是简单改两个指针,而是三步原子操作(以摘除 TargetEprocess 为例):

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • 保存 TargetEprocess->ActiveProcessLinks.Flink 和 Blink
  • 将 Flink->Blink 指向 Blink,再将 Blink->Flink 指向 Flink(即跳过当前节点)
  • 清空 TargetEprocess->ActiveProcessLinks.Flink/Blink,避免被误遍历

关键细节:

  • 必须禁用中断(KeRaiseIrql(DISPATCH_LEVEL, &oldIrql))或使用自旋锁,防止遍历时链表被并发修改
  • 不能只改一个方向(如只改 Flink),否则遍历到末尾时可能触发空指针解引用
  • 恢复链表时,必须用保存的原始指针原路写回,不能依赖当前 PsActiveProcessList 状态(它可能已被其他驱动改动)

隐藏自身进程时最易踩的三个坑

驱动想隐藏自己(即当前驱动所对应的 System 进程或注入后所在的宿主进程),难点不在断链逻辑,而在时机与上下文:

  • 不能在 DriverEntry 里直接断链——此时 EPROCESS 可能尚未完全初始化,PsActiveProcessList 也未稳定,极易蓝屏
  • 不能在 IRP 处理函数中反复执行断链——每次调用都需重新查找 EPROCESS,开销大且易因进程退出导致状态不一致
  • 若驱动以 Win32k.sys 或 csrss.exe 为宿主,断链后可能导致 GUI 子系统异常,因为这些进程有特殊内核契约

真正可行的做法是:在驱动完成初始化后,用工作线程(ExQueueWorkItem)延时 1–2 秒再执行一次断链,并记录原始 Flink/Blink 值供卸载时恢复。所有操作必须包裹在 __try/__except 中,任何异常都要立即放弃并记录日志。

断链不是黑魔法,它暴露在内核回调、对象表扫描、物理内存 dump 下毫无遮掩。真正难的是让断链动作不破坏调度、不触发 AV/EDR 的内核钩子检测、不留下可被 !process -a 或 dt _eprocess 手动定位的痕迹——这些细节,往往比断链本身更消耗调试时间。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

驱动精灵
驱动精灵

驱动精灵基于驱动之家十余年的专业数据积累,驱动支持度高,已经为数亿用户解决了各种电脑驱动问题、系统故障,是目前有效的驱动软件,有需要的小伙伴快来保存下载体验吧!

下载

相关标签:

c++ c++编程 c++安全 ssl

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.14

2248

9

c++和python学习顺序推荐
c++和python学习顺序推荐

一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

1019

6

python和c++学习性价比分析
python和c++学习性价比分析

Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

447

5

c语言和c++一样吗
c语言和c++一样吗

c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

327

5

c语言和c++先学哪个好
c语言和c++先学哪个好

初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

426

5

c语言和c++的区别和联系
c语言和c++的区别和联系

c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

580

5

c++软件中文更改教程
c++软件中文更改教程

对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.21

1409

9

python和java和c++学习性价比分析
python和java和c++学习性价比分析

Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

2024.03.22

1217

7

c++和c语言学习顺序推荐
c++和c语言学习顺序推荐

对于初学者,建议先学习C语言,掌握编程基础后再转入C++,便于理解面向对象编程概念。有编程经验者可直接学习C++,快速接触高级编程技术。想了解更多c++和c语言的相关内容,可以阅读本专题下面的文章。

2024.03.25

1325

9

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习