You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在WFP驱动的ALE Callout中获取svchost进程对应服务名

解决WFP Callout中获取svchost承载服务名的问题

问题背景

在WFP驱动中为FWPM_LAYER_ALE_AUTH_CONNECT_V4层注册了Callout,当连接由svchost进程发起时,尝试从FWPS_FIELD_ALE_AUTH_CONNECT_V4_ALE_USER_ID字段提取SID,得到的却是用户SID,而非实际发起连接的服务SID。需要确定单个svchost进程中具体是哪个服务发起了连接,最终目标是获取服务名。

可行解决方案

1. 从进程令牌组SID中提取服务SID(驱动层)

你当前获取的是令牌的用户SID,而服务SID存储在令牌的组SID列表中,且带有SE_GROUP_SERVICE属性。按以下步骤操作:

  • 从FWPS_FIELD_ALE_AUTH_CONNECT_V4_ALE_USER_ID拿到完整的TOKEN_ACCESS_INFORMATION结构
  • 遍历Groups数组,筛选出属性包含SE_GROUP_SERVICE的SID项
  • 该SID即为服务SID,后续可转换为服务名

示例代码片段:

PTOKEN_ACCESS_INFORMATION tokenInfo = (PTOKEN_ACCESS_INFORMATION)inFixedValues->incomingValue[FWPS_FIELD_ALE_AUTH_CONNECT_V4_ALE_USER_ID].value.tokenAccessInformation->data;

for (ULONG i = 0; i < tokenInfo->Groups->Count; i++) {
    PSID_AND_ATTRIBUTES group = &tokenInfo->Groups->Sid[i];
    if (group->Attributes & SE_GROUP_SERVICE) {
        // 定位到服务SID
        PSID serviceSid = group->Sid;
        // 后续执行SID转服务名逻辑
        break;
    }
}

2. 用户态辅助查询服务名

驱动层拿到服务SID后,可通过IOCTL将SID传递到用户态,调用LookupAccountSidW函数反向查询服务名。注意:

  • 确保用户态进程具备查询服务信息的权限
  • 处理LookupAccountSidW返回的S_NAME_NOT_FOUND等异常(比如临时服务SID)

3. 参考WFP用户态规则的匹配逻辑

像TinyWall这类项目使用FWPM_CONDITION_ALE_USER_ID匹配服务SID的思路,本质是WFP在处理服务发起的连接时,ALE_USER_ID对应的令牌中包含服务组SID。驱动层需要正确提取这个组SID,而非用户SID。

额外注意事项

  • 并非所有svchost中的服务都会使用服务SID发起连接,部分服务可能继承svchost的用户令牌,需做兼容性判断
  • 驱动层操作SID和令牌时,需严格注意内存安全,避免泄漏或越界访问

内容的提问来源于stack exchange,提问作者OneAndOnly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 00:03:23