Enum and Remove Hook in Windows Kernel
设计目标:
- 别的ARK工具没有的,或者很少有的,或者不开源的。
- 自己喜欢的,常用的,避免自己繁琐的windbg操作。
- procexp.exe和processhacker及SystemInformer.exe有的,这里一般不添加。
- 应用层能实现的一般不添加。
- 不支持32位。
- 不支持GUI。
- 多使用符号文件,尽量减少硬编码。
- 支持Windows 7 SP1(Windows Server 2008 R2)及以后的系统。
- 后期考虑支持ARM64。
已经实现的功能:
- 枚举和移除进程回调。
PsSetCreateProcessNotifyRoutine + PsSetCreateProcessNotifyRoutineEx + PsSetCreateProcessNotifyRoutineEx2 - 枚举和移除线程回调。
PsSetCreateThreadNotifyRoutine + PsSetCreateThreadNotifyRoutineEx + PsRemoveCreateThreadNotifyRoutine - 枚举和移除IMAGE回调。
PsSetLoadImageNotifyRoutine + PsSetLoadImageNotifyRoutineEx + PsRemoveLoadImageNotifyRoutine
暂时不支持:SeRegisterImageVerificationCallback + SeUnregisterImageVerificationCallback - 枚举和移除注册表回调。
CmRegisterCallback + CmRegisterCallbackEx + CmUnRegisterCallback - 枚举和移除对象(进程,线程,桌面)回调。
ObRegisterCallbacks + ObUnRegisterCallbacks - 枚举和移除MiniFilter。
包含Operations(PreOperation + PostOperation)
包含Contexts(ContextCleanupCallback + ContextType)
包含CommunicationPort(仅仅ServerPort)的信息,如:ConnectNotify + DisconnectNotify + MessageNotify。
FltRegisterFilter + FltUnregisterFilter(有待测试, 可能会卡) - 枚举和反注册WFP的Callout。
FwpsCalloutRegister + FwpsCalloutUnregisterById
没有使用符号解析,没有使用硬编码,使用导出的函数。 - 枚举网络协议驱动。
NdisRegisterProtocolDriver + NdisRegisterProtocol - 枚举网络过滤驱动。
特指通过NdisFRegisterFilterDriver注册的。 - 枚举小端口网卡驱动。注意:不是网卡个数。
NdisMRegisterMiniportDriver - 枚举和删除DPC定时器。有待完善。
以Zw/Nt/Ex开头的定时器也属于这个。
KeCancelTimer。
用到了符号解析,如:结构体中成员的偏移,结构体中的数组的个数,全局且未导出的变量等。 - 枚举和停止IO定时器。
IoInitializeTimer + IoStopTimer - 读写内核内存。
遍历内核内存待补。 - 枚举System Service Descriptor Table (SSDT)
KeServiceDescriptorTable - 枚举System Service Shadow Descriptor Table (SSSDT)
KeServiceDescriptorTableShadow - 枚举Global Descriptor Table (GDT)
- 枚举Interrupt Descriptor Table (IDT)
注意:Interrupt Vector Table (IVT) - 枚举过滤设备。如:TDI,NPFS,MSFS,NSI等。
之所以说是设备而不是驱动,是因为
其一:IoAttachDevice(ByPointer) + IoAttachDeviceToDeviceStack(Safe)
其二:TDI的设备名不变,但是它所在的驱动在变。
其三:常规流程下,驱动的派遣函数只有基于设备的IRP才会被调用。 - 枚举和移除关机回调。
注册包括:IoRegisterShutdownNotification,IoRegisterLastChanceShutdownNotification,
反注册用:IoUnregisterShutdownNotification(Shutdown + LastChanceShutdown)。 - 枚举和移除蓝屏回调。
注册支持:KeRegisterBugCheckCallback, KeRegisterBugCheckReasonCallback。
反注册支持:KeDeregisterBugCheckCallback,KeDeregisterBugCheckReasonCallback - 枚举类型对象。
即:对象目录\ObjectTypes下的成员及信息。
驱动可创建,也可修改(系统有保护)。 - 枚举驱动对象。
主要显示一些函数信息,如:MajorFunction,FastIoDispatch等。 - 枚举和反注册Ex回调。
ExRegisterCallback + ExUnregisterCallback。(对象目录:\Callback) - 枚举和反注册会话回调
(IoRegisterContainerNotification,非SeRegisterLogonSessionTerminatedRoutine/Ex.) - 枚举HalDispatchTable
没有使用符号解析,没有使用特征码。 - 枚举已经卸载的驱动
- 给进程赋予System的Token权限,相当于NT AUTHORITY\SYSTEM。
没有使用符号解析,没有使用特征码。
有待验证是否会触发系统的保护机制(PG/KPP). - 设置进程的ProcessProtectionLevel。
没有使用符号解析,没有使用特征码。
有待验证是否会触发系统的保护机制(PG/KPP). - 修改进程的句柄的权限。
如:0x1fffff,这个可以和ObRegisterCallbacks对抗,逃避监控。
验证:先切换到目标进程(.process /r /p 0xXXXXXX),然后运行!handle 0xxx。
危险:谨慎使用,弄不好会卡系统。
有待验证是否会触发系统的保护机制(PG/KPP). - 枚举PiDDBCache
- 枚举HalAcpiDispatchTable
- 枚举HalSubComponents
- 枚举HalIommuDispatchTable
没有定义数据结构。结构的大小,以及成员的名字,类型,偏移等都是解析符号文件得出。
相当于:r $t1 = nt!HalIommuDispatchTable;dt nt!_HAL_IOMMU_DISPATCH @$t1 的加强版 - 枚举HalPrivateDispatchTable
- 枚举KeServiceDescriptorTableFilter。
win32k!W32pServiceTableFilter = win32k!SysEntryGetW32pServiceTableFilter()
KeAddSystemServiceTable(W32pServiceTableFilter, 0i64, W32pServiceLimitFilter, &W32pArgumentTableFilter, 2); - 枚举和反注册不可屏蔽中断(NMI:nonmaskable interrupt)回调。
KeRegisterNmiCallback + KeDeregisterNmiCallback - 枚举LookasideList信息。
ExNPagedLookasideListHead + ExPagedLookasideListHead + ExSystemLookasideListHead + ExPoolLookasideListHead - 枚举执行体资源(_ERESOURCE)信息。
ExpSystemResourcesList + ExpResourceSpinLock - 物理内存相关。
枚举物理内存,当前是分块进行的,也可以按照页进行的。MmGetPhysicalMemoryRanges + MmIsIoSpaceActive
读写物理内存。MmMapIoSpace + MmUnmapIoSpace + MmProbeAndLockPages
物理内存与虚拟内存(必须是内核内存且非分页)的互转。MmGetVirtualForPhysical + MmGetPhysicalAddress - 枚举和反注册PNP通知。
PnpProfileNotifyList + PnpDeviceClassNotifyList + PnpDeferredRegistrationList + PnpKsrNotifyList
IoUnregisterPlugPlayNotificationEx - 枚举和反注册电源设置回调。
PopRegisteredPowerSettingCallbacks + PopSettingLock + PoUnregisterPowerSettingCallback
考虑添加的功能:
- 工作线程. 尽管生命周期很短。
- 反汇编引擎,如:zydis。
- 硬件虚拟化相关的。
- POOL TAG。
- 本地内核调试。
- EtwRegister EtwUnregister
- BIG POOL
- KseRegisterShim KseRegisterShimEx KseUnregisterShim
- PcwRegister PcwUnregister
- NmrpRegisterModule == NmrRegisterClient + NmrRegisterProvider + WskRegister。
- PsRegisterSiloMonitor
- PsRegisterPicoProvider
- 系统热键 和 消息钩子
- Unified Extensible Firmware Interface (UEFI)
- Root System Description Table (RSDT)
- Fixed ACPI Description Table (FADT)
- Multiple APIC Description Table (MADT)
- Generic Timer Description Table (GTDT)
- Core System Resources Table (CSRT)
- Debug Port Table 2 (DBG2)
- Differentiated System Description Table (DSDT)
- Windows SMM Security Mitigations Table (WSMT)
- iSCSI Boot Firmware Table (iBFT)
- Boot Graphics Resource Table (BGRT)
- Firmware Performance Data Table (FPDT)
确定不添加的功能:
- 进程
- 文件
- 注册表
- MBR 已经过时了。
- 端口 因为有netstat和tcpview.exe。
- LSP
- 系统线程 因为有procexp.exe。
- 句柄 因为有procexp.exe。
- 启动项 因为有Autoruns.exe。
- 驱动模块 driverquery等工具都有。
- 系统服务 系统自带的功能。
- 计划任务 系统自带的功能。
- 防火墙规则 系统自带的功能。
- 设备管理器 系统自带的功能。
- 证书管理器 系统自带的功能。
2024-01-13