注册表回调
解析查找nt!CallbackListHead。此解析通过迭代内存中CmUnRegisterCallback的导出表来执行,扫描其函数体以查找指令,然后根据从指令的操作码中提取的偏移量计算最终地址来完成的。
有了nt!CallbackListHead地址,FudModule就可以迭代注册表回调链表。它检查每个条目并确定回调例程是否在ntoskrnl.exe、applockerfltr.sys或bfs.sys中实现。如果是,则回调保持不变。否则,rootkit 将用指向的指针替换回调例程指针ObIsKernelHandle,然后继续取消链接回调条目。
对象回调
首先,rootkit 扫描例程主体ObGetObjectType以获取nt!ObTypeIndexTable的地址。它包含一个指向结构的指针数组_OBJECT_TYPE,每个结构都代表一个不同的对象类型,例如Process、Token或SymbolicLink。FudModule 迭代此数组(跳过前两个特殊含义的元素)并检查每个_OBJECT_TYPE.CallbackList,其中包含为特定对象类型注册的对象回调的双向链接列表。然后,rootkitCallbackList通过使每个节点的前向和后向指针指向自身来清空。
进程、线程和图像内核回调
nt!PspNotifyEnable