-
-
[讨论]hook OBJECT_HEADER->POBJECT_TYPE的疑问
-
发表于:
2013-9-17 12:58
7305
-
[讨论]hook OBJECT_HEADER->POBJECT_TYPE的疑问
继续纠结object hook
MJ0011 N多年前的一篇关于object type hook的文章中,介绍的hook位置是系统的各种Procedure,后来也看到一些文章把hook的位置换到了系统的OBJECT_TYPE中这些Procedure的指针。
而最近看到另外一些文章,提出可以hook OBJECT_HEADER->POBJECT_TYPE,也就是对象头中的对象类型指针指向自定义的类型(或者Windows 7下的type index)。这种方法看起来很不错,因为对象头是每个对象私有的,hook私有的位置可以比较方便地实现保护特点对象(比如说禁止打开某个进程)。
但今天看WRK的时候发现了一个细节:
NTSTATUS
ObpCreateHandle (
IN OB_OPEN_REASON OpenReason,
IN PVOID Object,
IN POBJECT_TYPE ExpectedObjectType OPTIONAL,
IN PACCESS_STATE AccessState,
IN ULONG ObjectPointerBias OPTIONAL,
IN ULONG Attributes,
IN POBP_LOOKUP_CONTEXT LookupContext,
IN KPROCESSOR_MODE AccessMode,
OUT PVOID *ReferencedNewObject OPTIONAL,
OUT PHANDLE Handle
)
//省略若干内容
if ((ARGUMENT_PRESENT( ExpectedObjectType )) &&
(ObjectType != ExpectedObjectType )) {
if (LookupContext) {
ObpReleaseLookupContext( LookupContext );
}
return( STATUS_OBJECT_TYPE_MISMATCH );
}
//……
可以看到,在创建句柄的时候,内核会比较 OBJECT_HEADER->POBJECT_TYPE和调用函数时指定的type,如果不相同的话就会报错。这样后面自己替换上的Produce就没什么事情做了。因此,似乎hook这个位置进行对特定对象的保护(包括实现反object hook) 都会导致这个对象变得彻底无法打开。除非在ObOpenObjectByName和ObOpenObjectByPointer中也作出处理,但这样就显得太麻烦了。
按照上述分析,自定义 object type进行objhook就是完全不可行的了?或者是存在其他细节没有注意到所以得出了错误的结论。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课