elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
14 Febrero 2012, 07:00  


+  Foro de elhacker.net
|-+  Seguridad Informática
| |-+  Análisis y Diseño de Malware (Moderadores: Karcrack, [Zero])
| | |-+  dirección KernelBase desde un driver
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: dirección KernelBase desde un driver  (Leído 2,252 veces)
escabe

Desconectado Desconectado

Mensajes: 34



Ver Perfil
dirección KernelBase desde un driver
« en: 19 Noviembre 2009, 19:57 »

Trato de encontar una manera fiable para localizar la dirección base del Kernel desde un driver y que funcione en xp, Vista y Windows 7. Todo esto con soporte multiprocesador

En XP lo encontraba a través de PKPCR:

Código:
PKPCR
KeGetPcr(VOID)
{
    __asm   mov eax, 0xFFDFF000;
}

.....
KPCR  *lpPcr = KeGetPcr();
KernBase=  ((PKDDEBUGGER_DATA32)(lpPcr->KdVersionBlock))->KernBase;

Pero desde vista PKPCR no está en una dirección fija.

Posiblemente exista una forma mas sencilla de la que he usado hasta ahora, pero no la encuentro.

Os agradezco la ayuda.

Saludos.
En línea
Karcrack
Moderador
***
Desconectado Desconectado

Mensajes: 2.132


Se siente observado ¬¬'


Ver Perfil
Re: dirección KernelBase desde un driver
« Respuesta #1 en: 19 Noviembre 2009, 20:36 »

Ese es el problema de las direcciones Hardcodeadas... A ver si Hendrix sabe algo... el es el que maneja drivers :P
En línea

bizco


Desconectado Desconectado

Mensajes: 698


Ver Perfil
Re: dirección KernelBase desde un driver
« Respuesta #2 en: 19 Noviembre 2009, 21:10 »

igual q obtienes la base de kernel32
En línea
escabe

Desconectado Desconectado

Mensajes: 34



Ver Perfil
Re: dirección KernelBase desde un driver
« Respuesta #3 en: 19 Noviembre 2009, 21:31 »

igual q obtienes la base de kernel32

...¿y como la obtienes?

Saludos.
En línea
escabe

Desconectado Desconectado

Mensajes: 34



Ver Perfil
Re: dirección KernelBase desde un driver
« Respuesta #4 en: 19 Noviembre 2009, 21:46 »

Encontré este artículo, se describen varios métodos, ninguno es definitivo. Intuyo que debe existir un sistema mas sencillo...

Saludos.
En línea
Hendrix
In The Kernel Land
Colaborador
***
Desconectado Desconectado

Mensajes: 2.270



Ver Perfil WWW
Re: dirección KernelBase desde un driver
« Respuesta #5 en: 20 Noviembre 2009, 17:40 »

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

Código
//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.

Código
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  :)

En línea

"Todos los días perdemos una docena de genios en el anonimato. Y se van. Y nadie sabe de ellos, de su historia, de su peripecia, de lo que han hecho, de sus angustias, de sus alegrías. Pero al menos una docena de genios se van todos los días sin que sepamos de ellos". - Juan Antonio Cebrián
Karcrack
Moderador
***
Desconectado Desconectado

Mensajes: 2.132


Se siente observado ¬¬'


Ver Perfil
Re: dirección KernelBase desde un driver
« Respuesta #6 en: 20 Noviembre 2009, 18:18 »

Ya sabia yo que Hendrix tendria la solucion :P
En línea

escabe

Desconectado Desconectado

Mensajes: 34



Ver Perfil
Re: dirección KernelBase desde un driver
« Respuesta #7 en: 22 Noviembre 2009, 21:08 »

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.

La API ZwQuerySystemInformation nunca la había usado.

Desde el modo usuario encontraba el KernelBase con ZwSystemDebugControl.

Código:
DWORD GetKrnlBase()
{
    DBGKD_GET_VERSION64 KVB;
    KVB.KernBase = 0;
    ZwSystemDebugControl(SysDbgSysGetVersion, 0, 0, &KVB, sizeof(KVB), 0);
    return KdVersionBlock.KernBase;
}

Gracias por tu respuesta Hendrix. Estudiaré mas despacio lo que propones, es muy interesante.

Un Saludo.
« Última modificación: 22 Noviembre 2009, 23:53 por escabe » En línea
escabe

Desconectado Desconectado

Mensajes: 34



Ver Perfil
Re: dirección KernelBase desde un driver
« Respuesta #8 en: 23 Noviembre 2009, 14:27 »

He probado el sistema y funciona a la perfección ;D.

Sólo le veo una pega, parece que  ZwQuerySystemInformation sólo está disponible desde NT 4.0 y que no se garantiza su continuidad:
[ZwQuerySystemInformation may be altered or unavailable in subsequent versions of Windows. Applications should use the alternate functions listed in this topic.]

¿Existirá un sistema mas fiable a largo plazo? :huh:

Saludos.
En línea
BrokenWindow

Desconectado Desconectado

Mensajes: 36


Ver Perfil
Re: dirección KernelBase desde un driver
« Respuesta #9 en: 23 Noviembre 2009, 23:59 »

Puedes utilizar la variable global PsLoadedModuleList, primero tienes que obtener un puntero a la estructura LDR_DATA_TABLE_ENTRY. El primer miembro  LoadOrder Apunta a la lista de todos los modulos el primero corresponde al kernel.

un puntero a LDR_DATA_TABLE_ENTRY lo puedes obtener del DRIVER_OBJECT (DriverSection)

Espero no equivocarme, lamento no tener el ddk instalado actualmente

Saludos  
« Última modificación: 24 Noviembre 2009, 00:01 por BrokenWindow » En línea
escabe

Desconectado Desconectado

Mensajes: 34



Ver Perfil
Re: dirección KernelBase desde un driver
« Respuesta #10 en: 24 Noviembre 2009, 00:42 »

Gracias por tu interés, BrokenWindow seguiré tu pista ;D, pero me pregunto si servirá para Win64 :huh: La técnica con ZwQuerySystemInformation si sirve aunque su futuro no está asegurado por Microsoft.

Saludos.
En línea
BrokenWindow

Desconectado Desconectado

Mensajes: 36


Ver Perfil
Re: dirección KernelBase desde un driver
« Respuesta #11 en: 24 Noviembre 2009, 02:37 »

Nunca lo probe personalmente en una version windows 64 , pero seguramente funcione desde NT en adelante

Aunque como ha dicho Hendrix, ZwQuerySystemInformation es apliamente usado por diversos anti-rootkits y antivirus para detectar hooks, scannean la SDDT en busca de entradas fuera del kernel. No creo que microsoft quite esta funcion de un dia para el otro aunque muchos rootkits la emple de forma ilegitima.

Buscando ahora encontre algunos links interesantes:

http://hexblog.com/2009/02/advanced_windows_kernel_debugg.html
http://alter.org.ua/en/docs/nt_kernel/procaddr/index3.php

Saludos
En línea
[L]ord [R]NA


Desconectado Desconectado

Mensajes: 1.508


El Dictador y Verdugo de H-Sec


Ver Perfil WWW
Re: dirección KernelBase desde un driver
« Respuesta #12 en: 24 Noviembre 2009, 09:03 »

No quitaran las funciones, si te fijas muchas funciones pasan a ser obsoletas  pero siguen en el S.O. por cuestiones de compatibilidad. Asi que no te preocupes por cosas a corto o a largo plazo.
En línea

escabe

Desconectado Desconectado

Mensajes: 34



Ver Perfil
Re: dirección KernelBase desde un driver
« Respuesta #13 en: 24 Noviembre 2009, 22:20 »

Si, los había leído, son muy buenos ;D, de hecho el segundo era el que cité aquí:
Encontré este artículo, se describen varios métodos, ninguno es definitivo...

No quitaran las funciones, si te fijas muchas funciones pasan a ser obsoletas  pero siguen en el S.O. por cuestiones de compatibilidad. Asi que no te preocupes por cosas a corto o a largo plazo.

Probáblemente tengas razón, pero no siempre se han conservado todas las APIs, tenemos el ejemplo de RegisterServiceProcess.  :)

Saludos.
En línea
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[MASM32] KernelBase Address + GetProcAddress
Análisis y Diseño de Malware
The Swash 0 524 Último mensaje 9 Mayo 2011, 02:23
por The Swash
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines