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

Discussion in 'WASM.BEGINNERS' started by HoShiMin, Jan 12, 2018.

  1. HoShiMin

    HoShiMin Well-Known Member

    Blog Posts:
    5
    Joined:
    Dec 17, 2016
    Messages:
    1,486
    Location:
    Россия, Нижний Новгород
    Добрый день форумчанам. Есть ли достаточно надёжный способ узнать размер KernelCallbackTable, не используя символы?
    Использую такой код, но в ряде случаев в выдачу попадают неверные данные за пределами таблицы:
    Code (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 адреса лежат в младшей половине диапазона, поэтому проверять масками - не лучшая идея.
    Как вариант - сравнивать дельту между двумя соседними отсортированными адресами, но что брать за максимально допустимую дельту?
     
    Last edited: Jan 12, 2018
  2. HoShiMin

    HoShiMin Well-Known Member

    Blog Posts:
    5
    Joined:
    Dec 17, 2016
    Messages:
    1,486
    Location:
    Россия, Нижний Новгород
    Только сейчас подумал, что лучший способ - проверять каждый адрес на принадлежность user32.dll/win32u.dll
     
  3. Indy_

    Indy_ Well-Known Member

    Blog Posts:
    4
    Joined:
    Apr 29, 2011
    Messages:
    4,788
    HoShiMin,

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

    RET Well-Known Member

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

    Indy_ Well-Known Member

    Blog Posts:
    4
    Joined:
    Apr 29, 2011
    Messages:
    4,788
    RET,

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

    Fail Active Member

    Blog Posts:
    0
    Joined:
    Mar 14, 2012
    Messages:
    503