Как отследить системные вызовы во FreeBSD из исходного кода?
Как регистрировать системные вызовы (номер системного вызова и возвращаемое значение, для обоих int 0x80
а также sysenter/syscall
) на FreeBSD 10.1 x86_64 из исходного кода?
я знаю truss
может сделать работу, но мне нужно зарегистрировать другую информацию, такую как буфер copyout
во время каждого системного вызова.
Я пытался найти исходный код truss
, но не удалось. Также я попытался отследить их в amd64_syscall()
, но результат кажется неполным по сравнению с результатом truss
, Любая идея о том, какие функции я должен заботиться в реализации?
2 ответа
Вы не указали, зачем вам это нужно. В частности, если вам это нужно в целях безопасности, вы делаете это неправильно.
Что значит неудача? Источники здесь: http://bxr.su/FreeBSD/usr.bin/truss/
Общий механизм, используемый такими инструментами, известен как ptrace ( https://www.freebsd.org/cgi/man.cgi?query=ptrace), и среди прочего он позволяет останавливать отслеживаемые потоки, когда они выполняют системные вызовы.
Однако следует отметить, что, хотя такие механизмы позволяют вам копировать все аргументы, другие потоки могут изменять память, указанную вышеупомянутыми аргументами, после того, как вы скопируете их, непосредственно перед тем, как системный вызов сделает то же самое. Вы хотите использовать MAC-хуки, если это вас беспокоит.
Возможно, это не совсем то, что вам нужно, но вы можете посмотреть, как работают утилиты ktrace(1)/kdump(1).