31Oct/080
Localizando la EPROCESS
En ciertas ocasiones, cuando estamos programando en modo kernel en sistemas Windows, nos es necesario localizar la EPROCESS de algún proceso para conocer alguno/s de sus datos. Las siguientes funciones, devuelven la dirección de memoria de la EPROCESS del proceso indicado, o bien por el PID del proceso, o por el nombre de la imagen.
Localizar según el PID
unsigned long BuscaEPROCESSPidDKOM(unsigned int Pid)
{
unsigned long eproc,aux,proceso,ret;
PLIST_ENTRY lista;
unsigned int idProceso=0;
eproc=(unsigned long)PsGetCurrentProcess();//estamos en "System"
//tenemos los punteros al siguiente y al anterior
lista=(LIST_ENTRY*)(eproc+0×88);
aux=(unsigned long)lista->Blink;
proceso=(unsigned long)lista;
idProceso=*((int *)(proceso+0×84));
while(proceso!=0 && aux!=proceso && Pid!=idProceso)//recorremos la lista
{
proceso-=0×88;
ret=proceso;
idProceso=*((int *)(proceso+0×84));
//avanzamos
lista=lista->Flink;
proceso=(unsigned long)lista;
}
if(Pid!=idProceso)
{
ret=0;
#ifdef DEBUG
DbgPrint("DKOM: Coincidencia no encontrada");
}else{
DbgPrint("DKOM: Coincidencia PID=%d",Pid);
#endif
}
return ret;
}
Localizar según el nombre de la imagen
unsigned long BuscaEPROCESSNombreDKOM(unsigned char *Nombre)
{
unsigned long eproc,aux,proceso,ret=0;
PLIST_ENTRY lista;
unsigned char *p;
eproc=(unsigned long)PsGetCurrentProcess();//estamos en "System"
//tenemos los punteros al siguiente y al anterior
lista=(LIST_ENTRY*)(eproc+0×88);
aux=(unsigned long)lista->Blink;
proceso=(unsigned long)lista;
p=(unsigned char *)(proceso+0×174);
/* Recorremos la lista (comparando con la longitud del proceso
que nos dice el sistema, y no con el de el usuario */
while(proceso!=0 && aux!=proceso && p!=0 &&
strncmp(Nombre,p,strlen(Nombre))!=0)
{
proceso-=0×88;
ret=proceso;
p=(unsigned char *)(proceso+0×174);
//avanzamos
lista=lista->Flink;
proceso=(unsigned long)lista;
}
if(strncmp(Nombre,p,strlen(Nombre))!=0)
{
ret=0;
#ifdef DEBUG
DbgPrint("DKOM: Coincidencia no encontrada");
}else{
DbgPrint("DKOM: Coincidencia: %s",Nombre);
#endif
}
return ret;
}




