Parchear CALLL reemplazándolo con NOPs funciona en el espacio del usuario pero no en el espacio del kernel

StackOverflow https://stackoverflow.com/questions/261021

Pregunta

Tengo un controlador de dispositivo que quiero parchear. Este controlador de dispositivo llama a IOLog y quiero deshacerme del registro.

Si reemplazo el CALLL a IOLog con (el número correspondiente de) NOPs dentro del controlador del dispositivo (kext), el kernel se bloquea con lo que parece una pila rota (" Puntero de marco inválido terminado de retroceso 0 ").

Sin embargo, la misma técnica funciona bien en el espacio de usuario (por ejemplo, NOPping NSLogs dentro de un binario OS X).

¿Qué me estoy perdiendo aquí?

¿Fue útil?

Solución

No explicó si realiza parches en frío (controlador en el disco) o parches en caliente (controlador en la memoria). Para los parches en memoria, pueden existir todo tipo de problemas, como el controlador que se ejecuta cuando lo parches, las CPU que han almacenado en caché partes del código, etc. Consulte la sección del manual de Intel sobre el código de modificación automática.

Para parchear en el disco, puede ser que tenga un registro de reubicación para la dirección de destino. Entonces, cuando se carga el controlador, el cargador de módulo dinámico reparará la dirección de IOLog en el código, reemplazándolo con la dirección real. Esto sobrescribirá sus instrucciones de nop.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top