Windows 10 Technical Preview Build 10074 came with a surprise. A bit of history - Windows 7 introduced a new way for retrieving an object type by object address, the object type pointer Type in OBJECT_HEADER was replaced with the TypeIndex which is an index in ObTypeIndexTable, this saved 3 ( 32 bit) or 7 (on 64 bit) bytes compared to a pointer. Windows 10 Build 10074 added a new feature, the TypeIndex value is not an index but a result of a binary operation between an index in ObTypeIndexTable, the second lowest byte of the object address and a value from ObHeaderCookie. The actual reason of this is not yet clear for me but it looks like an attempt to reduce an inter CPU cache coherency traffic by spreading the ObTypeIndexTable to contain copies of the object types and multiplexing access based on the object address. The exported ObGetObjectType function can be used to retrieve an object type address. Lets take a look on ObGetObjectType.
nt!ObGetObjectType:
lea rax,[rcx-30h]
movzx ecx,byte ptr [rcx-18h]
shr rax,8
movzx eax,al
xor rax,rcx
movzx ecx,byte ptr [nt!ObHeaderCookie (fffff802`eae3d42c)]
xor rax,rcx
lea rcx,[nt!ObTypeIndexTable (fffff802`eae3d8e0)]
mov rax,qword ptr [rcx+rax*8]
ret
which can be written in C as ( where XOR(a,b) is a^b )
POBJECT_TYPE
ObGetObjectType( __in PVOID Object )
{
POBJECT_HEADER Header = GET_OBJECT_HEADER( Object );
UCHAR Index = XOR( Header->TypeIndex, (UCHAR)(Header>>8) );
UCHAR Cookie= *(PUCHAR)ObHeaderCookie;
return ObTypeIndexTable[ XOR(Index, Cookie) ];
}
nt!ObGetObjectType:
lea rax,[rcx-30h]
movzx ecx,byte ptr [rcx-18h]
shr rax,8
movzx eax,al
xor rax,rcx
movzx ecx,byte ptr [nt!ObHeaderCookie (fffff802`eae3d42c)]
xor rax,rcx
lea rcx,[nt!ObTypeIndexTable (fffff802`eae3d8e0)]
mov rax,qword ptr [rcx+rax*8]
ret
which can be written in C as ( where XOR(a,b) is a^b )
POBJECT_TYPE
ObGetObjectType( __in PVOID Object )
{
POBJECT_HEADER Header = GET_OBJECT_HEADER( Object );
UCHAR Index = XOR( Header->TypeIndex, (UCHAR)(Header>>8) );
UCHAR Cookie= *(PUCHAR)ObHeaderCookie;
return ObTypeIndexTable[ XOR(Index, Cookie) ];
}
No comments:
Post a Comment