- 24
- 0
- 约3.25万字
- 约 26页
- 2017-03-04 发布于四川
- 举报
ObCreateObject函数分析报告
ObCreateObject 函数分析报告函数分析报告
函数分析报告函数分析报告
ObCreateObject 它的作用是创建指定类型(OBJECT_TYPE) 的对象示例。
堆是系统数据动态申请及释放的地方,WinNT 把堆叫做pool 。根据是否可以换出,
分为PagedPool 和NonPagedPool 。
如果系统频繁的申请和释放内存,开销很大.于是WinNT 利用 LookasideList 做缓
冲, 内存释放时并不是直接到pool,而是放到 LookasideList 中,等申请内存时,先检查表
中是否有合适大小的快,若有就直接使用.系统定时检查表项的数目, 以保持 pool 有足
够的可用内存。
可以将Lookaside 对象想像成一个内存容器。在初始的时候,它先向Windows 申
请了一块比较大的内存。以后程序员每次申请内存的时候,不是直接向 Windows 申
请内存,而是向Lookaside 对象申请内存。Lookaside 对象会智能地避免产生内存“空
洞”。如果Lookaside 对象内部的内存不够用时,它会向操作系统申请更多的内存。当
Lookaside 对象内部有大量的末使用的内存时,它会自动让Windows 回收一部分内存。
总之,Lookaside 是一个自动的内存分配容器,通过对Lookaside 对象申请内存,效率
要高于直接向Windows 申请内存。
看实现代码之前我先大概的描述一下这个函数的工作流程吧!
ObCreateObject 内部通过调用 ObpAllocateObject 为对象申请空间。在调用
ObpAllocateObject 调用之前 ObCreateObject 函数做一些相关信息的收集以及判断,
ObpAllocateObject 函数返回通过参数返回其起始地址(即Header-Body),同时函数
里面还做一些对象本身的初始化工作,申请成功后,如果要求对象成为“永久对象”,
即具有OB_FLAG_PERMANENT_OBJECT 标志的话,再检查是否为系统的安全机制
所允许,如果不允话的话,还要把刚刚申请的空间释放掉,同时返回一个错误代码
STATUS_PRIVILEGE_NOT_HELD。
第 1 页 (共 26 页)
ObCreateObject 函数分析报告函数分析报告
函数分析报告函数分析报告
整个函数就是完成一个目标对象的创建工作。
下面先来看ObCreateObject 函数
这个函数有9 个参数,但是有一个没有使用,所以IDA 里面没有标识出来。参数
如下:
ProbeMode = byte ptr 8
ObjectType = dword ptr 0Ch
ObjectAttributes= dword ptr 10h
ObjectHeader = byte ptr 14h
ObjectBodySize = dword ptr 1Ch
PagedPoolCharge = dword ptr 20h
NonPagedPoolCharge= dword ptr 24h
arg_Object = dword ptr 28h
可能有些人在想,你是如何知道他有几个参数的,第一,看参数调用之前压了多
少个参数,然后看里面都用了哪些,还有注意看下有没有通过寄存器传参,最后再看
函数结束的堆栈平衡了多少个参数。
凡是创建对像的系统调用,都要提供至少二个输入参数。其中这定是
DesiredAccess ,说明所创建对象的访问模式,例如只读等。另一个是ObjectAttributes,
这是一个OBJECT_ATTRIBUTES 结构指针,OBJECT_ATTRIBUTES 是一个很重要的
数据结构。
0:000 dt _OBJECT_ATTRIBUTES
ntdll!_OBJECT_ATTRIBUTES
+0x
原创力文档

文档评论(0)