如何在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
相关产品推荐
相关产品推荐

