基于RPC的计划任务维权分析学习
字数 1286 2025-08-29 22:41:10

基于RPC的计划任务维权分析学习

前言

本文主要分析通过RPC接口创建计划任务的技术实现,包括ATSvc和ITaskSchedulerService两种方式,以及相关的技术细节和问题。

ATSvc方式

基本概念

ATSvc是Windows早期版本中用于创建计划任务的RPC服务,在高版本Windows中需要设置EnableAt为1才可用。

实现步骤

  1. 获取UUID

    • ATSvc的UUID可以从MSDN文档中查询获取
  2. IDL文件编译

    • 从MSDN和ReactOS获取IDL文件
    • 使用VS编译生成.h和.c文件
    • 需要手动修复include语句不匹配的问题
  3. 编译问题解决

    #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);
    }
    
  4. 使用限制

    • 仅适用于Windows 8以下版本
    • 在Windows 10即使设置EnableAt为1也无法正常执行

ITaskSchedulerService方式

基本概念

ITaskSchedulerService是更现代的计划任务RPC服务接口。

实现步骤

  1. 定义UUID

    #define UUID L"86D35949-83C9-4044-B424-DB363231FD0C"
    
  2. XML任务模板

    • 需要按照MSDN规范创建XML任务描述文件
    • 主要字段说明:
      • RegistrationInfo: 任务描述信息
      • Triggers: 任务触发条件
      • Settings: 执行策略
      • Actions: 要执行的操作
      • Principals: 权限设置
  3. 关键字段说明

    • MultipleInstancesPolicy: 任务实例处理策略
    • DisallowStartIfOnBatteries: 电池供电时禁止运行
    • AllowHardTerminate: 是否允许强制终止
    • Hidden: 是否隐藏任务
    • ExecutionTimeLimit: 最大运行时间
  4. 实现流程

    • 获取当前用户SID
    • 拼接符合规范的XML
    • 调用SchRpcRegisterTask注册任务

底层RPC调用分析

  1. 直接调用NdrClientCall3

    • 可以绕过SchRpcRegisterTask直接调用底层RPC
    • 第二个参数为opcode,1对应SchRpcRegisterTask
  2. 参数分析

    • 第一个参数来自IDL编译生成的stub
    • 后续参数按顺序传入

命名管道方式

  1. 现状

    • 目前尚未完全研究成功
    • 网上文章多基于MS_SCMR服务
    • 尝试修改MS_SCMR封包函数但未成功
  2. 遇到的问题

    • pRpcResponseBaseHeader->bPacketType返回3(fault)
    • 可能需要完成AUTH3认证

优化与隐藏

  1. 痕迹清理

    • 计划任务创建会在%SystemRoot%\System32\Tasks留下XML文件
    • 该文件存在与否不影响任务执行
  2. 隐藏技术

    • 修改注册表对应Index的SD值
    • 实现任务隐藏

总结

本文详细分析了通过RPC接口创建计划任务的两种主要方式,包括技术实现细节、遇到的问题和可能的优化方向。ITaskSchedulerService方式在现代Windows系统中更为可靠,而ATSvc方式在较新系统中已基本失效。直接调用底层RPC和命名管道方式仍有进一步研究的空间。

基于RPC的计划任务维权分析学习 前言 本文主要分析通过RPC接口创建计划任务的技术实现,包括ATSvc和ITaskSchedulerService两种方式,以及相关的技术细节和问题。 ATSvc方式 基本概念 ATSvc是Windows早期版本中用于创建计划任务的RPC服务,在高版本Windows中需要设置 EnableAt 为1才可用。 实现步骤 获取UUID : ATSvc的UUID可以从MSDN文档中查询获取 IDL文件编译 : 从MSDN和ReactOS获取IDL文件 使用VS编译生成.h和.c文件 需要手动修复include语句不匹配的问题 编译问题解决 : 使用限制 : 仅适用于Windows 8以下版本 在Windows 10即使设置EnableAt为1也无法正常执行 ITaskSchedulerService方式 基本概念 ITaskSchedulerService是更现代的计划任务RPC服务接口。 实现步骤 定义UUID : 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和命名管道方式仍有进一步研究的空间。