首页
社区
课程
招聘
[原创]科锐三阶段项目---CreateProcess流程分析之二:ObInsertObject分析报告
发表于: 2010-6-7 22:06 10925

[原创]科锐三阶段项目---CreateProcess流程分析之二:ObInsertObject分析报告

2010-6-7 22:06
10925

这个是武汉科锐 第三阶段 的分析项目,每个同学负责不同的模块。在此我将我所分析的模块发出来。

声明:由于本人能力有限,文中必然有错漏之处,恳请读者不吝赐教。

        ObInsertObject它的作用是将所创建的对象插入对象目录和本进程句柄表(或内核句柄表),并返回句柄。插入对象目录的目的是使得以后可以按对象名及期路径找到对象,而句柄表的插入则使当前进程在创建之余同时打开了这个对象。
我们先来了解一下ObInsertObject的大概流程:
        首先是一些常规检查,如果对象名没有指定的话,创建一个无名对象句柄,同时将ObpCreateUnnamedHandle的返回值返回。
        然后再判断一个访问状态(AccessState)是否为空,如果为空的话就调用SeCreateAccessState创建一个,如果创建出错了,返回错误码。
        接着再判断对象名是否为空,如果不为空的话,调用ObpLookupObjectName查找一下目录下面是否有同名的存在, 如果就通过指针返回对象,否则就返回STATUS_OBJECT_NAME_NOT_FOUND,如果没有找到就把这个对象挂入给定的目录,并通过指针返回这个对象的指针。
        接着再判断是不是要创建符号连接,是的话通过ObpCreateSymbolicLinkName创建。
        下面再判断是不是成功插入对象目录,再根据所在目录修正目标对象的访问控制描述。
        最后就是句柄表中创建一个新的句柄。

        现在我们开始分析ObInsertObject函数。
        首先函数完成对一些局部变量的赋值,比如取得ObjectType等操作。
        接着先判断一下是不是要创建无名对象句柄。

cmp     [ecx+OBJECT_TYPE.TypeInfo.SecurityRequired], 0
jnz     loc_527F99
cmp     [ebp+var_ObjectName], eax ; 判断一下对象名有没有指定
jnz     loc_527F99
mov     eax, [edi+_OBJECT_HEADER_NAME_INFO.Directory]
cmp     eax, ebx
cmp     [ebp+arg_AccessState], eax ; eax为零值,前面进行了xor eax,eax
jnz     short NoCreateAccessState
lea     eax, [ebp+var_LocalAccessState]
mov     [ebp+arg_AccessState], eax
mov     eax, [ebp+var_ObjectType]
add     eax, 68h ; 'h'  ; 这里做个加法就指到GenericMapping
push    eax
push    [ebp+arg_DesiredAccess] ;
lea     eax, [ebp+var_AuxData]
push    eax
lea     eax, [ebp+var_LocalAccessState]
push    eax
call    SeCreateAccessState ; 创建一个访问状态
mov     eax, [ebp+arg_AccessState]
mov     ecx, [esi+_OBJECT_CREATE_INFORMATION.SecurityDescriptor]
push    eax
mov     [eax+ACCESS_STATE.SecurityDescriptor], ecx
call    ObpValidateAccessMask ;无论怎么样,他都返回STATUS_SUCCESS
lea     eax, [ebp+var_InsertObject]
push    eax             ; int
lea     eax, [ebp+var_34] ; _OBP_LOOKUP_CONTEXT类型的变量的首地址
push    eax 
push    [ebp+arg_AccessState]
xor     eax, eax
mov     al, [ebx+0Fh]
push    ecx             ; int
push    [esi+_OBJECT_CREATE_INFORMATION.SecurityQos] ; int
shr     al, 1
push    [esi+_OBJECT_CREATE_INFORMATION.ParseContext] ; int
not     al
and     eax, 0FFFFFF01h
push    eax             ; AccessMode
push    [ebp+var_ObjectType] 
push    [esi+_OBJECT_CREATE_INFORMATION.Attributes] 
push    [ebp+var_ObjectName]
push    [esi+_OBJECT_CREATE_INFORMATION.RootDirectory] 
call    ObpLookupObjectNam
test    eax, eax        ; 判断函数是否执行成功
mov     [ebp+Status], eax
jl      loc_5281BD
mov     ecx, [ebp+var_InsertObject]
test    ecx, ecx        ; 判断var_InsertObject是否为零
jz      loc_5281B3
cmp     ecx, [ebp+arg_Object] ; 判断var_InsertObject是不是等于Object
                        ; 如果相等的话,说明已经把Object插进对象目录
                        ; 否则的话说明在里面找到同名的
mov     eax, [ebp+var_InsertObject]
cmp     eax, [ebp+arg_Object] ; 
jz      loc_5282D4      ; 如果相等,说明将我们的对象插入到对象目录中去了
test    edi, edi        ; 先判断ObjectName是否为空
jz      short loc_5282EE
mov     eax, [edi+_OBJECT_HEADER_NAME_INFO.Directory]
test    eax, eax
jz      short loc_5282EE
cmp     [ebp+arg_Handle], 0
mov     [ebp+var_ReturnStatus], eax
jz      HandleIsZero    ; 如果arg_Handle等于零的话跳走

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

上传的附件:
收藏
免费 7
支持
分享
最新回复 (2)
雪    币: 168
活跃值: (152)
能力值: ( LV11,RANK:180 )
在线值:
发帖
回帖
粉丝
2
哈哈,又是我的沙发~~~~
2010-6-7 22:31
0
雪    币: 15
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
继续学习ing!
2010-6-16 11:16
0
游客
登录 | 注册 方可回帖
返回
//