I have two ideas for this.
Method 1 - The "real way".
I think you want ptrace. But it isn't going to be easy to use.
Essentially this call is for writing a debugger. Note that PTRACE_SYSCALL
steps until the next syscall. At which point you might be able to use more ptrace
calls to peek at the process's memory to observe if it's, say, a call to open()
.
Method 2 - The lazy, hackish way.
You could use the LD_PRELOAD
environment variable. That is, write a shared library with your own implementation of the calls you want to hook (say, open()
, dlopen()
), adding your own code and dispatching to the normal libc version. Then you point the LD_PRELOAD
environment variable at this shared library so the dynamic linker will load it at process start.
One downside to this approach is that if a process knows it's being observed this way, it can reset the environment variable and execute itself again, and evade detection. Another I can think of is that as a security feature this environment variable is not honored if you're root.