Узнать размер PEB->KernelCallbackTable

Тема в разделе "WASM.BEGINNERS", создана пользователем HoShiMin, 12 янв 2018.

  1. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.422
    Адрес:
    Россия, Нижний Новгород
    Добрый день форумчанам. Есть ли достаточно надёжный способ узнать размер KernelCallbackTable, не используя символы?
    Использую такой код, но в ряде случаев в выдачу попадают неверные данные за пределами таблицы:
    Код (C++):
    1.  
    2. VOID InitializeKernelCallbackTable
    3. {
    4.     PVOID* KernelCallbackTable = (PVOID*)(GetPEB()->KernelCallbackTable);
    5.     if (KernelCallbackTable == NULL) return FALSE;
    6.  
    7. #define MASK64 (SIZE_T)0xFFFFFFFF00000000LL
    8. #define MASK32 (SIZE_T)0xFF000000LL
    9.     SIZE_T Mask = ((SIZE_T)*KernelCallbackTable) & MASK64 ? MASK64 : MASK32;
    10.     SIZE_T Signature = ((SIZE_T)(*KernelCallbackTable) & Mask);
    11. #undef MASK64
    12. #undef MASK32
    13.  
    14.     for (int i = 0; (((SIZE_T)KernelCallbackTable[i]) & Mask) == Signature; i++)
    15.         KernelCallbacks.emplace_back(KernelCallbackTable[i]);
    16.  
    17.     std::sort(KernelCallbacks.begin(), KernelCallbacks.end());
    18. }
    19.  
    Маски нужны, чтобы закончить перебор на элементах, которые уже не относятся к таблице.
    Пример:
    0x7FFCA000
    0x7FFCA001
    ...
    0x7FFCA00F
    0x00000137 // Абстрактное число, не относящееся к таблице, но ненулевое
    0x00000000
    0x00000000

    Адреса в таблице не обязаны быть около верхней границы юзермода. В VMware адреса лежат в младшей половине диапазона, поэтому проверять масками - не лучшая идея.
    Как вариант - сравнивать дельту между двумя соседними отсортированными адресами, но что брать за максимально допустимую дельту?
     
    Последнее редактирование: 12 янв 2018
  2. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.422
    Адрес:
    Россия, Нижний Новгород
    Только сейчас подумал, что лучший способ - проверять каждый адрес на принадлежность user32.dll/win32u.dll
     
  3. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    HoShiMin,

    Для указателя имеется релок, он и показывает что какие то данные являются указателем(x86, не RIP).
     
  4. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    Indy_, мдэ указатели на табл, с релоками, какого х вообще не связаны.......в х64 - иди матчасть поучи А лучше комп купи ;)
     
  5. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    RET,

    Не пишите чушь. На 86 есть релоки. На 64 адресация данного массива не RIP. Релок либо есть, либо его нет по той простой причине, что данная либа не релокабельна.
     
  6. Fail

    Fail Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2012
    Сообщения:
    503