ptrace (рдкреНрд░реЛрд╕реЗрд╕ рдЯреНрд░реЗрд╕ рд╕реЗ) - рдХреБрдЫ рдпреВрдирд┐рдХреНрд╕ рдЬреИрд╕реЗ рд╕рд┐рд╕реНрдЯрдо (рд▓рд┐рдирдХреНрд╕, рдлреНрд░реАрдмреАрдПрд╕рдбреА, рдореИрдХреНрд╕ рдУрдПрд╕ рдПрдХреНрд╕ рд╕рд╣рд┐рдд) рдкрд░ рдПрдХ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓, рдЬреЛ рдЖрдкрдХреЛ рдЪрдпрдирд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЯреНрд░реЗрд╕ рдпрд╛ рдбреАрдмрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ ptrace рдЖрдкрдХреЛ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░ рдкреВрд░рд╛ рдирд┐рдпрдВрддреНрд░рдг рджреЗрддрд╛ рд╣реИ: рдЖрдк рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдкрд╛рдареНрдпрдХреНрд░рдо рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕реНрдореГрддрд┐ рдпрд╛ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рдЕрдзрд┐рдХрд╛рд░ рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИ - рд╕рдВрднрд╛рд╡рд┐рдд рдХреНрд░рд┐рдпрд╛рдПрдВ рд░рдирд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕реАрдорд┐рдд рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬрдм рдПрдХ рд╕реЗрдЯ рдмрд┐рдЯ рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдЯреНрд░реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣реА рдмрд┐рдЯ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ - рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░реЛрдВ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред
рдпрд╣ рдЖрд▓реЗрдЦ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдирдХреНрд╕ рдУрдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ред
1. ptrace рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛
рдпрд╣рд╛рдБ рдХреНрдпрд╛ ptrace рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рджрд┐рдЦрддрд╛ рд╣реИ:
#include <sys/ptrace.h>
long ptrace( enum __ptrace_request request, pid_t pid, void *addr, void *data);
- рдЕрдиреБрд░реЛрдз рдПрдХ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП PTRACE_CONT, PTRACE_PEEKTEXT
- pid - рдЯреНрд░реЗрд╕ рдХреА рдЧрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛
- Addr рдФрд░ рдбреЗрдЯрд╛ рдЕрдиреБрд░реЛрдз рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ
рдЖрдк рджреЛ рддрд░реАрдХреЛрдВ рд╕реЗ рдЯреНрд░реЗрд╕рд┐рдВрдЧ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдкрд╣рд▓реЗ рд╕реЗ рдЪрд▓ рд░рд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ (PTRACE_ATTACH) рд╕реЗ рдЬреБрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╛ PTRACE_TRACEME рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрд╡рдпрдВ рдЗрд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рд╣рдо рджреВрд╕рд░реЗ рдорд╛рдорд▓реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рдпрд╣ рдереЛрдбрд╝рд╛ рд╕рд░рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рд░ рд╕рдорд╛рди рд╣реИред рдЯреНрд░реЗрд╕ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдирд┐рдореНрди рддрд░реНрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
- PTRACE_SINGLESTEP - рдЪрд░рдг-рджрд░-рдЪрд░рдг рдХрд╛рд░реНрдпрдХреНрд░рдо рдирд┐рд╖реНрдкрд╛рджрди, рдкреНрд░рддреНрдпреЗрдХ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдирд┐рдпрдВрддреНрд░рдг рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛; рдЗрд╕ рддрд░рд╣ рдХреЗ рдирд┐рд╢рд╛рди рдХрд╛рдлреА рдзреАрдорд╛ рд╣реИ
- PTRACE_SYSCALL - рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рддрдм рддрдХ рдЬрд╛рд░реА рд░рдЦреЗрдВ рдЬрдм рддрдХ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рджрд░реНрдЬ рдпрд╛ рдмрд╛рд╣рд░ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛
- PTRACE_CONT - рдмрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдирд┐рд╖реНрдкрд╛рджрди рдЬрд╛рд░реА рд░рдЦреЗрдВ
рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП,
рдЖрджрдореА ptrace рджреЗрдЦреЗрдВред
2. рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рджреЗрдЦреЗрдВ
рд╣рдо рдкреНрд░реЛрдЧреНрд░рд╛рдо рджреНрд╡рд╛рд░рд╛ рдкреНрд░рдпреБрдХреНрдд рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦреЗрдВрдЧреЗ (рд╕реНрдЯреНрд░реЗрд╕ рдпреВрдЯрд┐рд▓рд┐рдЯреА рдХрд╛ рдПрдХ рд╕рд░рд▓ рдПрдирд╛рд▓реЙрдЧ)ред
рддреЛ, рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдПрдХ
рдХрд╛рдВрдЯрд╛ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмрдЪреНрдЪреЗ рдХреЛ рдбрд┐рдмрдЧ рдХрд░реЗрдЧреА:
int main( int argc, char *argv[]) {
pid_t pid = fork();
if (pid)
parent(pid);
else
child();
return 0;
}
рдмрдЪреНрдЪреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ - PTRACE_TRACEME рдХреЗ тАЛтАЛрд╕рд╛рде рдЯреНрд░реЗрд╕ рд╢реБрд░реВ рдХрд░реЗрдВ рдФрд░ рд╡рд╛рдВрдЫрд┐рдд рдХрд╛рд░реНрдпрдХреНрд░рдо рдЪрд▓рд╛рдПрдВ:
void child() {
ptrace(PTRACE_TRACEME, 0, 0, 0);
execl( "/bin/echo" , "/bin/echo" , "Hello, world!" , NULL);
perror( "execl" );
}
рдЬрдм
рдирд┐рд╖реНрдкрд╛рджрди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ
рдЯреНрд░реЗрд╕ рдХреА рдЧрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рдирдпрд╛ рд░рд╛рдЬреНрдп рдкрд╛рд╕ рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрдЧреАред рдЗрд╕рд▓рд┐рдП, рдкреИрд░реЗрдВрдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкрд╣рд▓реЗ
рд╡реЗрдЯрдкрд┐рдб рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП (рдЖрдк рдмрд╕
рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рдмрдЪреНрдЪреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИ):
int status;
waitpid(pid, &status, 0);
рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдФрд░ рдЕрдиреНрдп рд╕реНрдЯреЙрдкреНрд╕ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, SIGTRAP) рдХреЗ рдмреАрдЪ рдХрд┐рд╕реА рддрд░рд╣ рдЕрдВрддрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреИрд░рд╛рдореАрдЯрд░ PTRACE_O_TRACESYSGOOD рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдЬрдм рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдореВрд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛
SIGTRAP рдкреНрд░рд╛рдкреНрдд
рд╣реЛрдЧреАред 0x80 :
ptrace(PTRACE_SETOPTIONS, pid, 0, PTRACE_O_TRACESYSGOOD);
рдЕрдм рдЖрдк рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдкрд╛рд╢ рдореЗрдВ PTRACE_SYSCALL рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдирдВрдмрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
eax рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЗ рдореВрд▓реНрдп рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, PTRACE_GETREGS рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд░реЛрдХ рдХреЗ рд╕рдордп
рдИрдПрдХреНрд╕рдПрдХреНрд╕ рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рд╕рд╣реЗрдЬреЗ рдЧрдП
рд░рд╛рдЬреНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ
редorig_x :
while (!WIFEXITED(status)) {
struct user_regs_struct state;
ptrace(PTRACE_SYSCALL, pid, 0, 0);
waitpid(pid, &status, 0);
// at syscall
if (WIFSTOPPED(status) && WSTOPSIG(status) & 0x80) {
ptrace(PTRACE_GETREGS, pid, 0, &state);
printf( "SYSCALL %d at %08lx\n" , state.orig_eax, state.eip);
// skip after syscall
ptrace(PTRACE_SYSCALL, pid, 0, 0);
waitpid(pid, &status, 0);
}
}
рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдЪрд▓рд╛рдиреЗ рдкрд░, рд╣рдо рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджреЗрдЦрддреЗ рд╣реИрдВ:
...
SYSCALL 6 at b783a430
SYSCALL 197 at b783a430
SYSCALL 192 at b783a430
SYSCALL 4 at b783a430
Hello, world!
SYSCALL 6 at b783a430
SYSCALL 91 at b783a430
SYSCALL 6 at b783a430
SYSCALL 252 at b783a430
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдирдВрдмрд░ 4 рдХреЗ рдмрд╛рдж (рдФрд░ рдпрд╣
sys_write рд╣реИ ), рд╣рдорд╛рд░рд╛ рдкрд╛рда рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИред
3. рдПрдХ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░рдирд╛
рдЕрдм рдЪреБрдиреМрддреА рдХреЛ рд░реЛрдХрдиреЗ рдФрд░ рдХреБрдЫ рдЕрдЪреНрдЫрд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред
рд▓реЗрдЦрди рдкреНрд░рдгрд╛рд▓реА рдХреЙрд▓ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
write(fd, buf, n);
- ebx: fd - рдлрд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ (рд╕рдВрдЦреНрдпрд╛)
- ecx: buf - рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рда рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХ
- edx: n - рдмрд╛рдЗрдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛
рдкрд╛рда рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, PTRACE_POKETEXT рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
// sys_write
if (state.orig_eax == 4) {
char * text = ( char *)state.ecx;
ptrace(PTRACE_POKETEXT, pid, ( void *)(text+7), 0x72626168); //habr
ptrace(PTRACE_POKETEXT, pid, ( void *)(text+11), 0x00000a21); //!\n
}
рд╣рдо рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ ...
...
SYSCALL 6 at 00556416
SYSCALL 197 at 00556416
SYSCALL 192 at 00556416
SYSCALL 4 at 00556416
Hello, habr!
SYSCALL 6 at 00556416
SYSCALL 91 at 00556416
SYSCALL 6 at 00556416
SYSCALL 252 at 00556416
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдордиреЗ рдЕрдкрдиреЗ рдкрд╛рда рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
/ рдмрд┐рди / рдЧреВрдВрдЬ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ
sys_write рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд┐рдпрд╛ред рдпрд╣ ptrace рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕рд┐рд░реНрдл рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрд╕рд╛рдиреА рд╕реЗ рдореЗрдореЛрд░реА рдбрдВрдк рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдпрд╣ рд╡реИрд╕реЗ, рд▓рд┐рдирдХреНрд╕ рдХреНрд░реИрдХрдорд┐рдХреНрд╕ рдХреЛ рд╣рд▓ рдХрд░рддреЗ рд╕рдордп рдмрд╣реБрдд рдорджрдж рдХрд░рддрд╛ рд╣реИ), рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯреНрд╕ рд╕реЗрдЯ рдХрд░реЗрдВ (PTRACE_SINGLESTEP рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдпрд╛ рдирд┐рд░реНрджреЗрд╢ рдХреЛ 0xCC рдХреЗ рд╕рд╛рде рдмрджрд▓рдХрд░), рд╡рд┐рд╢реНрд▓реЗрд╖рдг / рдЪрд░ рдФрд░ рдЕрдзрд┐рдХ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВред
ptrace рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдЖрдк рдЬрд▓реНрджреА рд╕реЗ рдХреЛрдб рдХреЗ рд╕рдорд╕реНрдпрд╛ рд╡рд╛рд▓реЗ рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рдирд╣реАрдВ рдЖ рд╕рдХрддреЗ рд╣реИрдВ - рдЕрдЧрд░ рдЖрдкрдХреЛ рдбрд┐рдмрдЧрд░ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рдХреВрджрдирд╛ рдФрд░ рдмрджрд▓рдирд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдорд░ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рд╕рдм рдХреБрдЫ рдирдпрд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛; рдпрджрд┐ рдЖрдк ptrace рдХреЗ рд╕рд╛рде рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЗрди рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рд╡рд░реНрдгрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рд╡реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдВрдЧреЗред рдмреЗрд╢рдХ, рдХреБрдЫ рдбрд┐рдмрдЧрд░ рдореЗрдВ рдЖрдк рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ - рд▓реЗрдХрд┐рди рд╡реЗ рд╢рд╛рдпрдж рдХреНрд╖рдорддрд╛рдУрдВ рдореЗрдВ рд╣реАрди рд╣реИрдВред
UPD: рдкреВрд░реНрдг
рд╕реНрд░реЛрдд рдкреЛрд╕реНрдЯ рдХрд░рдирд╛ рднреВрд▓ рдЧрдпрд╛
4. рдХреНрдпрд╛ рдкрдврд╝рдирд╛ рд╣реИ
рдЖрджрдореА ptraceрдЖрджрдореА рд░реБрдХреЛрдкреАрдЯреНрд░реЗрд╕ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдирд╛, рднрд╛рдЧ IPtrace рдХреЗ рд╕рд╛рде рдЦреЗрд▓, рднрд╛рдЧ IIsyscalls рддрд╛рд▓рд┐рдХрд╛