Perdón por la tardanza, hace un par de dias que no me conecto al foro por falta de tiempo...
Bien, para localizar la dirección base del Kernel puedes obtenerla a partir de esta API:
ZwQuerySystemInformation. Lo que tienes que hacer es listar los modulos cargados y el primero de todos es la dirección del Kernel.
Aquí te paso un link donde se obtiene la dirección Base del Kernel y te lo comentaré un poco:
http://www.rohitab.com/discuss/index.php?showtopic=24567&s=f3bcdcdac0ad87467955cde031d3ed20//List loaded modules (we only need the first one, which is the kernel)
PMODULE_LIST GetModuleList(){
NTSTATUS NtStatus;
ULONG ulNeededSize;
PULONG pulModuleList;
ZwQuerySystemInformation(SystemModuleInformation, &ulNeededSize, 0, &ulNeededSize);
pulModuleList = ExAllocatePoolWithTag(PagedPool, ulNeededSize, 'mlst');
NtStatus = ZwQuerySystemInformation(SystemModuleInformation, pulModuleList, ulNeededSize, 0);
if(!NT_SUCCESS(NtStatus)){
DbgPrint("ZwQuerySystemInformation failed! ulNeededSize = %ul, NtStatus = %u.\n", ulNeededSize, NtStatus);
}
return (PMODULE_LIST) pulModuleList;
}
Aqui te lo dice, lista los modulos, y como solamente queremos la dirección base del Kernel, solamente extraemos la primera.
pModules = GetModuleList();
if(pModules != NULL){
pKernelInfo = &pModules->Modules[0];
ulKernelBase = pKernelInfo->dwBase;
ulKernelEnd = pKernelInfo->dwBase + pKernelInfo->dwSize;
}
Como ves, aquí guarda la dirección base del Inicio y su dirección final (Dirección Base + Tamaño).
Como comentario, si una funión de la SSDT esta fuera de este rango, significa que esta Hookeada, y si extraes todos los drivers cargados y guardas su dirección inicial y final, puedes saber que driver esta hookeando la API (Ya que la dirección de la función hookeada estara entre la dirección inicial de dicho driver y su dirección fianl).
Un Saludo
