找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖
Claude、GPT 海外模型 API 接入Claude skills 从入门到精通 吴恩达亲授 AI Agent 核心技能2026 瞪哥公务员考试全攻略 行测申论一站式系统备考
Agent 文心智能蒸馏模型实战 90G 课程智泊 AI 大模型训练营 基于 LangChain 的 RAG 与提示工程实战构建企业级 AI 大脑:大模型微调与 RAG / Agent 全栈实战

6116

积分

0

好友

786

主题
发表于 2 小时前 | 查看: 3| 回复: 0

事情的起因是在大概 2 周前看到了 v2ex 上的一篇文章《我去,发现个好玩的,现在病毒木马都开始开源提示词了?》。当时我就进行了一轮测试,感受还挺复杂,本来准备马上写两篇测评,结果被各种事情拖到现在。

简单说就是:木马本身没开源,开源的是提示词。开源提示词这事在今年年初已经有苗头了,但现在连木马都开始这么干,确实有点蔓延的趋势。本篇文章基于其中 Windows 版 Rootkit 提示词做实际测评和分析,下一篇会继续分析 Linux 版 Rootkit 提示词。

Windows 木马开源提示词测评配图:安全研究、提示词能力边界与实测分析

这份提示词相当工程化。从环境搭建到完成项目最初版本,前后大概花了 3 个多小时。通过投喂 AI 提示词,确实生成了一个内核版本的 Rootkit,能够伪装进程、隐藏文件、服务、注册表和网络连接,甚至会对内核文件自身进行伪装,功能齐全而且强度不低。但坑点同样存在,至少我的测试机就蓝屏了。

源码分析

样本功能

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,代码很少,逻辑也很清晰。

DriverEntry 初始化代码截图:展示 PidSpoof、MiniFilter、nsiproxy Hook、注册表隐藏、写回初始化与驱动对象伪装等模块

进程伪装

这个样本并不是直接隐藏进程,而是通过修改内核 EPROCESS 的 UniqueProcessId 字段实现进程伪装。在本次测试中,被伪装进程的 PID 始终指向系统进程 PID=4。

它首先硬编码了各个 Windows 版本下 UniqueProcessId 字段在 EPROCESS 中的偏移,如果系统版本无法确定,就统一按 Win7 处理。老实说,这种写法也就是 AI 干得出来,正常人不太敢这么写,否则可能早就被公司开了。

DetectUniqueProcessIdOffset 函数实现:按 Windows 主版本号、次版本号和构建号返回 EPROCESS 偏移

下面这段是实际修改 EPROCESS 实现伪装的逻辑:

修改 EPROCESS UniqueProcessId 字段实现 PID 伪装的代码截图

网络隐藏

这部分在我看来难度较大,核心是 Hook nsiproxy 的 IRP_MJ_DEVICE_CONTROL,而 NSI 这些结构本身是未公开的。

安装 Hook 时使用 ObReferenceObjectByName + *IoDriverObjectType 按名称拿到驱动对象,然后原子替换 MajorFunction[IRP_MJ_DEVICE_CONTROL]。保存旧指针是为了卸载时恢复;用 InterlockedExchangePointer 而不是直接赋值,说明作者已经考虑过“可能有其他 Hook 也在改这个槽位”的情况。

通过 ObReferenceObjectByName 和 InterlockedExchangePointer 安装 nsiproxy Hook 的代码

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

NetHide 完成例程代码:从上下文复制原始完成例程信息,并在 IRP 成功后调用 NhFilterRequest

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

文件/目录隐藏

这部分没有什么特别复杂的地方,主要通过 MiniFilter 进行过滤。

服务/注册表隐藏

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

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

注册表根键前缀映射表:将 HKEY_LOCAL_MACHINE、HKEY_CURRENT_USER 等映射为 Registry 路径

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

RegHide 枚举重写逻辑:通过 ZwEnumerateKey 查找下一个非隐藏子键,并复制到调用者缓冲

关机回写

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

从 DriverSection 中提取驱动文件路径并复制到独立缓冲的代码

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

使用 InterlockedCompareExchange 与 ZwCreateFile 进行驱动写回的代码

至此,源码原理分析基本结束。虽然分析看起来并不复杂,但实际代码量接近 5000 行,对个人项目来说已经算不小了。整体技术路线中规中矩,基本都是公开技术,但把它们组合起来,就形成了一个全方位隐匿的高对抗性样本。

如何检测

我在测试机里做了实验,尝试了国内 3 款杀毒软件,基本都没有明显反应,于是转向手工检测。

用 GMER 进行 Rootkit 检测,默认检测行为下完全没有发现。

GMER Rootkit/Malware 扫描界面:左侧线程信息列表与右侧扫描选项

比较明显的异常是:样本会把目标进程伪装成系统进程 PID=4,所以通过 Process Hacker 可以看到系统中出现了两个 System 进程。

Process Hacker 进程列表中出现两个 System 进程的截图

但从属性上无法直接区分真假。

两个 System(4) 属性窗口对比:文件信息均为 NT Kernel & System

通过 XueTr,也就是 PCHunter,可以看到恶意进程。

PCHunter 进程列表显示 hidden_app.exe 等异常进程,其中文件厂商标记为“文件不存在”

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

驱动列表中出现多个 Null.SYS 条目,驱动对象与服务名异常

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

按文件名排序后显示异常 Null.SYS 驱动条目,分别关联 Psched 和 ntoskrnl.exe

提示词中的坑

其实坑点很多,感兴趣的可以自行测试。我这边的蓝屏原因是文档里的 LDR 节点伪装,也就是驱动伪装,与 PatchGuard 直接冲突导致。所以不要指望这份提示词可以一键生成完全符合预期的东西。

整体来说,这组 Rootkit 提示词揭示了一个值得关注的现象:攻击者开始把工程化经验沉淀进提示词,让 AI 参与恶意驱动开发。就样本本身看,它依赖的大多是公开技术,但组合后的隐蔽性已经不可忽视。对检测侧来说,单纯依赖杀软默认策略可能不够,恶意代码分析与 ARK 工具的手工核查仍然很有必要。




上一篇:多Agent协作系统开发实录:AutoGen与CrewAI选型避坑指南
下一篇:GPT-6 Astra 的 Skills、AGENTS.md 和提示词怎么改?OpenAI 官方建议
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-9-25 03:10 , Processed in 0.678315 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表