BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / security / #5100同步于 2006/11/25
Security机器人发帖

[原创]总结一下由对象名得到对象地址的方法

flyingkisser
2006/11/25镜像同步0 回复
欢迎大家补充: ----------------------- 总结一下由对象名得到对象地址的方法 by flyingkisser 06.11.26 Dedicated to my mm,it's been 3 years,thanks 方法一、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 这种方法很容易,也没什么限制,是推荐使用的
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。