Fort Firewall子进程处理:进程继承关系追踪

Fort Firewall子进程处理:进程继承关系追踪

【免费下载链接】fort Fort Firewall for Windows 【免费下载链接】fort 项目地址: https://gitcode.com/GitHub_Trending/fo/fort

引言

在Windows防火墙开发中,子进程处理是一个复杂而关键的技术挑战。Fort Firewall作为一款高效的Windows防火墙,其进程树管理机制展现了专业级的子进程继承关系追踪能力。本文将深入分析Fort Firewall如何实现进程继承关系的精确追踪,为开发者提供实用的技术参考。

进程树管理架构

Fort Firewall采用分层架构管理进程关系,核心组件包括:

进程节点结构

typedef struct fort_psnode {
    struct fort_psnode *next;
    struct fort_psnode *prev;
    
    PFORT_PSNAME ps_name;        // 进程名称引用
    tommy_key_t pid_hash;        // 进程ID哈希值
    UINT32 process_id;           // 进程ID
    UINT16 volatile flags;       // 状态标志位
} FORT_PSNODE, *PFORT_PSNODE;

关键状态标志

标志位描述
FORT_PSNODE_NAME_INHERIT0x0001允许名称继承
FORT_PSNODE_NAME_INHERITED0x0002已继承父进程名称
FORT_PSNODE_NAME_CUSTOM0x0004自定义进程名称
FORT_PSNODE_KILL_PROCESS0x0008终止进程标志
FORT_PSNODE_KILL_CHILD0x0010终止子进程标志
FORT_PSNODE_IS_SVCHOST0x0020SvcHost服务进程

继承关系追踪机制

1. 进程创建通知处理

Fort Firewall通过Windows内核的PsSetCreateProcessNotifyRoutineEx注册进程创建回调:

static void NTAPI fort_pstree_notify(
        PEPROCESS process, HANDLE processId, PPS_CREATE_NOTIFY_INFO createInfo)
{
    FORT_PSTREE_NOTIFY_ARG pna = {
        .process = process,
        .processId = processId,
        .createInfo = createInfo,
    };
    fort_expand_stack(&fort_pstree_notify_expand, &pna);
}

2. 继承关系判定算法

mermaid

3. 继承检查实现

inline static BOOL fort_pstree_check_proc_inherited(
        PFORT_PSTREE ps_tree, PFORT_PSNODE proc, DWORD parentProcessId)
{
    if (proc->ps_name != NULL)
        return FALSE;

    PFORT_PSNODE parent = fort_pstree_find_proc(ps_tree, parentProcessId);
    if (parent == NULL)
        return FALSE;

    if ((parent->flags & (FORT_PSNODE_NAME_INHERIT | FORT_PSNODE_NAME_INHERITED)) == 0)
        return FALSE;

    PFORT_PSNAME ps_name = parent->ps_name;
    assert(ps_name != NULL);

    ++ps_name->refcount;        // 增加引用计数
    proc->ps_name = ps_name;    // 共享名称对象
    proc->flags |= FORT_PSNODE_NAME_INHERITED;

    return TRUE;
}

SvcHost服务进程特殊处理

Windows系统中的SvcHost进程需要特殊处理:

static BOOL fort_pstree_svchost_check(PCUNICODE_STRING commandLine, PUNICODE_STRING serviceName)
{
    PWCHAR argp = wcsstr(commandLine->Buffer, L"-s ");
    if (argp == NULL)
        return FALSE;

    argp += (sizeof(L"-s ") - sizeof(WCHAR)) / sizeof(WCHAR);
    PCWCHAR endp = wcschr(argp, L' ');
    
    if (endp == NULL) {
        endp = (PCWCHAR) ((PCHAR) commandLine->Buffer + commandLine->Length);
    }

    const USHORT nameLen = (USHORT) ((PCHAR) endp - (PCHAR) argp);
    if (nameLen >= FORT_PSTREE_NAME_LEN_MAX_SIZE)
        return FALSE;

    serviceName->Length = nameLen;
    serviceName->MaximumLength = nameLen;
    serviceName->Buffer = argp;

    return TRUE;
}

进程终止控制机制

Fort Firewall支持精细的进程终止控制:

inline static BOOL fort_pstree_check_kill_proc(
        PFORT_PSNODE proc, PPS_CREATE_NOTIFY_INFO createInfo, UINT16 flags)
{
    if (proc != NULL && (proc->flags & flags) != 0) {
        createInfo->CreationStatus = STATUS_ACCESS_DENIED;
        return TRUE;  // 阻止进程创建
    }
    return FALSE;
}

性能优化策略

1. 哈希索引优化

使用tommy哈希库实现高效的进程查找:

static PFORT_PSNODE fort_pstree_find_proc_hash(
        PFORT_PSTREE ps_tree, DWORD processId, tommy_key_t pid_hash)
{
    PFORT_PSNODE node = (PFORT_PSNODE) tommy_hashdyn_bucket(&ps_tree->procs_map, pid_hash);
    while (node != NULL) {
        if (node->process_id == processId)
            return node;
        node = node->next;
    }
    return NULL;
}

2. 内存池管理

采用自定义内存池减少内存碎片:

static PFORT_PSNAME fort_pstree_name_new(PFORT_PSTREE ps_tree, UINT16 name_size)
{
    PFORT_PSNAME ps_name = fort_pool_malloc(&ps_tree->pool_list,
            FORT_PSNAME_DATA_OFF + name_size + sizeof(WCHAR));
    if (ps_name != NULL) {
        ps_name->refcount = 1;
        ps_name->size = name_size;
        ps_name->data[name_size / sizeof(WCHAR)] = L'\0';
    }
    return ps_name;
}

实际应用场景

场景1:浏览器子进程管理

当Chrome浏览器启动渲染进程时,Fort Firewall能够:

  1. 识别父进程为chrome.exe
  2. 检查继承规则配置
  3. 自动应用相同的网络访问策略

场景2:服务进程识别

对于svchost托管的服务:

  1. 解析命令行参数获取服务名称
  2. 创建格式化的服务标识符
  3. 应用针对性的防火墙规则

最佳实践建议

1. 继承规则配置

// 在应用程序配置中设置继承标志
m_cbApplyChild->setText(tr("Apply same rules to child processes"));
m_cbKillChild->setText(tr("Kill child processes"));

2. 性能监控指标

指标正常范围异常阈值
进程查找时间< 1ms> 5ms
内存使用量< 10MB> 50MB
进程通知延迟< 100μs> 500μs

3. 调试与日志

启用详细日志记录:

#ifdef FORT_DEBUG
LOG("PsTree: NEW pid=%d ppid=%d IMG=[%wZ] CMD=[%wZ]\n", 
    processId, parentProcessId,
    createInfo->ImageFileName, createInfo->CommandLine);
#endif

技术挑战与解决方案

挑战1:进程生命周期同步

问题:进程创建和销毁通知可能不同步 解决方案:使用自旋锁保护进程树操作

挑战2:性能开销控制

问题:频繁的进程操作影响系统性能 解决方案:采用高效的哈希算法和内存池

挑战3:安全边界维护

问题:恶意进程尝试绕过继承检测 解决方案:在内核层面实施强制访问控制

总结

Fort Firewall的进程继承关系追踪机制展现了Windows防火墙开发的高级技术实践。通过精心的架构设计、高效的算法实现和严格的安全控制,该系统能够:

  1. 精确追踪进程父子关系
  2. 智能应用继承规则策略
  3. 高效管理系统资源消耗
  4. 可靠保障网络安全边界

这种技术方案不仅适用于防火墙开发,也为其他需要进程关系管理的系统软件提供了有价值的参考。开发者可以根据实际需求,借鉴其中的设计理念和实现细节,构建更加健壮和高效的进程管理系统。

【免费下载链接】fort Fort Firewall for Windows 【免费下载链接】fort 项目地址: https://gitcode.com/GitHub_Trending/fo/fort

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值