САБЖ есть шеллкодес, который внедряется в драйвер На данный момент решение поиска базы у меня кривое Берется функция из импорта и листается вверх страницами до MZ-сигнатуры Но если IAT похучен, или драйвер не импортирует ничего из нтоскрнл, то просходит бсод Помгите, как избавиться от этих зависимостей Хочется универсальный способ, не зависящий от импорта основного драйвера
Код (Text): get_ntoskrnl_base: pushad push eax sidt fword ptr [esp-2] pop esi mov ebx, [esi+4] ; high WORD of EBX = high WORD of interrupt gate offset mov bx, [esi+0] ; low WORD of EBX = low WORD of offset mov ecx, 0FFFh or ebx, ecx inc ecx ; ecx = PAGE_SIZE inc ebx .find_base: sub ebx, ecx mov dx, [ebx] not dx cmp dx, not 'MZ' jne .find_base mov edx, [ebx+3Ch] ; .mz_neptr cmp edx, ecx jae .find_base cmp edx, 40h jb .find_base mov eax, [ebx+edx] neg eax cmp eax, -'PE' jne .find_base mov [esp+10h], ebx popad retn
Код (Text): ULONG GetKernelBase() { SIDT_Content SidtCurr; ULONG Addr; _asm { sidt SidtCurr } Addr = SidtCurr.HighAddress; Addr <<= 16; Addr += SidtCurr.LowAddress; _asm { pushfd pushad mov esi, Addr lodsd cdq lodsd base_loop: dec eax cmp dword ptr [eax], 0x905A4D jnz base_loop mov Addr, eax popad popfd } DbgPrint( "KernelBase = %x", Addr ); return Addr; }
Была идея использовать поиск тага для пула, в котором находится PsLoadedModuleList. Выделяется при старте ядра, таг "MmLd". Необходимый функционал не экспортируется, единственное это использование NtQuerySystemInformation для инфоклассов SystemPoolTagInformation/SystemBigPoolInformation, но на ядре XPSP3 данные инфоклассы не обрабатываются, получает управление ExGetPoolTagInfo(), в нём сразу какаято проверка переменной ядра, изза которой возвращается STATUS_NOT_IMPLEMENTED. Great Ты что думаешь насчёт этого ?
Если не сложно, приведите начало ExGetPoolTagInfo(), с символами, нужно знать имя переменной, которая в начале её юзается.