por que o strace não usa syscalls de teste para descobrir seus índices na tabela de chamadas do sistema?

2

Eu entendo que o comando strace usa ptrace(PTRACE_PEEKUSER, child, __builtin_offsetof(struct user, regs.orig_eax)) para encontrar o índice de uma chamada de sistema em que o filho de tracee está preso. Então, para traduzir o índice para o nome da função syscall, ele construiu tabelas feitas a partir do grepping dos cabeçalhos do código fonte do linux presentes na instalação.

Este método deve ser não documentado e propenso a falhas, pois a localização e a sintaxe das declarações do código-fonte não são documentadas, devem ser encontradas pelo grepping e podem ser alteradas de maneiras desconhecidas. Estou correto em dizer isso?

Se é assim, então porque strace não usa o seguinte método, parece-me, é mais simples, depende apenas de documentação e é, assim, infalível.

No início da primeira execução após a reinicialização, strace envia um syscall de teste, um para cada função syscall, intercepta isso e observa qual índice syscall esse filho usa. Isso fornece uma tabela customizada completa e correta que pode ser armazenada em um arquivo conhecido para invocações adicionais de strace .

Estou certo de que este método deve ter sido considerado, já que não é nada particularmente engenhoso. Então deve haver algo errado com isso. O que está errado?

    
por user322908 24.07.2015 / 01:51

1 resposta

1

Porque não há conceito de um nome de syscall no nível mais baixo. Não há como strace dizer "Ei, vamos fazer uma chamada de fcntl() e ver qual é o número!". Só pode fazer chamadas com base nos próprios números de tela. Isso ocorre porque um syscall é feito quando o número syscall é salvo no registro eax ou rax e o processo chama int 0x80 ou syscall .

    
por 12.05.2018 / 11:29

Tags