对一款Windows木马开源提示词的测评"

admin 2026-10-16 10:27:31 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

对一款Windows木马开源提示词的测评

刃无锋
刃无锋

kali笔记

2026年9月23日 08:00
甘肃

在小说阅读器读本章

去阅读

在公众号小说中沉浸阅读

事情的起因是在大概2周前看到了v2ex上的一篇文章《我去,发现个好玩的,现在病毒木马都开始开源提示词了?》

我当时就进行了测试,还挺感慨的,本来打算立即写两篇测评文章,但是因为各种事情一直忙,就拖到了现在。简单说就是,木马没开源,但开源了提示词。开源提示词这事儿在今年年初就有这个苗头了,但是现在连木马开始都这么干了,感觉有蔓延的趋势。本篇文章是基于其中Windows版 Rootkit 提示词进行的实际测评和分析,下一篇会对Linux版的Rootkit提示词进行测评分析。

提示词相当工程化,怎么说呢,花费了大概3个多小时的时间才完成项目的最初版本,当然,这中间涉及到环境搭建。通过投喂AI提示词,确实生成了一个内核版本的Rootkit,而且可以伪装进程、隐藏文件、服务、注册表、网络,甚至会对内核文件自身进行伪装,功能齐全且强大。但是坑点也还是有的,反正我的测试机蓝屏了。

源码分析

01样本功能

Windows版的提示词为“azure-wdm-agent-prompt.md”,原始文档是英文的,我英语不好,先翻译成了中文。文档中并未直接告诉AI生成的内核项目是什么名称,所以项目名称根据AI的发挥随机进行项目起名。项目能力和实现原理大致如下:

能力 模块 实现手段
进程 PID 伪装 PidSpoof.c 直接改写 EPROCESS.UniqueProcessId 为 4
TCP 连接隐藏 NetHide.c Hook nsiproxy 的 IRP_MJ_DEVICE_CONTROL,在完成例程里压缩 TCP 表
文件/目录隐藏 PathHide.c MiniFilter:CREATE 返回 NOT_FOUND,目录枚举就地压缩
注册表键隐藏 RegHide.c CmRegisterCallbackEx :PreOpen 返回 NOT_FOUND,PostEnumerate 跳过子键
驱动镜像写回 WriteBack.c 加载时把 .sys 缓存进非分页池,关机/休眠时写回原路径
驱动对象伪装 DriverObjectSpoof.c 克隆 \\Driver\\Null 的 _DRIVER_OBJECT 元数据 + LDR 节点

首先对DriverEntry进行分析,代码很少,逻辑清晰

02进程伪装

该样本并不是对进程进行隐藏,而是通过修改内核EPROCESS的UniquePorcessId字段,实现进程伪装,在本次测试中,伪装的PID始终为系统进程(PID=4)。
首先是通过硬编码各个Windows版本的UniquePorcessId字段在EPROCESS下的偏移,如果不确定是哪个系统,统一当Win7处理。老实说,就这逻辑,也就AI干得出来,是个人都不敢这么写,否则早被公司开了。

修改EPROCESS实现伪装

03网络隐藏

这部分在我看来,是难度较大的,Hook nsiproxy 的 IRP_MJ_DEVICE_CONTROL,但是NSI 的这些结构是未公开的。安装HOOK:用 ObReferenceObjectByName + *IoDriverObjectType 按名字拿到驱动对象,然后原子替换MajorFunction[IRP_MJ_DEVICE_CONTROL]。保存旧指针以便卸载时恢复;用InterlockedExchangePointer 而不是直接赋值,说明作者考虑过「可能有其他 hook 也在改这个槽位」。

之后注入完成例程,完成例程部分关键代码如下:

之后进行表压缩,TCP 表、状态表、PID 表是三个平行数组,删除一行必须三张表同时压缩,否则 PID 会错位到别的连接上。NhRemoveRow 用 RtlMoveMemory 把后续行整体前移。pidValid 的设计也很谨慎:PID 表缺失时 ByPid 规则一律不匹配,否则一张不存在的表会退化成人人命中,把整张连接表清空。

04 文件/目录隐藏

没什么好说的,就是通过Minifilter进行过滤

05 服务/注册表隐藏

通过注册注册表回调来实现注册表的隐藏,由于系统服务也存在于注册表中,所以同时可以实现对服务的隐藏。

配置里允许写人类习惯的 HKLM\\...,回调里看到的却是 \\Registry\\Machine\\...。把映射关系做成一张表(而不是 if/else 链)使扩展成本很低。转换函数还处理了两个边界。

因为注册表回调 API 没有提供「跳过这一项」的便利返回,跳过隐藏子键只能重写枚举结果。做法是:拿到当前项的索引,从 Index + 1 开始自己调 ZwEnumerateKey(用重入保护避免递归),找到第一个不隐藏的项,把它拷进调用者的缓冲并修正 ResultLength。

06 关机回写

关机回写的前提是,需要先将驱动文件本身复制一份到内核内存,文件路径从 DriverObject->DriverSection 指向的 LDR 节点里取。深拷贝成 NUL 结尾的独立缓冲是必要的,毕竟UNICODE_STRING 本身不保证NUL 结尾,而后面 ZwCreateFile 要用它。

写入过程中,用 InterlockedCompareExchange 确保同步——关机路径和电源回调可能同时触发,必须防止两个线程同时 FILE_OVERWRITE_IF 打开同一个文件。

至此,源码的原理分析基本结束,虽然分析看着简单,但实际上代码量达到了接近5000行,从个人项目来讲,已经算是个不小的项目了。就整个项目而言,采用的技术中规中矩,基本都是公开技术,但综合在一起,形成了一个全方位隐匿的高对抗性样本。

如何检测

我在测试机中做了实验,尝试了国内3款杀毒软件,都没啥反应,于是尝试手工检测。

通过Gmer进行Rootkit检测(检测的默认行为),完全没有发现

但是比较明显的是,该样本会将目标进程伪装为系统进程(PID=4),所以通过ProcessHacker可以看到异常,系统中出现两个System进程

但从属性上无法区分真假

但通过XueTr(也就是PCHunter)可以看到恶意进程

对于内核的检测,由于其会固定将自身伪装为系统的NULL.sys,所以是可以通过PCHunter等ARK工具检测到异常的,很明显,伪装终究是伪装,不可能面面俱到,驱动对象和服务名是空的,对于系统服务来说,这不正常。

也可以给通过文件名排序,发现异常的内核驱动

提示词中的坑

其实挺多的,可以自行测试。我这边蓝屏是因为文档中LDR 节点伪装(驱动伪装)与 PatchGuard 直接冲突导致,所以不要指望该提示词可以一键完成你要的东西。

更多精彩文章 欢迎关注我们


对一款Windows木马开源提示词的测评" 网络安全文章

对一款Windows木马开源提示词的测评"

本文测评了一款Windows版Rootkit提示词,分析了其进程伪装、网络隐藏、文件目录隐藏、注册表隐藏、驱动伪装及关机回写等核心功能模块的实现原理,指出该样本功能齐全但存在与PatchGuard冲突导致蓝屏等坑点,并提供了使用ARK工具进行手工检测的思路。
威努特超融合一体机亮相华为全联接大会" 网络安全文章

威努特超融合一体机亮相华为全联接大会"

威努特在华为全联接大会发布鲲鹏超融合一体机解决方案,面向政府、医疗、能源等行业,实现从鲲鹏硬件到超融合平台的全栈国产化,具备开箱即用、弹性部署、深度性能调优等优势,存储性能提升30%,支持鲲鹏CPU与昇腾NPU统一调度,助力信创改造与VMware替代。
Linuxio_uring固定缓冲区逃逸" 网络安全文章

Linuxio_uring固定缓冲区逃逸"

本文深入分析io_uring固定缓冲区机制中的引用计数管理缺陷,揭示CVE-2022-4696的use-after-free漏洞及PinTheft攻击(CVE-2026-43494)如何通过RDS零拷贝double-free窃取FOLL_PIN引用,将页引用计数降至零后释放页,再通过悬空指针覆写SUID二进制页缓存植入恶意ELF载荷获取root权限。文章还提及CVE-2026-43006信息泄露漏洞,并提供基于liburing的完整PoC框架,对内核安全研究具有重要参考价值。
100小时长征:史上首个Agent自主不间断渗透完整战报" 网络安全文章

100小时长征:史上首个Agent自主不间断渗透完整战报"

本文报道了史上首次Agent自主不间断渗透测试挑战,在VulnHouse靶场完成100小时连续作业,共处理464道题,233次验证通过,得分19340分。文章详述了VulnHouse靶场设计、SonicHarness的MEA架构及关键案例,展示了Agent在速度、吞吐、持续性和自主破局方面的能力,同时指出其局限并展望了工程化前景。
评论:0   参与:  0