Сканирую PspCidTable на предмет скрытых процессов. Код (Text): PVOID PspCid = GetPspCidTable(); UINT TableSize,OffProcess; int i,j,k; PHANDLE_TABLE_ENTRY Entry; UINT TableCode = (*(PULONG)PspCid); GetOffsetPspCidTable(&TableSize,&OffProcess); if(TableSize | OffProcess) switch (TableCode & LEVEL_MASK){ case 0 : for (i = 0; i < TableSize; i++){ Entry = &((PHANDLE_TABLE_ENTRY)TableCode)[i]; if (Entry->Object) ProcessObject(ProcList,(PVOID)((ULONG)Entry->Object & ~LOCK_BIT),OffProcess); }break; case 1 : for (i = 0; i < TableSize; i++){ if (((PVOID *)TableCode)[i]){ for (j = 0; j < TableSize; j++){ Entry = &((PHANDLE_TABLE_ENTRY *)TableCode)[i][j]; if (Entry->Object) ProcessObject(ProcList,(PVOID)((ULONG)Entry->Object & ~LOCK_BIT),OffProcess); } } }break; case 2 : for (i = 0; i < TableSize; i++){ if (((PVOID *)TableCode)[i]){ for (j = 0; j < TableSize; j++){ if (((PVOID **)TableCode)[i][j]){ for (k = 0; k < TableSize; k++){ Entry = &((PHANDLE_TABLE_ENTRY **)TableCode)[i][j][k]; if (Entry->Object) ProcessObject(ProcList,(PVOID)((ULONG)Entry->Object & ~LOCK_BIT),OffProcess); } } } } }break; } } void ProcessObject(PLIST List,PVOID Object,UINT OffsetEPROCESSFromETHREAD){ POBJECT_HEADER ObjectHeader; POBJECT_TYPE ObjectType; _OBGETOBJECTTYPE ObGetObjectType; if(*NtBuildNumber >= 7000){ ObGetObjectType = (_OBGETOBJECTTYPE)GetKernelProc(L"ObGetObjectType"); if(ObGetObjectType){ ObjectType = ObGetObjectType(Object); if(ObjectType == *PsProcessType){ CollectProcess(List,Object); }else if(ObjectType == *PsThreadType){ Object = mkptr(PVOID,Object,OffsetEPROCESSFromETHREAD); CollectProcess(List,Object); } } }else{ ObjectHeader = CONTAINING_RECORD((Object), OBJECT_HEADER, Body); if (ObjectHeader->Type == *PsProcessType){ CollectProcess(List,Object); }else if (ObjectHeader->Type == *PsThreadType){ Object = mkptr(PVOID,Object,OffsetEPROCESSFromETHREAD); CollectProcess(List,Object); } } } Код работал на ХР. Попробовал на 7ке, не получилось. Как я понял дизассемблируя ядро: 1)Осталась 3х-уровневая системма, как в ХР 2)Изменились размеры таблиц, вместо линейного размера 0х200 стало 0х1000 3)Исчезло поле type из OBJECT_HEADER, теперь типы храняться в отдельном массиве. Для проверки использовал ObGetObjectType. При этом подходе наблюдаются странности: 1)Entry->Object частенько не 0, но и не валидный указатель а число меньщее 0хfff 2)ObGetObjectType часто возвращает 0 Правильно ли я всё переделал? Где может быть ошибка?
Начнем с того что 2600 и 600х отличаются очень сильно. А 600х и 760х порядочно. OBJECT_HEADER другой, OBJECT_TYPE другой. Все остальное, включая этот код, комментировать нет смысла. В символах ответ.
Код (Text): windows 7 typedef struct _OBJECT_HEADER // 12 elements, 0x20 bytes (sizeof) { /*0x000*/ LONG32 PointerCount; union // 2 elements, 0x4 bytes (sizeof) { /*0x004*/ LONG32 HandleCount; /*0x004*/ VOID* NextToFree; }; /*0x008*/ struct _EX_PUSH_LOCK Lock; // 7 elements, 0x4 bytes (sizeof) /*0x00C*/ UINT8 TypeIndex; /*0x00D*/ UINT8 TraceFlags; /*0x00E*/ UINT8 InfoMask; /*0x00F*/ UINT8 Flags; union // 2 elements, 0x4 bytes (sizeof) { /*0x010*/ struct _OBJECT_CREATE_INFORMATION* ObjectCreateInfo; /*0x010*/ VOID* QuotaBlockCharged; }; /*0x014*/ VOID* SecurityDescriptor; /*0x018*/ struct _QUAD Body; // 2 elements, 0x8 bytes (sizeof) }OBJECT_HEADER, *POBJECT_HEADER; windows vista typedef struct _OBJECT_HEADER // 12 elements, 0x20 bytes (sizeof) { /*0x000*/ LONG32 PointerCount; union // 2 elements, 0x4 bytes (sizeof) { /*0x004*/ LONG32 HandleCount; /*0x004*/ VOID* NextToFree; }; /*0x008*/ struct _OBJECT_TYPE* Type; /*0x00C*/ UINT8 NameInfoOffset; /*0x00D*/ UINT8 HandleInfoOffset; /*0x00E*/ UINT8 QuotaInfoOffset; /*0x00F*/ UINT8 Flags; union // 2 elements, 0x4 bytes (sizeof) { /*0x010*/ struct _OBJECT_CREATE_INFORMATION* ObjectCreateInfo; /*0x010*/ VOID* QuotaBlockCharged; }; /*0x014*/ VOID* SecurityDescriptor; /*0x018*/ struct _QUAD Body; // 2 elements, 0x8 bytes (sizeof) }OBJECT_HEADER, *POBJECT_HEADER; windows xp typedef struct _OBJECT_HEADER // 12 elements, 0x20 bytes (sizeof) { /*0x000*/ LONG32 PointerCount; union // 2 elements, 0x4 bytes (sizeof) { /*0x004*/ LONG32 HandleCount; /*0x004*/ VOID* NextToFree; }; /*0x008*/ struct _OBJECT_TYPE* Type; /*0x00C*/ UINT8 NameInfoOffset; /*0x00D*/ UINT8 HandleInfoOffset; /*0x00E*/ UINT8 QuotaInfoOffset; /*0x00F*/ UINT8 Flags; union // 2 elements, 0x4 bytes (sizeof) { /*0x010*/ struct _OBJECT_CREATE_INFORMATION* ObjectCreateInfo; /*0x010*/ VOID* QuotaBlockCharged; }; /*0x014*/ VOID* SecurityDescriptor; /*0x018*/ struct _QUAD Body; // 1 elements, 0x8 bytes (sizeof) }OBJECT_HEADER, *POBJECT_HEADER; здесь для win XP и win vista структуры одинаковые, то есть тип объекта, для 7ки я использую ObGetObjectType. OBJECT_TYPE экспортируется ядром и используется только для сравнения указателей(определения типа). HANDLE_TABLE_ENTRY везде вообще одинаковый. Меня больше интересует правильно ли я понял алгоритм работы PspCidTable, и где конкретно ошибка в моём коде. Вроде были учтены многие нюансы изменившейся архитектуры. Или если у кого есть то код делающий что-то подобное на Windows 7.
Если всё работает, выложи пожалуйста кусок кода, которым ты проверял работоспособность. Это очень ускорит поиск моей ошибки. Интересуют Vista и Win 7. Я что-то делаю точно не так(потому что не работает), но не могу понять что именно. Может есть какая-нибудь информация по теме?