Ptrace рдХреЗ рд╕рд╛рде рд╕рд╛рд╣рд╕рд┐рдХ (2)

Habr├й рдиреЗ рдкрд╣рд▓реЗ рд╣реА ptrace рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЗ рдЕрд╡рд░реЛрдзрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦрд╛ рдерд╛ ; рдПрд▓реЗрдХреНрд╕рд╛ рдиреЗ рдЗрд╕ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдкреЛрд╕реНрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦрд╛, рдЬрд┐рд╕рдХрд╛ рдореИрдВрдиреЗ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред


рдХрд╣рд╛рдВ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ


рдбреАрдмрдЧ рдХрд┐рдП рдЧрдП рдкреНрд░реЛрдЧреНрд░рд╛рдо рдФрд░ рдбреАрдмрдЧрд░ рдХреЗ рдмреАрдЪ рд╕рдВрдЪрд╛рд░ рд╕рдВрдХреЗрддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореБрд╢реНрдХрд┐рд▓ рдЪреАрдЬреЛрдВ рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░рддрд╛ рд╣реИ; рдордиреЛрд░рдВрдЬрди рдХреЗ рд▓рд┐рдП, рдЖрдк man ptrace рдХрд╛ BUGS рдЕрдиреБрднрд╛рдЧ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред

рдбрд┐рдмрдЧрд┐рдВрдЧ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╣реИрдВ:

  1. ptrace(PTRACE_TRACEME, 0, NULL, NULL) рд╡рд░реНрддрдорд╛рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЬрдирдХ рдХреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдбрд┐рдмрдЧрд░ рдмрдирд╛ рджреЗрдЧрд╛ред рдорд╛рддрд╛-рдкрд┐рддрд╛ рд╕реЗ рдХреЛрдИ рд╕рд╣рд╛рдпрддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ; man рдзреАрд░реЗ рд╕реЗ рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реИ: "рдпрджрд┐ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдЗрд╕реЗ рдЯреНрд░реЗрд╕ рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╢рд╛рдпрдж рдпрд╣ рдЕрдиреБрд░реЛрдз рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред" (рдЕрдиреНрдп рдЬрдЧрд╣реЛрдВ рдкрд░ рдЖрдкрдиреЗ "рд╢рд╛рдпрдж рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП" рд╡рд╛рдХреНрдпрд╛рдВрд╢ рджреЗрдЦрд╛?) рдпрджрд┐ рд╡рд░реНрддрдорд╛рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдбрд┐рдмрдЧрд░ рдерд╛, рддреЛ рдХреЙрд▓ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧреАред
  2. ptrace(PTRACE_ATTACH, pid, NULL, NULL) рд╡рд░реНрддрдорд╛рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ pid рд▓рд┐рдП рдбрд┐рдмрдЧрд░ рдмрдирд╛ рджреЗрдЧрд╛ред рдпрджрд┐ pid рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдбрд┐рдмрдЧрд░ рдерд╛, рддреЛ рдХреЙрд▓ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧреАред SIGSTOP рдбреАрдмрдЧ рдХреА рдЧрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛ SIGSTOP рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рддрдм рддрдХ рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рдирд╣реАрдВ рд░рдЦреЗрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рдбреАрдмрдЧрд░ рдЗрд╕реЗ рдбреАрдлрд╝реНрд░реЙрд╕реНрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ред

рдпреЗ рджреЛ рд╡рд┐рдзрд┐рдпрд╛рдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВ; рдЖрдк рдпрд╛ рддреЛ рдПрдХ рдпрд╛ рджреВрд╕рд░реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рд╕рдВрдпреЛрдЬрди рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ PTRACE_ATTACH рддрд╛рддреНрдХрд╛рд▓рд┐рдХ рдирд╣реАрдВ рд╣реИ: ptrace(PTRACE_ATTACH) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреЗ рдмрд╛рдж, рдЖрдорддреМрд░ рдкрд░ ptrace(PTRACE_ATTACH) waitpid(2) рдХреЛ PTRACE_ATTACH "рдХрд╛рд░реНрдп" рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП PTRACE_ATTACH рд╣реИред

рдЖрдк PTRACE_TRACEME рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рддрд╣рдд рдмрдЪреНрдЪреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 static void tracee(int argc, char **argv) { if (ptrace(PTRACE_TRACEME, 0, NULL, NULL) < 0) die("child: ptrace(traceme) failed: %m"); /*   ,   . */ if (raise(SIGSTOP)) die("child: raise(SIGSTOP) failed: %m"); /*  . */ execvp(argv[0], argv); /*     . */ die("tracee start failed: %m"); } static void tracer(pid_t pid) { int status = 0; /* ,       . */ if (waitpid(pid, &status, 0) < 0) die("waitpid failed: %m"); if (!WIFSTOPPED(status) || WSTOPSIG(status) != SIGSTOP) { kill(pid, SIGKILL); die("tracer: unexpected wait status: %x", status); } /*      ptrace,    . */ /* *  ,      *  ,      . *    --  API  ptrace! */ /*       PTRACE_SYSCALL. */ } /* (argc, argv) --    ,    . */ void shim_ptrace(int argc, char **argv) { pid_t pid = fork(); if (pid < 0) die("couldn't fork: %m"); else if (pid == 0) tracee(argc, argv); else tracer(pid); die("should never be reached"); } 

рдмрд┐рдирд╛ raise(SIGSTOP) рдХреЙрд▓ рдХреЗ, рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдирд┐рд╖реНрдкрд╛рджрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ execvp(3) рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдЧреА рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдореВрд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЗрд╕рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛ; рдФрд░ рдлрд┐рд░ рдбрд┐рдмрдЧрд░ рдХреА рдХреНрд░рд┐рдпрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░рдирд╛) рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рд╢реБрд░реВ рдирд╣реАрдВ рд╣реЛрдЧреАред

рдЬрдм рдбреАрдмрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкреНрд░рддреНрдпреЗрдХ ptrace(PTRACE_SYSCALL, pid, NULL, NULL) рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдореЗрдВ рдкрд╣рд▓реА рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рддрдХ рдбреАрдмрдЧ рдХреА рдЧрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ " ptrace(PTRACE_SYSCALL, pid, NULL, NULL) " рдФрд░ рдлрд┐рд░ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдЫреЛрдбрд╝рдиреЗ рддрдХред

рдЯреЗрд▓реАрдХреЗрдиреЗрдЯрд┐рдХ рдХреЛрдбрд╛рдВрддрд░рдХ


ptrace(PTRACE_SYSCALL) рдбреАрдмрдЧрд░ рдХреЛ рдХреЛрдИ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд▓реМрдЯрд╛рддрд╛; рд╡рд╣ рдмрд╕ рд╡рд╛рджрд╛ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдбрд┐рдмрдЧ рдХреА рдЬрд╛ рд░рд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣рд░ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдкрд░ рджреЛ рдмрд╛рд░ рдмрдВрдж рд╣реЛ рдЬрд╛рдПрдЧреАред рдбреАрдмрдЧ рдХреА рдЧрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд┐рд╕ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдиреЗ рдЗрд╕реЗ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рд╣реИ - рдЖрдкрдХреЛ рдХрд░реНрдиреЗрд▓ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдЗрд╕рдХреЗ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреА рдПрдХ рдкреНрд░рддрд┐ рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ struct user рдореЗрдВ рдПрдХ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдЪрдврд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, x86_64 рдкрд░, рдХреЙрд▓ рдирдВрдмрд░ regs.orig_rax рдлрд╝реАрд▓реНрдб рдореЗрдВ рд╣реЛрдЧрд╛, рдЬреЛ рдкрд╣рд▓рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╡рд╣ regs.rdi , рдЖрджрд┐ рдореЗрдВ рд╣реЛрдЧрд╛ред) рдПрд▓реЗрдХреНрд╕рд╛ рдЯрд┐рдкреНрдкрдгреА: "рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рд╕реА рдореЗрдВ рдЕрд╕реЗрдВрдмрд▓реА рдХреЛрдб рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рд░рд┐рдореЛрдЯ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред"

sys/user.h рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдмрдЬрд╛рдп, рдпрд╣ sys/reg.h рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╕реВрдЪрдХрд╛рдВрдХ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

 #include <sys/reg.h> /*    . */ long ptrace_syscall(pid_t pid) { #ifdef __x86_64__ return ptrace(PTRACE_PEEKUSER, pid, sizeof(long)*ORIG_RAX); #else // ... #endif } /*      . */ uintptr_t ptrace_argument(pid_t pid, int arg) { #ifdef __x86_64__ int reg = 0; switch (arg) { case 0: reg = RDI; break; case 1: reg = RSI; break; case 2: reg = RDX; break; case 3: reg = R10; break; case 4: reg = R8; break; case 5: reg = R9; break; } return ptrace(PTRACE_PEEKUSER, pid, sizeof(long) * reg, NULL); #else // ... #endif } 

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдбреАрдмрдЧ рдХреА рдЧрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреЛ рд╕реНрдЯреЙрдк - рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЗ рдкреНрд░рд╡реЗрд╢ рджреНрд╡рд╛рд░ рдкрд░ рдФрд░ рдЙрд╕рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдкрд░ - рдбреАрдмрдЧрд░ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рднрд┐рдиреНрди рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ; рддрд╛рдХрд┐ рдбрд┐рдмрдЧрд░ рдХреЛ рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдбрд┐рдмрдЧ рдХреА рдЧрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХрд┐рд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИ: рдпрджрд┐ рдХрдИ рд╣реИрдВ, рддреЛ рдХреЛрдИ рднреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рд╕рдВрдХреЗрддреЛрдВ рдХреА рдПрдХ рдЬреЛрдбрд╝реА рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдЖрдПрдЧреАред

рд╡рдВрд╢


PTRACE_O_TRACECLONE рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ, рдЬрд┐рд╕рдХрд╛ рдирд╛рдо PTRACE_O_TRACECLONE , рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ fork(2) рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдкрд░ рдбрд┐рдмрдЧ рдХреА рдЧрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рднреА рдмрдЪреНрдЪреЛрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдбрд┐рдмрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ fork(2) ред рдпрд╣рд╛рдВ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реВрдХреНрд╖реНрдо рдмрд┐рдВрджреБ рдпрд╣ рд╣реИ рдХрд┐ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд▓реЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╡рдВрд╢ рдбрд┐рдмрдЧрд░ рдХреЗ "рдЫрджреНрдо рдмрдЪреНрдЪреЗ" рдмрди рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ waitpid рди рдХреЗрд╡рд▓ "рддрддреНрдХрд╛рд▓ рдмрдЪреНрдЪреЛрдВ" рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд▓реНрдХрд┐ "рдЫрджреНрдо рдмрдЪреНрдЪреЛрдВ" рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдЧрд╛ред рдордиреБрд╖реНрдп рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЪреЗрддрд╛рд╡рдиреА рджреЗрддрд╛ рд╣реИ: "рд╡рд╛рдЯреНрд╕рдПрдк (2) рдкрд░ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп WCONTINUED рдзреНрд╡рдЬ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИ:" рдЬрд╛рд░реА "рд╕реНрдерд┐рддрд┐ рдкреНрд░рддрд┐-рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░рдирд╛ рдЯреНрд░реЗрд╕ рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЛ рднреНрд░рдорд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред" - рдпрд╛рдиреА "рдЫрджреНрдо рдмрдЪреНрдЪреЗ" рдореЗрдВ рджреЛ рдорд╛рддрд╛-рдкрд┐рддрд╛ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдЙрдирдХреЗ рд░реБрдХрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдбрд┐рдмрдЧрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ waitpid(-1) рди рдХреЗрд╡рд▓ рддрддреНрдХрд╛рд▓ рдмрдЪреНрдЪреЛрдВ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд▓реНрдХрд┐ рдХрд┐рд╕реА рднреА рдбреАрдмрдЧ рдХреА рдЧрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдХрд░реЗрдЧрд╛ред

рд╕рдВрдХреЗрдд


(рдПрдХ рдЕрдиреБрд╡рд╛рджрдХ рд╕реЗ рдмреЛрдирд╕ рд╕рд╛рдордЧреНрд░реА: рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдЕрдВрдЧреНрд░реЗрдЬреА рднрд╛рд╖рд╛ рдХреЗ рд▓реЗрдЦ рдореЗрдВ рдирд╣реАрдВ рд╣реИ)
рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдбреАрдмрдЧ рдХрд┐рдП рдЧрдП рдкреНрд░реЛрдЧреНрд░рд╛рдо рдФрд░ рдбреАрдмрдЧрд░ рдХреЗ рдмреАрдЪ рд╕рдВрдЪрд╛рд░ рд╕рдВрдХреЗрддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣реЛрддрд╛ рд╣реИред рдбрд┐рдмрдЧрд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рд╣реЛрдиреЗ рдкрд░ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ SIGSTOP рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ SIGTRAP рд╣рд░ рдмрд╛рд░ рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрддрд╛ рд╣реИ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдбреАрдмрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдпрд╛ рдПрдХ рдмрд╛рд╣рд░реА рд╕рд┐рдЧреНрдирд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ред рдбрд┐рдмрдЧрд░, рдмрджрд▓реЗ рдореЗрдВ, SIGCHLD рд╣рд░ рдмрд╛рд░ рдбреАрдмрдЧ рдХреА рдЧрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ (рдЬрд░реВрд░реА рдирд╣реАрдВ рдХрд┐ рддрддреНрдХрд╛рд▓ рдмрдЪреНрдЪрд╛) "рдлреНрд░реАрдЬ" рдпрд╛ "рдлреНрд░реАрдЬ" рдореЗрдВ рд╕реЗ рдПрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред

рдбреАрдмрдЧ ptrace(PTRACE_SYSCALL) рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ ptrace(PTRACE_SYSCALL) рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдЬрд┐рд╕реЗ ptrace(PTRACE_SYSCALL) (рдкрд╣рд▓реЗ рд╕рд┐рдЧреНрдирд▓ рдпрд╛ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рд╕реЗ рдкрд╣рд▓реЗ) рдпрд╛ ptrace(PTRACE_CONT) (рдкрд╣рд▓реЗ рд╕рд┐рдЧреНрдирд▓ рд╕реЗ рдкрд╣рд▓реЗ ptrace(PTRACE_SYSCALL) рдХреЙрд▓ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрдм SIGSTOP/SIGCONT рд╕рдВрдХреЗрддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдбрд┐рдмрдЧрд┐рдВрдЧ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ ptrace рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдБ рдЙрддреНрдкрдиреНрди рд╣реЛ рд╕рдХрддреА рд╣реИрдВ: рдпрджрд┐ рдбреАрдмрдЧрд░ "рдбрд┐рдмрдЧ" рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ SIGSTOP рдкреНрд░рд╛рдкреНрдд SIGSTOP , рддреЛ рдмрд╛рд╣рд░ рд╕реЗ рдпрд╣ рдРрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛ рдЬреИрд╕реЗ рд╕рд┐рдЧреНрдирд▓ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛; рдпрджрд┐ рдбреАрдмрдЧрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ SIGCONT рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдбрд┐рдмрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рддреЛ рдмрд╛рд╣рд░реА SIGCONT рдЗрд╕реЗ " SIGCONT " рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдЕрдм рдордЬрд╝реЗрджрд╛рд░ рд╣рд┐рд╕реНрд╕рд╛: рд▓рд┐рдирдХреНрд╕ рд╕реНрд╡рдпрдВ рдбрд┐рдмрдЧрд┐рдВрдЧ рд╕реЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рдорд╛рддрд╛-рдкрд┐рддрд╛ рдФрд░ рдмрдЪреНрдЪреЗ рдПрдХ-рджреВрд╕рд░реЗ рдХреЛ рдбрд┐рдмрдЧ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд▓реВрдк рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рд░реЛрдХрддреЗ рдирд╣реАрдВ рд╣реИрдВред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЬрдм рдХрд┐рд╕реА рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдХреЛрдИ рдмрд╛рд╣рд░реА рд╕рдВрдХреЗрдд рдорд┐рд▓рддрд╛ рд╣реИ, рддреЛ рд╡рд╣ SIGTRAP рдорд╛рдзреНрдпрдо рд╕реЗ "рдЬрдорд╛ рджреЗрддрд╛ рд╣реИ" - рддрдм SIGCHLD рджреВрд╕рд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ SIGTRAP рдорд╛рдзреНрдпрдо рд╕реЗ "рдЬрдорд╛ рджреЗрддрд╛ рд╣реИ"ред рдмрд╛рд╣рд░ рд╕реЗ SIGCONT рднреЗрдЬрдХрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ "рд╕рд╣- SIGCONT " рдХреЛ рдЧрддрд┐рд░реЛрдз рд╕реЗ рдмрд╛рд╣рд░ SIGCONT рд╣реИ; рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдмрдЪреНрдЪреЗ рдХреЛ ( SIGKILL ) рдХреЛ рдорд╛рд░ рджрд┐рдпрд╛ SIGKILL , рдлрд┐рд░ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдбрд┐рдмрдЧрд┐рдВрдЧ рдФрд░ "рдлреНрд░реАрдЬ" рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рдЬрд╛рдПрдВрдЧреЗред (рдпрджрд┐ рдЖрдк рдПрдХ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЛ рдорд╛рд░рддреЗ рд╣реИрдВ, рддреЛ рдмрдЪреНрдЪрд╛ рдЙрд╕рдХреЗ рд╕рд╛рде рдорд░ рдЬрд╛рдПрдЧрд╛ред) рдпрджрд┐ рдмрдЪреНрдЪрд╛ PTRACE_O_EXITKILL рд╡рд┐рдХрд▓реНрдк рдХреЛ PTRACE_O_EXITKILL рд╣реИ, рддреЛ рдЙрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЕрднрд┐рднрд╛рд╡рдХ рджреНрд╡рд╛рд░рд╛ PTRACE_O_EXITKILL рдЧрдИ рдореГрддреНрдпреБ рднреА рд╣реЛ рдЬрд╛рдПрдЧреАред

рдЕрдм рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдЬреЛрдбрд╝реА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐рд╕реА рднреА рд╕рдВрдХреЗрдд рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╕рдордп, рджреЛрдиреЛрдВ рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рд░ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рд╕рд╛рде рдорд░ рдЬрд╛рддреЗ рд╣реИрдВред рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдХреНрдпреЛрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдореИрдВ рд╕рдордЭрд╛рдКрдВрдЧрд╛ рдирд╣реАрдВ :-)

Source: https://habr.com/ru/post/hi439882/


All Articles