У меня есть две идеи для этого.
Метод 1 - «Реальный путь».
Я думаю, вы хотите ptrace . Но это не будет легко использовать.
По сути, этот вызов предназначен для написания отладчика. Обратите внимание, что PTRACE_SYSCALL
шагает до следующего системного вызова. В этот момент вы можете использовать больше ptrace
вызовов для просмотра памяти процесса, чтобы наблюдать, скажем, вызов open()
.
Метод 2 - Ленивый, хакерский путь.
Вы можете использовать переменную окружения LD_PRELOAD
. То есть напишите разделяемую библиотеку с собственной реализацией вызовов, которые вы хотите перехватить (скажем, open()
, dlopen()
), добавив свой собственный код и отправив его в обычную версию libc. Затем вы указываете переменную среды LD_PRELOAD
на эту общую библиотеку, чтобы динамический компоновщик загружал ее при запуске процесса.
Одним из недостатков этого подхода является то, что если процесс знает, что его наблюдают таким образом, он может сбросить переменную среды и снова выполнить себя, а также избежать обнаружения. Еще я могу подумать, что в качестве функции безопасности эта переменная среды не учитывается, если вы являетесь пользователем root.