Fort Firewall子进程处理:进程继承关系追踪
【免费下载链接】fort Fort Firewall for Windows 项目地址: 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_INHERIT | 0x0001 | 允许名称继承 |
| FORT_PSNODE_NAME_INHERITED | 0x0002 | 已继承父进程名称 |
| FORT_PSNODE_NAME_CUSTOM | 0x0004 | 自定义进程名称 |
| FORT_PSNODE_KILL_PROCESS | 0x0008 | 终止进程标志 |
| FORT_PSNODE_KILL_CHILD | 0x0010 | 终止子进程标志 |
| FORT_PSNODE_IS_SVCHOST | 0x0020 | SvcHost服务进程 |
继承关系追踪机制
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. 继承关系判定算法
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能够:
- 识别父进程为chrome.exe
- 检查继承规则配置
- 自动应用相同的网络访问策略
场景2:服务进程识别
对于svchost托管的服务:
- 解析命令行参数获取服务名称
- 创建格式化的服务标识符
- 应用针对性的防火墙规则
最佳实践建议
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防火墙开发的高级技术实践。通过精心的架构设计、高效的算法实现和严格的安全控制,该系统能够:
- 精确追踪进程父子关系
- 智能应用继承规则策略
- 高效管理系统资源消耗
- 可靠保障网络安全边界
这种技术方案不仅适用于防火墙开发,也为其他需要进程关系管理的系统软件提供了有价值的参考。开发者可以根据实际需求,借鉴其中的设计理念和实现细节,构建更加健壮和高效的进程管理系统。
【免费下载链接】fort Fort Firewall for Windows 项目地址: https://gitcode.com/GitHub_Trending/fo/fort
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



