首页
社区
课程
招聘
[转帖]总结一下由对象名得到对象地址的方法
发表于: 2013-8-1 09:57 7780

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

2013-8-1 09:57
7780
来源: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了.


来张图:

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 6400
活跃值: (4160)
能力值: ( LV10,RANK:163 )
在线值:
发帖
回帖
粉丝
2
亮了,易语言..........
2013-8-1 10:08
0
雪    币: 117
活跃值: (1557)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
支持下....菜鸟飘过!
2013-8-1 11:55
0
雪    币: 27
活跃值: (90)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
4
最后的图很刺眼..
2013-8-1 15:02
0
雪    币: 167
活跃值: (120)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
5
TP有全局变量存debugobjecttype 改那里不知道没有crc  我是不安心。。。
如果知道TP是怎么获取objecttype就好办了  
然后看到此贴  那就是说TP也是靠obxxxxbyhandle获取的咯?
最后既然都要靠obxxxxbyhandle
不如HOOK他 判断  tessafe  是就让他去得到我们伪造的objecttype  
哈哈哈 如果是这样
Psprocesstype也能!!!清零也就过了
纯属扯淡  还在撸ing  支持下楼主用易语言  支持易语言!!!虽然我不用。。。
2013-8-1 15:33
0
雪    币: 2506
活跃值: (2323)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
6
你这名字,用易语言的应该都知道这个名字。
2013-8-1 15:42
0
雪    币: 118
活跃值: (27)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
纯粹取obj地址不需要这么麻烦..
NtDebugActiveProcess内部就有

E易语言写驱动实在霸气……
话说楼主是 shengxuexiong?
2013-8-1 20:33
0
雪    币: 371
活跃值: (72)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8
BINGO~
2013-8-1 21:35
0
雪    币: 371
活跃值: (72)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
9
你就是羊羊吧~
非常感谢,NtDebugActiveProcess里面的确有个很重要的全局变量.
2013-8-1 23:53
0
游客
登录 | 注册 方可回帖
返回
//