来源:http://blog.sina.com.cn/s/blog_62a630640100gosp.html
方法一、ObReferenceObjectByName
声明:
NTKERNELAPI
NTSTATUS
ObReferenceObjectByName(
IN PUNICODE_STRING ObjectName,
IN ULONG Attributes,
IN PACCESS_STATE PassedAccessState OPTIONAL,
IN ACCESS_MASK DesiredAccess OPTIONAL,
IN POBJECT_TYPE ObjectType,
IN KPROCESSOR_MODE AccessMode,
IN OUT PVOID ParseContext OPTIONAL,
OUT PVOID *Object
);
参数说明:
1.名称的UNICODE_STRING结构的地址
2.对象属性,如OBJ_CASE_INSENSITIVE
3. 一般设置为0
4.访问属性,如:GENERIC_READ GENERIC_WRITE
5.对象类型,是内核导出的变量,通过windbg我找到了这些:
IoControllerObjectType 805519ec
IoDriverObjectType 805519e0
IoFileObjectType 805519d8
IoDeviceHandlerObjectType 805519dc
IoDeviceObjectType 805519e4
IoAdapterObjectType 805519f0
IoCompletionObjectType 805519e8
后面的地址是这些变量的地址,实际调用时用此地址处的值进行调用
6. 常量KernelMode
7.一般设置为0
8.用于接收返回对象地址的变量的地址
如:
mov ecx,IoDriverObjectType
mov ecx,dword ptr [ecx]
mov ecx,dword ptr [ecx]
invoke ObReferenceObjectByName,addr szDevLow,OBJ_CASE_INSENSITIVE,0,0,\
ecx,KernelMode,0,addr @lpDevObj
补充:并不是所有类型的对象都能正常返回,像Device类型的对象,就不能用这个函数来得到其对象
方法二、ObOpenObjectByName()-->ObReferenceObjectByHandle()
声明:
NTKERNELAPI
NTSTATUS
ObOpenObjectByName(
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN POBJECT_TYPE ObjectType,
IN KPROCESSOR_MODE AccessMode,
IN OUT PACCESS_STATE PassedAccessState OPTIONAL,
IN ACCESS_MASK DesiredAccess OPTIONAL,
IN OUT PVOID ParseContext OPTIONAL,
OUT PHANDLE Handle
);
参数说明
1.OBJECT_ATTRIBUTES类型的结构体的地址
2.见ObReferenceObjectByName参数5的说明,这里我发现设置0也能正常返回
3.常量KernelMode
4.一般设置为0
5.期望获得的权限,如GENERIC_READ GENERIC_WRITE
6.一般设置为0
7.用来接收返回句柄的变量的地址
如: mov eax,_lpObjName
mov @stOA.ObjectName,eax
mov @stOA._Length,sizeof OBJECT_ATTRIBUTES
mov @stOA.Attributes,OBJ_CASE_INSENSITIVE
invoke ObOpenObjectByName,addr @stOA,0,KernelMode,0,GENERIC_READ or GENERIC_WRITE,0,addr @hObj
.if !eax
;打开成功,得到句柄,下面找到对象地址
invoke ObReferenceObjectByHandle,@hObj,0,0,KernelMode,addr @lpObj,0
;--句柄不要了,关掉
invoke ZwClose,@hObj
.endif
和第一种方法的限制一样,并不是所有类型的对象都能正常返回,像Device类型的对象,就不能用
此方法得到其对象
方法三、ZwCreateFile()-->ObReferenceObjectByHandle()
如:
mov eax,_lpObjName
mov @stOA.ObjectName,eax
mov @stOA._Length,sizeof OBJECT_ATTRIBUTES
invoke ZwCreateFile,addr @hObj,GENERIC_WRITE,addr @stOA,addr @stISB,0,\
FILE_ATTRIBUTE_NORMAL,0,FILE_OPEN_IF,FILE_SYNCHRONOUS_IO_NONALERT,0,0
这种方法很容易,也没什么限制,是推荐使用的
一直搜索论坛,都没人讲怎么获取DebugObject,头痛了一个礼拜啊.
今天终于知道怎么取得对象基址了,接下来就是搞掉某P的ValidAccessMask了.
来张图:
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)