PspCidTable Windows7

Тема в разделе "WASM.NT.KERNEL", создана пользователем haxorart, 14 фев 2011.

  1. haxorart

    haxorart New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    123
    Сканирую PspCidTable на предмет скрытых процессов.
    Код (Text):
    1. PVOID PspCid = GetPspCidTable();
    2.     UINT TableSize,OffProcess;
    3.     int i,j,k;
    4.     PHANDLE_TABLE_ENTRY Entry;
    5.     UINT TableCode =  (*(PULONG)PspCid);
    6.    
    7.    
    8.     GetOffsetPspCidTable(&TableSize,&OffProcess);
    9.     if(TableSize | OffProcess)
    10.    
    11.         switch (TableCode & LEVEL_MASK){
    12.             case 0 :
    13.                 for (i = 0; i < TableSize; i++){
    14.                     Entry = &((PHANDLE_TABLE_ENTRY)TableCode)[i];
    15.                     if (Entry->Object)
    16.                         ProcessObject(ProcList,(PVOID)((ULONG)Entry->Object & ~LOCK_BIT),OffProcess);
    17.              }break;
    18.             case 1 :
    19.                 for (i = 0; i < TableSize; i++){
    20.                     if (((PVOID *)TableCode)[i]){
    21.                         for (j = 0; j < TableSize; j++){
    22.                             Entry = &((PHANDLE_TABLE_ENTRY *)TableCode)[i][j];
    23.                             if (Entry->Object)
    24.                                 ProcessObject(ProcList,(PVOID)((ULONG)Entry->Object & ~LOCK_BIT),OffProcess);
    25.                         }
    26.                   }
    27.              }break;
    28.             case 2 :
    29.                 for (i = 0; i < TableSize; i++){
    30.                     if (((PVOID *)TableCode)[i]){
    31.                         for (j = 0; j < TableSize; j++){
    32.                             if (((PVOID **)TableCode)[i][j]){
    33.                                 for (k = 0; k < TableSize; k++){
    34.                                     Entry = &((PHANDLE_TABLE_ENTRY **)TableCode)[i][j][k];
    35.                                     if (Entry->Object)
    36.                                         ProcessObject(ProcList,(PVOID)((ULONG)Entry->Object & ~LOCK_BIT),OffProcess);
    37.                                 }
    38.                             }
    39.                         }
    40.                     }
    41.               }break;
    42.         }
    43.    
    44. }
    45.  
    46.  
    47. void ProcessObject(PLIST List,PVOID Object,UINT OffsetEPROCESSFromETHREAD){
    48.     POBJECT_HEADER ObjectHeader;
    49.     POBJECT_TYPE ObjectType;
    50.     _OBGETOBJECTTYPE ObGetObjectType;
    51.     if(*NtBuildNumber >= 7000){
    52.         ObGetObjectType = (_OBGETOBJECTTYPE)GetKernelProc(L"ObGetObjectType");
    53.         if(ObGetObjectType){
    54.             ObjectType = ObGetObjectType(Object);
    55.             if(ObjectType == *PsProcessType){
    56.                 CollectProcess(List,Object);
    57.             }else
    58.             if(ObjectType == *PsThreadType){
    59.                 Object = mkptr(PVOID,Object,OffsetEPROCESSFromETHREAD);
    60.                 CollectProcess(List,Object);
    61.             }
    62.         }
    63.     }else{
    64.         ObjectHeader = CONTAINING_RECORD((Object), OBJECT_HEADER, Body);
    65.         if (ObjectHeader->Type == *PsProcessType){
    66.             CollectProcess(List,Object);
    67.         }else
    68.         if (ObjectHeader->Type == *PsThreadType){
    69.             Object = mkptr(PVOID,Object,OffsetEPROCESSFromETHREAD);
    70.             CollectProcess(List,Object);
    71.         }
    72.     }
    73. }
    Код работал на ХР. Попробовал на 7ке, не получилось. Как я понял дизассемблируя ядро:
    1)Осталась 3х-уровневая системма, как в ХР
    2)Изменились размеры таблиц, вместо линейного размера 0х200 стало 0х1000
    3)Исчезло поле type из OBJECT_HEADER, теперь типы храняться в отдельном массиве. Для проверки использовал ObGetObjectType.

    При этом подходе наблюдаются странности:
    1)Entry->Object частенько не 0, но и не валидный указатель а число меньщее 0хfff
    2)ObGetObjectType часто возвращает 0

    Правильно ли я всё переделал? Где может быть ошибка?
     
  2. EP_X0FF

    EP_X0FF New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2006
    Сообщения:
    450
    Начнем с того что 2600 и 600х отличаются очень сильно.
    А 600х и 760х порядочно.

    OBJECT_HEADER другой, OBJECT_TYPE другой. Все остальное, включая этот код, комментировать нет смысла.
    В символах ответ.
     
  3. haxorart

    haxorart New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    123
    Код (Text):
    1. windows 7
    2.  
    3.  typedef struct _OBJECT_HEADER                                // 12 elements, 0x20 bytes (sizeof)
    4.           {
    5. /*0x000*/     LONG32       PointerCount;
    6.               union                                                    // 2 elements, 0x4 bytes (sizeof)
    7.               {
    8. /*0x004*/         LONG32       HandleCount;
    9. /*0x004*/         VOID*        NextToFree;
    10.               };
    11. /*0x008*/     struct _EX_PUSH_LOCK Lock;                               // 7 elements, 0x4 bytes (sizeof)
    12. /*0x00C*/     UINT8        TypeIndex;
    13. /*0x00D*/     UINT8        TraceFlags;
    14. /*0x00E*/     UINT8        InfoMask;
    15. /*0x00F*/     UINT8        Flags;
    16.               union                                                    // 2 elements, 0x4 bytes (sizeof)
    17.               {
    18. /*0x010*/         struct _OBJECT_CREATE_INFORMATION* ObjectCreateInfo;
    19. /*0x010*/         VOID*        QuotaBlockCharged;
    20.               };
    21. /*0x014*/     VOID*        SecurityDescriptor;
    22. /*0x018*/     struct _QUAD Body;                                       // 2 elements, 0x8 bytes (sizeof)
    23.           }OBJECT_HEADER, *POBJECT_HEADER;
    24.  
    25. windows vista
    26.  
    27.   typedef struct _OBJECT_HEADER                                // 12 elements, 0x20 bytes (sizeof)
    28.           {
    29. /*0x000*/     LONG32       PointerCount;
    30.               union                                                    // 2 elements, 0x4 bytes (sizeof)
    31.               {
    32. /*0x004*/         LONG32       HandleCount;
    33. /*0x004*/         VOID*        NextToFree;
    34.               };
    35. /*0x008*/     struct _OBJECT_TYPE* Type;
    36. /*0x00C*/     UINT8        NameInfoOffset;
    37. /*0x00D*/     UINT8        HandleInfoOffset;
    38. /*0x00E*/     UINT8        QuotaInfoOffset;
    39. /*0x00F*/     UINT8        Flags;
    40.               union                                                    // 2 elements, 0x4 bytes (sizeof)
    41.               {
    42. /*0x010*/         struct _OBJECT_CREATE_INFORMATION* ObjectCreateInfo;
    43. /*0x010*/         VOID*        QuotaBlockCharged;
    44.               };
    45. /*0x014*/     VOID*        SecurityDescriptor;
    46. /*0x018*/     struct _QUAD Body;                                       // 2 elements, 0x8 bytes (sizeof)
    47.           }OBJECT_HEADER, *POBJECT_HEADER;
    48.  
    49. windows xp
    50.  
    51.    typedef struct _OBJECT_HEADER                                // 12 elements, 0x20 bytes (sizeof)
    52.           {
    53. /*0x000*/     LONG32       PointerCount;
    54.               union                                                    // 2 elements, 0x4 bytes (sizeof)
    55.               {
    56. /*0x004*/         LONG32       HandleCount;
    57. /*0x004*/         VOID*        NextToFree;
    58.               };
    59. /*0x008*/     struct _OBJECT_TYPE* Type;
    60. /*0x00C*/     UINT8        NameInfoOffset;
    61. /*0x00D*/     UINT8        HandleInfoOffset;
    62. /*0x00E*/     UINT8        QuotaInfoOffset;
    63. /*0x00F*/     UINT8        Flags;
    64.               union                                                    // 2 elements, 0x4 bytes (sizeof)
    65.               {
    66. /*0x010*/         struct _OBJECT_CREATE_INFORMATION* ObjectCreateInfo;
    67. /*0x010*/         VOID*        QuotaBlockCharged;
    68.               };
    69. /*0x014*/     VOID*        SecurityDescriptor;
    70. /*0x018*/     struct _QUAD Body;                                       // 1 elements, 0x8 bytes (sizeof)
    71.           }OBJECT_HEADER, *POBJECT_HEADER;
    здесь для win XP и win vista структуры одинаковые, то есть тип объекта, для 7ки я использую ObGetObjectType. OBJECT_TYPE экспортируется ядром и используется только для сравнения указателей(определения типа). HANDLE_TABLE_ENTRY везде вообще одинаковый. Меня больше интересует правильно ли я понял алгоритм работы PspCidTable, и где конкретно ошибка в моём коде. Вроде были учтены многие нюансы изменившейся архитектуры. Или если у кого есть то код делающий что-то подобное на Windows 7.
     
  4. reader323

    reader323 New Member

    Публикаций:
    0
    Регистрация:
    8 июл 2009
    Сообщения:
    134
    Нету там никакой разницы. Правь свой глючный код, все работает.
     
  5. haxorart

    haxorart New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    123
    Если всё работает, выложи пожалуйста кусок кода, которым ты проверял работоспособность. Это очень ускорит поиск моей ошибки. Интересуют Vista и Win 7.

    Я что-то делаю точно не так(потому что не работает), но не могу понять что именно. Может есть какая-нибудь информация по теме?
     
  6. haxorart

    haxorart New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    123
    Всем спасибо. Проблема была решена.