|
DOWNLOAD
EnyeLKM 1.1.2 obtiene el SYSENTER en tiempo de ejecución con la instrucción:
rdmsr( MSR_IA32_SYSENTER_EIP, psysenter_entry, v2 );
YA NO DA UN SOLO WARNING!!! :-) al ejecutar make.
Además se ha reprogramado todo el base.c y se han creados dos módulos nuevos:
extern_symbols: donde existen funciones para obtener símbolos externo al LKM,
por ejemplo:
/* thx to Int27h :-). */
void * get_sysenter_entry( void )
{
void * psysenter_entry = NULL ;
unsigned long v2 ;
if ( boot_cpu_has( X86_FEATURE_SEP ) )
rdmsr( MSR_IA32_SYSENTER_EIP, psysenter_entry, v2 );
else
return NULL;
return psysenter_entry;
}
También se ha creado el módulo lowlevel_layer: gracias a él podemos abstraernos
muchísmo en los módulos que hagan rastreo en memoria de opcodes y demás funciones,
por ejemplo:
void set_idt_handler( void * system_call )
{
unsigned char * p;
push_ret_t push_ret;
p = (unsigned char *) system_call;
/* primer salto */
while ( !is_jnb_opcode( (unsigned char *) p ) )
p ++;
p -= DISTANCE_FROM_CMP_NR_SYSCALL_TO_JNB;
create_push_ret( & push_ret, (unsigned long) new_idt );
write_push_ret( ( void *) p, & push_ret )
...
Y antes esto era algo así:
void set_idt_handler(void *system_call)
{
unsigned char *p;
unsigned long *p2;
p = (unsigned char *) system_call;
/* primer salto */
while (!((*p == 0x0f) && (*(p+1) == 0x83)))
p++;
p -= 5;
*p++ = 0x68;
p2 = (unsigned long *) p;
*p2++ = (unsigned long) new_idt;
p = (unsigned char *) p2;
*p = 0xc3;
Como se puede apreciar ahora es mucho más fácil abstraerse del problema gracias a la
capa "lowlevel".
La siguiente cosa que desarrollare es la posible descarga del módulo, habrá que crear mínimo otro módulo para la gestion de memoria con ESCRITURA-Y-RESTAURACIÓN para su descarga.
Recuerdo que pueden seguir el desarrollo más exhaustivamente
en:
http://fr33project.org/enyelkm/ |