Você examinou o kprobes
? Ou especificamente jprobes
.
Usando o jprobe, você pode conectar-se a execve
(ou qualquer outra função do kernel), verificar seus argumentos, etc., antes que a função seja executada. A maneira como funciona é que o chamador fornece uma função com a mesma assinatura que deseja rastrear e registra-a com uma chamada para jprobe_register
. Vamos chamar essa função my_execve
. Então, logo antes de executar a função real, o kernel primeiro salvaria todo o seu contexto (parâmetros, valores de registro, etc.) na pilha e passaria o controle para my_execve
, passando uma cópia daquele contexto. Quando my_execve
retorna (usando jprobe_return
em vez de return
), o kernel restaura o contexto salvo para a função original execve
e continua a execução. Isso significa que quaisquer alterações feitas no contexto não afetarão a execução da função original. Você pode ver um exemplo aqui: link .
Se você quiser manipular o contexto, por exemplo altere os valores nos registradores e, em seguida, use kprobes
, que segue um padrão semelhante, mas tem uma semântica um pouco mais envolvida.