基于RPC的计划任务维权分析学习
字数 1286 2025-08-29 22:41:10
基于RPC的计划任务维权分析学习
前言
本文主要分析通过RPC接口创建计划任务的技术实现,包括ATSvc和ITaskSchedulerService两种方式,以及相关的技术细节和问题。
ATSvc方式
基本概念
ATSvc是Windows早期版本中用于创建计划任务的RPC服务,在高版本Windows中需要设置EnableAt为1才可用。
实现步骤
-
获取UUID:
- ATSvc的UUID可以从MSDN文档中查询获取
-
IDL文件编译:
- 从MSDN和ReactOS获取IDL文件
- 使用VS编译生成.h和.c文件
- 需要手动修复include语句不匹配的问题
-
编译问题解决:
#pragma comment(lib,"Rpcrt4.lib") // 解决NdrClientCall3等函数链接问题 // 定义MIDL相关函数 void* __RPC_USER MIDL_user_allocate(size_t size) { return malloc(size); } void __RPC_USER MIDL_user_free(void* p) { free(p); } -
使用限制:
- 仅适用于Windows 8以下版本
- 在Windows 10即使设置EnableAt为1也无法正常执行
ITaskSchedulerService方式
基本概念
ITaskSchedulerService是更现代的计划任务RPC服务接口。
实现步骤
-
定义UUID:
#define UUID L"86D35949-83C9-4044-B424-DB363231FD0C" -
XML任务模板:
- 需要按照MSDN规范创建XML任务描述文件
- 主要字段说明:
RegistrationInfo: 任务描述信息Triggers: 任务触发条件Settings: 执行策略Actions: 要执行的操作Principals: 权限设置
-
关键字段说明:
MultipleInstancesPolicy: 任务实例处理策略DisallowStartIfOnBatteries: 电池供电时禁止运行AllowHardTerminate: 是否允许强制终止Hidden: 是否隐藏任务ExecutionTimeLimit: 最大运行时间
-
实现流程:
- 获取当前用户SID
- 拼接符合规范的XML
- 调用SchRpcRegisterTask注册任务
底层RPC调用分析
-
直接调用NdrClientCall3:
- 可以绕过SchRpcRegisterTask直接调用底层RPC
- 第二个参数为opcode,1对应SchRpcRegisterTask
-
参数分析:
- 第一个参数来自IDL编译生成的stub
- 后续参数按顺序传入
命名管道方式
-
现状:
- 目前尚未完全研究成功
- 网上文章多基于MS_SCMR服务
- 尝试修改MS_SCMR封包函数但未成功
-
遇到的问题:
- pRpcResponseBaseHeader->bPacketType返回3(fault)
- 可能需要完成AUTH3认证
优化与隐藏
-
痕迹清理:
- 计划任务创建会在
%SystemRoot%\System32\Tasks留下XML文件 - 该文件存在与否不影响任务执行
- 计划任务创建会在
-
隐藏技术:
- 修改注册表对应Index的SD值
- 实现任务隐藏
总结
本文详细分析了通过RPC接口创建计划任务的两种主要方式,包括技术实现细节、遇到的问题和可能的优化方向。ITaskSchedulerService方式在现代Windows系统中更为可靠,而ATSvc方式在较新系统中已基本失效。直接调用底层RPC和命名管道方式仍有进一步研究的空间。