Добрый день форумчанам. Есть ли достаточно надёжный способ узнать размер KernelCallbackTable, не используя символы? Использую такой код, но в ряде случаев в выдачу попадают неверные данные за пределами таблицы: Code (C++): VOID InitializeKernelCallbackTable { PVOID* KernelCallbackTable = (PVOID*)(GetPEB()->KernelCallbackTable); if (KernelCallbackTable == NULL) return FALSE; #define MASK64 (SIZE_T)0xFFFFFFFF00000000LL #define MASK32 (SIZE_T)0xFF000000LL SIZE_T Mask = ((SIZE_T)*KernelCallbackTable) & MASK64 ? MASK64 : MASK32; SIZE_T Signature = ((SIZE_T)(*KernelCallbackTable) & Mask); #undef MASK64 #undef MASK32 for (int i = 0; (((SIZE_T)KernelCallbackTable[i]) & Mask) == Signature; i++) KernelCallbacks.emplace_back(KernelCallbackTable[i]); std::sort(KernelCallbacks.begin(), KernelCallbacks.end()); } Маски нужны, чтобы закончить перебор на элементах, которые уже не относятся к таблице. Пример: 0x7FFCA000 0x7FFCA001 ... 0x7FFCA00F 0x00000137 // Абстрактное число, не относящееся к таблице, но ненулевое 0x00000000 0x00000000 Адреса в таблице не обязаны быть около верхней границы юзермода. В VMware адреса лежат в младшей половине диапазона, поэтому проверять масками - не лучшая идея. Как вариант - сравнивать дельту между двумя соседними отсортированными адресами, но что брать за максимально допустимую дельту?
Только сейчас подумал, что лучший способ - проверять каждый адрес на принадлежность user32.dll/win32u.dll
HoShiMin, Для указателя имеется релок, он и показывает что какие то данные являются указателем(x86, не RIP).
Indy_, мдэ указатели на табл, с релоками, какого х вообще не связаны.......в х64 - иди матчасть поучи А лучше комп купи
RET, Не пишите чушь. На 86 есть релоки. На 64 адресация данного массива не RIP. Релок либо есть, либо его нет по той простой причине, что данная либа не релокабельна.