-
-
[原创]科锐三阶段项目---CreateProcess流程分析之二:ObInsertObject分析报告
-
发表于: 2010-6-7 22:06 10924
-
这个是武汉科锐 第三阶段 的分析项目,每个同学负责不同的模块。在此我将我所分析的模块发出来。
声明:由于本人能力有限,文中必然有错漏之处,恳请读者不吝赐教。
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等于零的话跳走
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
赞赏
- [原创]CrackMe技术等级自测系统 62412
- [原创]Windows启动过程分析-预引导 47199
- [原创]一个灰常简单灰常恶搞的CrackMe! 9422