首页
社区
课程
招聘
[旧帖] [原创]动态获取 Object Type Number 0.00雪花
发表于: 2012-2-8 13:34 1382

[旧帖] [原创]动态获取 Object Type Number 0.00雪花

2012-2-8 13:34
1382
Object Type Number 在是个硬编码,在不同版本的 NT 下不尽相同。

(不知道有何用?google:NtQuerySystemInformation SystemHandleInformation)

翻了不少资料,终于实现了动态获取(直截、高效)。

Win 7 SP1 32位、Win XP SP3 32位下通过测试,跟大家分享一下代码:

//---------------------------------------------------------------------------

DWORD GetWindowsMajorVersion(void)
{
        return GetVersion() & 0xFF;
}

//---------------------------------------------------------------------------

UCHAR GetObjectTypeNumberW(WCHAR *pszObjectTypeNameW)
{
        UCHAR nObjectType = 0;

        ULONG nBufferSize = PAGE_SIZE;

        OBJECT_ALL_TYPES_INFORMATION *poati = (OBJECT_ALL_TYPES_INFORMATION *)malloc(nBufferSize);

        Loop:

        if (poati)
        {
                NTSTATUS status = NtQueryObject(NULL, ObjectAllTypesInformation, poati, nBufferSize, NULL);

                if (!status)
                {
                        OBJECT_TYPE_INFORMATION *poti = &poati->TypeInformation;

                        for (USHORT i = 0; i < poati->NumberOfTypes; i++)
                        {
                                if (!wcscmp(pszObjectTypeNameW, poti->TypeName.Buffer))
                                {
                                        nObjectType = i + 1;

                                        if (GetWindowsMajorVersion() > 5)
                                        {
                                                nObjectType += 1;
                                        }

                                        break;
                                }

                                USHORT n = poti->TypeName.MaximumLength / sizeof (WCHAR);

                                poti = (OBJECT_TYPE_INFORMATION *)(poti->TypeName.Buffer + n + n % 2);
                        }
                }
                else
                {
                        if (status == STATUS_INFO_LENGTH_MISMATCH)
                        {
                                free(poati);

                                nBufferSize *= 2;

                                poati = (OBJECT_ALL_TYPES_INFORMATION *)malloc(nBufferSize);

                                goto Loop;
                        }
                }

                free(poati);
        }

        return nObjectType;
}

//---------------------------------------------------------------------------

UCHAR GetObjectTypeNumberA(char *pszObjectTypeNameA)
{
        UCHAR nObjectType = 0;

        USHORT nObjectTypeNameLength = strlen(pszObjectTypeNameA);

        WCHAR *pszObjectTypeNameW = (WCHAR *)malloc((nObjectTypeNameLength + 1) * sizeof (WCHAR));

        if (pszObjectTypeNameW)
        {
                if (wsprintfW(pszObjectTypeNameW, L"%S", pszObjectTypeNameA) == nObjectTypeNameLength)
                {
                        if (GetObjectTypeNumberW(pszObjectTypeNameW))
                        {
                                nObjectType = (UCHAR)_AL;
                        }
                }

                free(pszObjectTypeNameW);
        }

        return nObjectType;
}

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 248
活跃值: (3789)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
Object地址怎么获取呢?
2012-2-8 14:59
0
雪    币: 6
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
[QUOTE=yy虫子yy;1043291]Object地址怎么获取呢?
[/QUOTE]

NtQuerySystemInformation + SystemHandleInformation,SYSTEM_HANDLE_INFORMATION.Object 就是了
2012-2-8 15:05
0
雪    币: 248
活跃值: (3789)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4

终于弄明白了,非常感谢
2012-2-9 00:19
0
游客
登录 | 注册 方可回帖
返回
//