在Windows中,内核对象由三部分组成,其中第一部分是由数个不确定的结构组成,第二部分就是结构头OBJECT_HEADER,第三部分则是对象体。后两部分容易确定,OBJECT_HEADER后48个字节就是对象体。第一部分则是完全隐藏起来的机制,而且Win7系统中OBJECT_HEADER里也没有了前面几个结构的偏移信息,所以需要具体研究一下这个字段的生成机制。
这个结构肯定是在ObCreateObject中创建的,其中的ObpAllocateObject完成了对象的内存分配和初始化,就从这个函数着手进行分析。
下面是对ObpAllocateObject的逆向,可能有些地方和源程序流程不一样,中间许多流程进行了优化,只能尽量去还原成正确的C代码。
NTSTATUS ObpAllocateObject(POBJECT_CREATE_INFO CreateInfo,
KPROCESSOR_ACCESS OwnerMode,
POBJECT_TYPE ObjectType,
PUNICODE_STRING CapturedName,
DWORD ObjectBodySize,
POBJECT_HEADER* ObjectHeader) {
DWORD InfoMask = 0;
DWORD ObjectTotalSize = 0;
NTSTATUS Status;
PBYTE Object;
PBYTE ObjectFields;
POBJECT_HEADER_CREATOR_INFO CreatorInfo;
POBJECT_HEADER_HANDLE_INFO HandleInfo;
POBJECT_HEADER_QUOTA_INFO QuotaInfo;
POBJECT_HEADER_NAME_INFO NameInfo;
PEPROCESS CurrentProcess = PsGetCurrentProcess();
//前面不知道是干嘛的
if (CreateInfo->Attributes & 0x20) {
ObjectTotalSize += 0x10;
InfoMask |= 0x10;
}
//需要性能技术
if (CurrentProcess != PsInitialSystemProcess) {
if (CurrentProcess != PsIdleProcess)
if (PsInitialSystemProcess != NULL) {
InfoMask |= 8;
ObjectTotalSize += sizeof(OBJECT_HEADER_QUOTA_INFO);
}
}
//需要记录句柄计数信息
if (ObjectType-></