Я пишу программу, в которой перечислены открытые дескрипторы файлов. Я получаю слишком много результатов. В моем списке есть такие материалы, как вирусы. Я получаю связку с типом объекта 43, который не похож на то, что я хочу. Есть ли список этих значений в любом месте?Есть ли список возможных значений для SYSTEM_HANDLE_ENTRY.ObjectType?
ответ
Вы можете позвонить по телефону NtQueryObject
с указанием ObjectTypesInformation
информации класс. Это дает вам информацию обо всех типах объектов, зарегистрированных на данный момент в системе. Используйте SYSTEM_HANDLE_ENTRY.ObjectType
в качестве индекса в возвращаемом массиве, чтобы получить информацию о соответствующем типе объекта. В качестве альтернативы вы можете использовать NtQueryObject
с ObjectTypeInformation
для получения информации о типе данного объекта (заданного его дескриптором).
Этот код должен извлекать информацию обо всех объектах типа.
typedef enum _OBJECT_INFORMATION_CLASS {
ObjectBasicInformation,
ObjectNameInformation,
ObjectTypeInformation,
ObjectTypesInformation,
ObjectHandleFlagInformation,
ObjectSessionInformation,
} OBJECT_INFORMATION_CLASS;
typedef struct _OBJECT_TYPE_INFORMATION {
UNICODE_STRING TypeName;
ULONG TotalNumberOfObjects;
ULONG TotalNumberOfHandles;
ULONG TotalPagedPoolUsage;
ULONG TotalNonPagedPoolUsage;
ULONG TotalNamePoolUsage;
ULONG TotalHandleTableUsage;
ULONG HighWaterNumberOfObjects;
ULONG HighWaterNumberOfHandles;
ULONG HighWaterPagedPoolUsage;
ULONG HighWaterNonPagedPoolUsage;
ULONG HighWaterNamePoolUsage;
ULONG HighWaterHandleTableUsage;
ULONG InvalidAttributes;
GENERIC_MAPPING GenericMapping;
ULONG ValidAccessMask;
BOOLEAN SecurityRequired;
BOOLEAN MaintainHandleCount;
ULONG PoolType;
ULONG DefaultPagedPoolCharge;
ULONG DefaultNonPagedPoolCharge;
} OBJECT_TYPE_INFORMATION, *POBJECT_TYPE_INFORMATION;
typedef struct _OBJECT_TYPES_INFORMATION {
LONG NumberOfTypes;
// OBJECT_TYPE_INFORMATION TypeInformation [1];
} OBJECT_TYPES_INFORMATION, *POBJECT_TYPES_INFORMATION;
NTSTATUS QueryObjectTypesInfo(POBJECT_TYPES_INFORMATION *TypesInfo)
{
ULONG StartBufferLength = 28;
ULONG BufferLength = 0;
NTSTATUS status = 0xC0000001;
status = STATUS_SUCCESS;
*TypesInfo = (POBJECT_TYPES_INFORMATION)malloc(StartBufferLength);
if (*TypesInfo != NULL) {
status = NtQueryObject(NULL, ObjectTypesInformation, TypesInfo, StartBufferLength, &BufferLength);
if (status == STATUS_INFO_LENGTH_MISMATCH) {
*TypesInfo = NULL;
while (status == STATUS_INFO_LENGTH_MISMATCH) {
if (*TypesInfo != NULL)
free(*TypesInfo);
*TypesInfo = (POBJECT_TYPES_INFORMATION)malloc(BufferLength);
if (*TypesInfo != NULL)
status = NtQueryObject(NULL, ObjectTypesInformation, *TypesInfo, BufferLength, &BufferLength);
else status = STATUS_INSUFFICIENT_RESOURCES;
}
if (!NT_SUCCESS(status)) {
if (*TypesInfo != NULL) {
free(*TypesInfo);
*TypesInfo = NULL;
}
}
}
} else status = STATUS_INSUFFICIENT_RESOURCES;
return status;
}
Как указано в комментариях, этот материал совершенно недокументирован. Однако приведенный выше код (с небольшими изменениями), например, вам нужно получить адрес подпрограммы NtQueryObject
и определить некоторые NTSTATUS
участников) работает для меня на 64-битной Windows 8.1.
Для полного кода (что довольно старый и прокомментированы в Чехии), загрузите этот проект с моего сайта (Чехия): https://jadro-windows.cz/download/ntqueryobject.zip
Используйте qo.exe --list-types
команду для получения информации о типе
Они не документированы по MSFT. Ваши варианты - вызывать Nt/ZwQueryObject() для информации о типе или доверять предположениям кого-то еще о перечислении - например. посмотрите исходный код проекта Process Hacker. –