总结一下由对象名得到对象地址的方法

来源:互联网 发布:网络危机公关处理案例 编辑:程序博客网 时间:2024/05/29 04:33

 总结一下由对象名得到对象地址的方法
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
这种方法很容易,也没什么限制,是推荐使用的

原创粉丝点击