рдорд╛рдЪ-рдУ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рди

рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рд╕рд╛рдЭрд╛ рдИрдПрд▓рдПрдл рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрд▓ рдкрд┐рдХ рд╡рд┐рдзрд┐ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЕрдм рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдорд╛рдЪ-рдУ- рдкреНрд░рд╛рд░реВрдк рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕рд╛рде рднреА рдРрд╕рд╛ рд╣реА рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдореИрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рд╕реНрдерд┐рддрд┐ рдХреЛ рдпрд╛рдж рдХрд░реВрдВрдЧрд╛ред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдореИрдХ рдУрдПрд╕ рдПрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реИ, рдЬреЛ рдХрдИ рддреГрддреАрдп-рдкрдХреНрд╖ рдЧрддрд┐рд╢реАрд▓-рд▓рд┐рдВрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ, рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдХрд╛рд░реНрдп рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ: рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рджреВрд╕рд░реЗ рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рдХреЙрд▓ рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░реЗрдВ, рдФрд░ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдореВрд▓ рдХреЙрд▓ рдХрд░реЗрдВред

рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдЕрдзреАрд░ рдЕрднреА рд╕рдм рдХреБрдЫ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП, рдПрдХ рдХрд╛рд▓реНрдкрдирд┐рдХ рдЙрджрд╛рд╣рд░рдг: рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕реА рднрд╛рд╖рд╛ (рдлрд╝рд╛рдЗрд▓ test.c) рдореЗрдВ "рдкрд░реАрдХреНрд╖рдг" рдирд╛рдордХ рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реИ рдФрд░ рдПрдХ рд╕рд╛рдЭрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп (рдлрд╝рд╛рдЗрд▓ libtest.c), рд╕рдорд╛рди рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде, рдкрд╣рд▓реЗ рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рд╣реИред рдпрд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИ: libtest ()ред рдЙрдирдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдорд╛рдирдХ рд╕реА рднрд╛рд╖рд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп (рдореИрдХ рдУрдПрд╕ рдХреЗ рд╕рд╛рде рдЖрдкреВрд░реНрддрд┐ рдХреА, libSystem.B.dylib рдореЗрдВ рдирд┐рд╣рд┐рдд) рд╕реЗ рдкреБрдЯ () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЖрдЗрдП рд╡рд░реНрдгрд┐рдд рд╕реНрдерд┐рддрд┐ рдХрд╛ рдПрдХ рдпреЛрдЬрдирд╛рдмрджреНрдз рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рджреЗрдЦреЗрдВ:

рдХрд╛рд░реНрдп рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
  1. рдЖрдкрдХреЛ libtest.dylib рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд▓рд┐рдП рдкреБрдЯ () рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЛ рд╣реБрдХрдб_рдкреБрдЯреНрд╕ () рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо (test.c рдлрд╝рд╛рдЗрд▓) рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рдореВрд▓ рдкреБрдЯ () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ;
  2. рдХрд┐рдП рдЧрдП рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВ, рдЕрд░реНрдерд╛рдд, рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдмрд╛рд░-рдмрд╛рд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП libtest () рд╕реЗ рдХреЙрд▓ рдореВрд▓ рдкреБрдЯ () рдореЗрдВ рдЬрд╛рддреА рд╣реИред
рдЙрд╕реА рд╕рдордп, рдХреЛрдб рдХреЛ рдмрджрд▓рдирд╛ рдпрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ, рдХреЗрд╡рд▓ рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдоред рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдкреБрдирдГ рдЖрд░рдВрдн рдХрд┐рдП рдмрд┐рдирд╛ рдХреЙрд▓ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рди рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдФрд░ рдЙрдбрд╝рд╛рди рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реА рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдордЪ-рдУ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ


рдордЪ-рдУ рдХреЛ рд╕рдордЭрдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдиреАрдЪреЗ рджреА рдЧрдИ рдЫрд╡рд┐ рдХреЛ рджреЗрдЦрдирд╛ рд╣реИред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдорд╛рдирд╡ рдЬрд╛рддрд┐ рдЕрднреА рддрдХ рдЕрдкрдиреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЪрд┐рддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд░ рдкрд╛рдИ рд╣реИред рдкрд╣рд▓реЗ рд╕рдиреНрдирд┐рдХрдЯрди рдореЗрдВ, рд╕рдм рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
  1. рд╢реАрд░реНрд╖рдХ - рд▓рдХреНрд╖реНрдп рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдФрд░ рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреА рдЖрдЧреЗ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рдХрд▓реНрдк рдпрд╣рд╛рдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВред
  2. рдбрд╛рдЙрдирд▓реЛрдб рдХрдорд╛рдВрдбреНрд╕ - рд╡реЗ рдЖрдкрдХреЛ рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдорд╛рдЪ-рдУ рднрд╛рдЧреЛрдВ рдХреЛ рдХреИрд╕реЗ рдФрд░ рдХрд╣рд╛рдВ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛ рд╣реИ: рд╕реЗрдЧрдореЗрдВрдЯ (рдиреАрдЪреЗ рджреЗрдЦреЗрдВ), рд╕рд┐рдВрдмрд▓ рдЯреЗрдмрд▓, рдФрд░ рдпрд╣ рднреА рдХрд┐ рдпрд╣ рдлрд╛рдЗрд▓ рдХрд┐рд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ, рддрд╛рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдкрд╣рд▓реЗ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред
  3. рдЦрдВрдб - рдореЗрдореЛрд░реА рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВ рдЬрд╣рд╛рдВ рдХреЛрдб рдпрд╛ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдЕрдиреБрднрд╛рдЧ рд▓реЛрдб рдХрд░рдирд╛ рд╣реИред
рдкрд╛рд░реНрд╕рд░ рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ

рджреВрд╕рд░реЗ рд╕рдиреНрдирд┐рдХрдЯрди рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХреБрдЫ рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдирд╛ рд╣реЛрдЧрд╛:


рдЖрдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдордЪ-рдУ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдбрд╝реЗ рдФрд░ рдмрдбрд╝реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде, рдХреЗрд╡рд▓ рдорд╛рдЪреЛрд╡реНрдпреВ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди, рдорд╛рдЪ-рдУ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣реЗрдбрд░, рд▓реЛрдб рдХрдорд╛рдВрдб, рд╕реЗрдЧрдореЗрдВрдЯ, рд╕реЗрдХреНрд╢рди, рд╕рд┐рдВрдмрд▓ рдЯреЗрдмрд▓ рдХреА рд╕рдЯреАрдХ рд╕рдВрд░рдЪрдирд╛ рдФрд░ рдЙрдирдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХрд╛ рд╕рдЯреАрдХ рд╡рд┐рд╡рд░рдг рдЕрдЬреНрдЮрд╛рдд рд╣реИред рд▓реЗрдХрд┐рди, рд╕реНрдкреЗрд╕рд┐рдлрд┐рдХреЗрд╢рди рдХреЗ рд╕рд╛рде рдпрд╣ рдХреЛрдИ рдмрдбрд╝реА рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рдФрд░ рдпрд╣ рд╣рдореЗрд╢рд╛ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдПрдкреНрдкрд▓ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ ред рдФрд░ рдпрджрд┐ рдЖрдкрдиреЗ рд╡рд┐рдХрд╛рд╕ рдЙрдкрдХрд░рдг рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдП рд╣реИрдВ, рддреЛ рдЖрдк рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ / usr / рд╢рд╛рдорд┐рд▓ / рдордЪ-рдУ (рд╡рд┐рд╢реЗрд╖рдХрд░ рд▓реЛрдбрд░.рдПрдЪ) рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдпрд╛рдж рд░рдЦрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдпрджреНрдпрдкрд┐ рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдореЗрдореЛрд░реА рдореЗрдВ рдареАрдХ рдЙрд╕реА рдХреНрд░рдо рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдбрд┐рд╕реНрдХ рдкрд░ рд╣реИ, рд▓рд┐рдВрдХрд░ рдкреНрд░рддреАрдХ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рд╣рдЯрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓рд╛рдЗрдиреЛрдВ рдХреА рдкреВрд░реА рддрд╛рд▓рд┐рдХрд╛ рдФрд░ рдмреВрдЯ рд╕рдордп рдореЗрдВ рдореЗрдореЛрд░реА рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдСрдлрд╕реЗрдЯ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдиреАрдЪреЗ рд░рдЦ рд╕рдХрддрд╛ рд╣реИред рдЬрд╣рд╛рдВ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рдлрд╛рдЗрд▓ рдореЗрдВ рд░рд╣рддреЗ рд╣реБрдП, рдпреЗ рдорд╛рди рдЖрдорддреМрд░ рдкрд░ рд╢реВрдиреНрдп рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдбрд┐рд╕реНрдХ рдкрд░ рдСрдлрд╕реЗрдЯ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рд╣реЗрдбрд░ рд╕рдВрд░рдЪрдирд╛ рд╕рд░рд▓ рд╣реИ (рдореИрдВ рдЗрд╕реЗ 32-рдмрд┐рдЯ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП рдЙрджреНрдзреГрдд рдХрд░рддрд╛ рд╣реВрдВ, 64-рдмрд┐рдЯ рдмрд╣реБрдд рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИ):

struct mach_header { uint32_t magic; cpu_type_t cputype; cpu_subtype_t cpusubtype; uint32_t filetype; uint32_t ncmds; uint32_t sizeofcmds; uint32_t flags; }; 

рд╕рдм рдХреБрдЫ рдПрдХ рдЬрд╛рджреВ рдореВрд▓реНрдп (0xFEEDFACE рдпрд╛ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдорд╢реАрди рд╢рдмреНрджреЛрдВ рдореЗрдВ рдмрд╛рдЗрдЯ рдХреНрд░рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдордЭреМрддреЗ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ) рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рдлрд┐рд░, рдкреНрд░реЛрд╕реЗрд╕рд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХрд╛ рдкреНрд░рдХрд╛рд░, рд▓реЛрдб рдХрдорд╛рдВрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдЖрдХрд╛рд░, рдФрд░ рдЕрдиреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЭрдВрдбреЗ рдХрд╛ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:


рдЖрд╡рд╢реНрдпрдХ рдмреВрдЯ рдХрдорд╛рдВрдб рдиреАрдЪреЗ рд╕реВрдЪреАрдмрджреНрдз рд╣реИрдВ:
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП (рдХреНрд░рдорд╢рдГ 32- рдФрд░ 64-рдмрд┐рдЯ рд╕рдВрд╕реНрдХрд░рдг):

рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЦрдВрдб рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ:
рдХрд┐рд╕реА рднреА рдбрд╛рдЙрдирд▓реЛрдб рдХрдорд╛рдВрдб рдХреА рд╢реБрд░реБрдЖрдд рдирд┐рдореНрди рдХреНрд╖реЗрддреНрд░реЛрдВ рд╕реЗ рд╣реЛрддреА рд╣реИ:
 struct load_command { uint32_t cmd; //   uint32_t cmdsize; //     }; 

рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдХрдорд╛рдВрдб рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрдИ рдФрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреНрд╖реЗрддреНрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:


рдЗрди рдЦрдВрдбреЛрдВ рдореЗрдВ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдЦрдВрдб рд╣реИрдВ:
рдЖрдЧреЗ рджреЗрдЦрддреЗ рд╣реБрдП, рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдПрдХ рдордЪ-рдУ рдореЗрдВ, рдЖрдпрд╛рдд рддрд╛рд▓рд┐рдХрд╛ __IMPORT, __ jump_table (32 рдмрд┐рдЯреНрд╕, рдореИрдХ рдУрдПрд╕ 10.5), рдпрд╛ __DATA, __ la_symbol_ptr (64 рдмрд┐рдЯреНрд╕, рдпрд╛ рдореИрдХ рдУрдПрд╕ 10.6 рдФрд░ рдкреБрд░рд╛рдиреЗ) рд╣реЛ рд╕рдХрддреА рд╣реИред

рдЦрдВрдбреЛрдВ рдореЗрдВ рдЕрдиреБрднрд╛рдЧреЛрдВ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрд░рдЪрдирд╛ рд╣реИ:
 struct section { char sectname[16]; char segname[16]; uint32_t addr; uint32_t size; uint32_t offset; uint32_t align; uint32_t reloff; uint32_t nreloc; uint32_t flags; uint32_t reserved1; uint32_t reserved2; }; 

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕реЗрдЧрдореЗрдВрдЯ рдФрд░ рд╕реНрд╡рдпрдВ рд╕реЗрдХреНрд╢рди рдХрд╛ рдирд╛рдо рд╣реИ, рдЖрдХрд╛рд░, рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдСрдлрд╕реЗрдЯ, рдФрд░ рд╕реНрдореГрддрд┐ рдореЗрдВ рдкрддрд╛ рдЬрд┐рд╕ рдкрд░ рдЧрддрд┐рд╢реАрд▓ рд▓реЛрдбрд░ рдиреЗ рдЗрд╕реЗ рд░рдЦрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЦрдВрдб рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдиреНрдп рдЬрд╛рдирдХрд╛рд░реА рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:


рдореЛрдЯрд╛ рдмрд╛рдЗрдирд░реА


рдмреЗрд╢рдХ, рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐, рдЕрдкрдиреЗ рд▓рдХреНрд╖реНрдп рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ (рдореЛрдЯреЛрд░реЛрд▓рд╛ -> рдЖрдИрдмреАрдПрдо -> рдЗрдВрдЯреЗрд▓) рдХреЗ рдмрд╛рд░-рдмрд╛рд░ рд╕реБрдЪрд╛рд░реВ рд░реВрдк рд╕реЗ рдмрджрд▓рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓реЛрдВ рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдиреЗ рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХреЛрдб рдХреЗ рдХрдИ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП "рд╕реАрдЦрд╛"ред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЗрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╡рд╕рд╛ рдмрд╛рдЗрдирд░реА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпреЗ рдПрдХ рдлрд╛рдЗрд▓ рдореЗрдВ рдПрдХрддреНрд░ рдХрд┐рдП рдЧрдП рдХрдИ рдордЪ-рдУ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рд╣реЗрдбрд░ рд╡рд┐рд╢реЗрд╖ рд╣реИред рдЗрд╕рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерд┐рдд рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдФрд░ рдСрдлрд╝рд╕реЗрдЯ рдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реИред рдЗрд╕ рдСрдлрд╕реЗрдЯ рдореЗрдВ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рд╕рд╛рдорд╛рдиреНрдп рдордЪ-рдУ рд╣реИрдВред

рдпрд╣рд╛рдБ C рдореЗрдВ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
 struct fat_header { uint32_t magic; uint32_t nfat_arch; }; 

рдЬрд╣рд╛рдВ 0xCAFEBABE рдЬрд╛рджреВ рдХреЗ рддрд╣рдд рдЫрд┐рдкрд╛ рд╣реБрдЖ рд╣реИ (рдпрд╛ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд - рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рдорд╢реАрди рд╢рдмреНрджреЛрдВ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдмрд╛рдЗрдЯ рдСрд░реНрдбрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╛рдж рд░рдЦреЗрдВ)ред рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж, рддреБрд░рдВрдд nfat_arch рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░реЗрдВ:
 struct fat_arch { cpu_type_t cputype; cpu_subtype_t cpusubtype; uint32_t offset; uint32_t size; uint32_t align; }; 

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдлрд╝реАрд▓реНрдб рдирд╛рдо рдЦреБрдж рдХреЗ рд▓рд┐рдП рдмреЛрд▓рддреЗ рд╣реИрдВ: рдкреНрд░реЛрд╕реЗрд╕рд░ рдкреНрд░рдХрд╛рд░, рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдордЪ-рдУ рдХреА рдлрд╛рдЗрд▓ рдореЗрдВ рдСрдлрд╕реЗрдЯ, рдЖрдХрд╛рд░ рдФрд░ рд╕рдВрд░реЗрдЦрдгред

рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ рдХрд╛рд░реНрдпрдХреНрд░рдо


рдЖрдпрд╛рддрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо C рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд▓реЗрддреЗ рд╣реИрдВ:

рдлрд╝рд╛рдЗрд▓ test.c
 void libtest(); //from libtest.dylib int main() { libtest(); //calls puts() from libSystem.B.dylib return 0; } 


рдлрд╝рд╛рдЗрд▓ libtest.c
 #include <stdio.h> void libtest() //just a simple library function { puts("libtest: calls the original puts()"); } 

рдбрд╛рдпрдиреЗрдорд┐рдХ рд▓реЗрдЖрдЙрдЯ рдХрд╛ рдЕрдиреНрд╡реЗрд╖рдг рдХрд░реЗрдВ


рд╣рдо рдЗрдВрдЯреЗрд▓ рдкреНрд░реЛрд╕реЗрд╕рд░ рддрдХ рд╕реАрдорд┐рдд рд╣реИрдВред рд╣рдореЗрдВ рдореИрдХ рдУрдПрд╕ 10.5 рд╣реИред рдЗрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдПрдХ рдирдП Xcode рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ, (32-рдмрд┐рдЯ рд╕рдВрд╕реНрдХрд░рдг) рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ рдФрд░ рдбреАрдмрдЧ рдореЛрдб рдореЗрдВ рдЪрд▓рд╛рдПрдВ, рдЬрд╣рд╛рдВ libtest.dylib рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ libtest () рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд▓рд╛рдЗрди рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдБ libtest () рдХреЗ рд▓рд┐рдП рдХреЛрдбрд╛рдВрддрд░рдг рд╕реВрдЪреА рд╣реИ:



рдЖрдЗрдП рдПрдХ рдФрд░ рдирд┐рд░реНрджреЗрд╢ рдкрд░ рдЕрдорд▓ рдХрд░реЗрдВ:



рдФрд░ рдЙрд╕рдХреА рд╕реНрдореГрддрд┐ рдореЗрдВ рджреЗрдЦреЛ:



рдпрд╣ рдЖрдпрд╛рдд рддрд╛рд▓рд┐рдХрд╛ рдХреА рд╕реЗрд▓ рд╣реИ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕реЗрд▓ __IMPORT, __jump_table), рдЬреЛ рдбрд╛рдпрдиреЗрдорд┐рдХ рд▓реЛрдбрд░ (рдлрд╝рдВрдХреНрд╢рди __dyld_stub_binding_helper-interface) рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдкреНрд░рд┐рдВрдЧрдмреЛрд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рдпрджрд┐ рджреЗрд░ рд╕реЗ рдмрд╛рдзреНрдпрдХрд╛рд░реА (рдЖрд▓рд╕реА рдмрдВрдзрди) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╛ рд▓рдХреНрд╖реНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рддреБрд░рдВрдд рдХреВрджрддрд╛ рд╣реИред рдкреБрдЯ рдХреЗ рдмрд╛рдж рдХреА рдХреЙрд▓ рд╕реЗ рдЗрд╕рдХреА рдкреБрд╖реНрдЯрд┐ рд╣реЛрддреА рд╣реИ ():



рдФрд░ рд╕реНрдореГрддрд┐ рдореЗрдВ:



рдЗрд╕рд▓рд┐рдП, рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЧрддрд┐рд╢реАрд▓ рд▓реЛрдбрд░ рдиреЗ JMP рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдХреВрдж рдЕрдиреБрджреЗрд╢ (0xE9) рдХреЗ рд╕рд╛рде CALL рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдХреЙрд▓ рдирд┐рд░реНрджреЗрд╢ (0xE8) рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ред рдЗрд╕рд▓рд┐рдП, __jump_table рддрддреНрд╡реЛрдВ рдХреЛ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ рдХрд┐ рд╣рдо рдЙрдирдХреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕рд╛рдордЧреНрд░реА рдХреЗ рдмрдЬрд╛рдп рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╕рдорд╛рд░реЛрд╣ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд╕рдВрдХреНрд░рдордг рдХреЗ рдирд┐рд░реНрджреЗрд╢ рдХреЛ рд▓рд┐рдЦ рд╕рдХреЗрдВред

рдПрдХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рддред рдЧрддрд┐рд╢реАрд▓ рд▓реЛрдбрд░ (рдЙрд░реНрдл рд▓рд┐рдВрдХрд░) рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП JMP рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ? рд╣рд╛рдВ, рдХреНрдпреЛрдВрдХрд┐ рдХреЙрд▓, рдЬреЛ рд╕реНрдЯреИрдХ рдкрд░ рд░рд┐рдЯрд░реНрди рдПрдбреНрд░реЗрд╕ рд╕реНрдЯреЛрд░ рдХрд░рддрд╛ рд╣реИ, рд▓рд┐рдВрдХрд░ рдХреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ рдХрд┐ рдЖрдпрд╛рдд рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдХреМрди рд╕рд╛ рддрддреНрд╡ рдЗрд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░, рдЗрд╕рд▓рд┐рдП, рдЧрдгрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░рддреАрдХ рдерд╛ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ JMP рдХреЗ рд╕рд╛рде CALL рдХреЛ рдмрджрд▓рдХрд░ рдЗрд╕реЗ рд╕рдХреНрд╖рдо рдХрд░реЗрдВред

рдЕрдм рд╣рдо рдореИрдХ рдУрдПрд╕ 10.6 рдореЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд░реЗрдВрдЧреЗ рдФрд░ 32- рдФрд░ 64-рдмрд┐рдЯ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП рдлреИрдЯ рдмрд╛рдЗрдирд░реА рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВрдЧреЗред рдмрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, Xcode рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:



рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ, 64-рдмрд┐рдЯ рд╕рдВрд╕реНрдХрд░рдг рдЪрд▓рд╛рдПрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП; рд╕реНрдиреЛ рд▓реЗрдкрд░реНрдб рдкрд░ рдЖрдпрд╛рдд рддрд╛рд▓рд┐рдХрд╛ 32-рдмрд┐рдЯ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╣реЛрдЧреА) рдФрд░ рдкреБрдЯ () рдХреЙрд▓ рдкрд░ рдлрд┐рд░ рд╕реЗ рд░реБрдХ рдЬрд╛рддреА рд╣реИ:



рдФрд░ рдлрд┐рд░, рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдХреЙрд▓ред рд╣рдо рдЖрдЧреЗ рджреЗрдЦрддреЗ рд╣реИрдВ:



рдпрд╣рд╛рдВ рд╕рд╛рдорд╛рдиреНрдп __IMPORT, __jump_table рдХреЗ рд╕рд╛рде рдЕрдВрддрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИред

__TEXT, __symbol_stub1 рдореЗрдВ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред рдпрд╣ рддрд╛рд▓рд┐рдХрд╛ рдкреНрд░рддреНрдпреЗрдХ рдЖрдпрд╛рддрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП JMP рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдКрдкрд░ рдкреНрд░рд╕реНрддреБрдд рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдРрд╕рд╛ рдирд┐рд░реНрджреЗрд╢ рд╣реИред рдРрд╕рд╛ рдкреНрд░рддреНрдпреЗрдХ рдирд┐рд░реНрджреЗрд╢ __DATA, __la_symbol_ptr рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕реЗрд▓ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкрддреЗ рдкрд░ рдПрдХ рд╕рдВрдХреНрд░рдордг рдмрдирд╛рддрд╛ рд╣реИред рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдЗрд╕ рдордЪ-рдУ рдХреЗ рд▓рд┐рдП рдЖрдпрд╛рдд рддрд╛рд▓рд┐рдХрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рдЪрд▓реЛ рдЕрдзреНрдпрдпрди рдЬрд╛рд░реА рд░рдЦреЗрдВред рдпрджрд┐ рдЖрдк рдЙрд╕ рдкрддреЗ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╕рдВрдХреНрд░рдордг рд╣реЛрдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИ:



рдлрд┐рд░ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЗрдЦреЗрдВрдЧреЗ:



рд╣рдо __TEXT, __stub_helper рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдЖрддреЗ рд╣реИрдВред рдпрд╣ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ Mach-O рдХреЗ рд▓рд┐рдП рдПрдХ PLT (рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд▓рд┐рдВрдХреЗрдЬ рддрд╛рд▓рд┐рдХрд╛) рд╣реИред рдкрд╣рд▓рд╛ рдирд┐рд░реНрджреЗрд╢ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ R11 рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ LEA рд╣реИ, рдпрд╛ рдХреЛрдИ рд╕рд╛рдзрд╛рд░рдг PUSH рд╣реЛ рд╕рдХрддрд╛ рд╣реИ), рдбрд╛рдпрдиреЗрдорд┐рдХ рд▓рд┐рдВрдХрд░ рдпрд╛рдж рд░рдЦрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдкреНрд░рддреАрдХ рдХреЛ рдкреБрди: рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рджреВрд╕рд░рд╛ рдирд┐рд░реНрджреЗрд╢ рд╣рдореЗрд╢рд╛ рдПрдХ рд╣реА рдкрддреЗ рдкрд░ рдЬрд╛рддрд╛ рд╣реИ - __dyld_stub_binding_helper рдлрд╝рдВрдХреНрд╢рди рдХреА рд╢реБрд░реБрдЖрдд, рдЬреЛ рдмрд╛рдзреНрдпрдХрд╛рд░реА рдХреЛ рд╕рдВрднрд╛рд▓ рд▓реЗрдЧрд╛ :



рдбрд╛рдпрдиреЗрдорд┐рдХ рд▓рд┐рдВрдХрд░ рдкреБрдЯ рдХреЗ рд▓рд┐рдП рд░рд┐рд▓реЛрдХреЗрд╢рди рдХрд░рддрд╛ рд╣реИ (), __DATA рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рд╕реЗрд▓, __la_symbol_ptr рдЬреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛:



рдФрд░ рдпрд╣ libSystem.B.dylib рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдкреБрдЯ () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрддрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рдЗрд╕реЗ рдХреБрдЫ рдкрддреЗ рдХреЗ рд╕рд╛рде рдмрджрд▓рдиреЗ рдкрд░, рд╣рдореЗрдВ рдХреЙрд▓ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╡рд╛рдВрдЫрд┐рдд рдкреНрд░рднрд╛рд╡ рдорд┐рд▓рддрд╛ рд╣реИред

So. рдЗрд╕ рд╕реНрддрд░ рдкрд░, рд╣рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдЧрддрд┐рд╢реАрд▓ рд▓рд┐рдВрдХрд┐рдВрдЧ рдХреИрд╕реЗ рд╣реЛрддреА рд╣реИ, рдордЪ-рдУ рдореЗрдВ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдпрд╛рдд рддрд╛рд▓рд┐рдХрд╛рдУрдВ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рд╡реЗ рдХрд┐рди рддрддреНрд╡реЛрдВ рд╕реЗ рдпреБрдХреНрдд рд╣реЛрддреЗ рд╣реИрдВред рдЕрдм рдордЪ-рдУ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЙрддрд░реЛ!

рдПрдХ рдЖрдпрд╛рдд рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдПрдХ рдЖрдЗрдЯрдо рдХреЗ рд▓рд┐рдП рдЦреЛрдЬреЗрдВ


рдкреНрд░рддреАрдХ рдХреЗ рдирд╛рдо рд╕реЗ рдЖрдпрд╛рдд рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рд╕реЗрд▓ рдХреЛ рдЦреЛрдЬрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЗрд╕ рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреБрдЫ рд╣рдж рддрдХ nontrivial рд╣реИред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдЪрд░рд┐рддреНрд░ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╣реА рдЪрд░рд┐рддреНрд░ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рдПрдХ рд╕рд░рдгреА рд╣реИ:
 struct nlist { union { int32_t n_strx; } n_un; uint8_t n_type; uint8_t n_sect; int16_t n_desc; uint32_t n_value; }; 

рдЬрд╣рд╛рдВ n_un.n_strx рдЗрд╕ рдЪрд░рд┐рддреНрд░ рдХреЗ рдирд╛рдо рдХреА рд╕реНрдЯреНрд░рд┐рдВрдЧ рддрд╛рд▓рд┐рдХрд╛ рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рдСрдлрд╕реЗрдЯ рд╣реИред рдмрд╛рдХреА рдкреНрд░рддреАрдХреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░, рдЬрд┐рд╕ рдЦрдВрдб рдореЗрдВ рдпрд╣ рд╕реНрдерд┐рдд рд╣реИ, рдФрд░ рдЗрд╕реА рддрд░рд╣ рдХреА рдЪрд┐рдВрддрд╛ рдХрд░рддрд╛ рд╣реИред рдПрдХ рд╢рдмреНрдж рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп libtest.dylib (32-рдмрд┐рдЯ рд╕рдВрд╕реНрдХрд░рдг) рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрдВрддрд┐рдо рддрддреНрд╡ рдпрд╣рд╛рдВ рджрд┐рдП рдЧрдП рд╣реИрдВ:



рдПрдХ рдкрдВрдХреНрддрд┐ рддрд╛рд▓рд┐рдХрд╛ рдирд╛рдореЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рд╢реВрдиреНрдп рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддреА рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рдХ рдкреНрд░рддреНрдпреЗрдХ рдирд╛рдо рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЕрдВрдбрд░рд╕реНрдХреЛрд░ "_" рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "рдкреБрдЯ" рдирд╛рдо рд╕реНрдЯреНрд░рд┐рдВрдЧ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ "_puts" рдЬреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛ред

рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:


рдЖрдк рд╕рдВрдмрдВрдзрд┐рдд рд▓реЛрдб рдХрдорд╛рдВрдб (LC_SYMTAB) рд╕реЗ рд╡рд░реНрдгреЛрдВ рдФрд░ рддрд╛рд░ рдХреА рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ:



рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкреНрд░рддреАрдХ рддрд╛рд▓рд┐рдХрд╛ рдПрдХ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИред рдЗрд╕рдореЗрдВ рдХрдИ рдЦрдВрдб рд╣реИрдВред рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реБрдЪрд┐ рд╣реИ - рдпреЗ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд (рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд) рд╡рд░реНрдг рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН, рдЬреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реБрдП рд╣реИрдВред рд╡реИрд╕реЗ, MachOView рдПрдХ рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рд╕рд╛рде рдЙрди рдкрд░ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓рд╛ рдЧрдпрд╛ред рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдкреНрд░рддреАрдХ рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдХреМрди рд╕рд╛ рднрд╛рдЧ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░рддреАрдХреЛрдВ рдХрд╛ рд╕рдмрд╕реЗрдЯ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ, рдЖрдкрдХреЛ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рддреАрдХ рд▓реЛрдбрд┐рдВрдЧ рдХрдорд╛рдВрдб (LC_DYSYMTAB) рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:



рдпрд╣рд╛рдБ рд╕реА рдореЗрдВ рдЙрд╕рдХреА рдкреНрд░рд╕реНрддреБрддрд┐ рд╣реИ:
 struct dysymtab_command { uint32_t cmd; uint32_t cmdsize; uint32_t ilocalsym; uint32_t nlocalsym; uint32_t iextdefsym; uint32_t nextdefsym; uint32_t iundefsym; uint32_t nundefsym; uint32_t tocoff; uint32_t ntoc; uint32_t modtaboff; uint32_t nmodtab; uint32_t extrefsymoff; uint32_t nextrefsyms; uint32_t indirectsymoff; uint32_t nindirectsyms; uint32_t extreloff; uint32_t nextrel; uint32_t locreloff; uint32_t nlocrel; }; 
рдпрд╣рд╛рдБ dysymtab_command.iundefsym рд╡рд░реНрдг рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕реВрдЪрдХрд╛рдВрдХ рд╣реИ, рдЬреЛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡рд░реНрдгреЛрдВ рдХреЗ рд╕рдмрд╕реЗрдЯ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред dysymtab_command.nundefsym - рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡рд░реНрдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ред рдЪреВрдБрдХрд┐ рд╣рдо рдЬреЛ рдЦреЛрдЬ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рдПрдХ рдЬрд╛рдирдмреВрдЭрдХрд░ рдЕрдирд┐рд╢реНрдЪрд┐рддрдХрд╛рд▓реАрди рдкреНрд░рддреАрдХ рд╣реИ, рд╣рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдХреЗрд╡рд▓ рдкреНрд░рддреАрдХ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЦреЛрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдФрд░ рдЕрдм, рдПрдХ рдмрд╣реБрдд рд╣реА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ: рдЗрд╕рдХреЗ рдирд╛рдо рд╕реЗ рдПрдХ рдкреНрд░рддреАрдХ рдЦреЛрдЬрдирд╛, рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╢реБрд░реБрдЖрдд рд╕реЗ рд╣реА рдкреНрд░рддреАрдХ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЗрд╕рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рдпрд╛рдж рд░рдЦрдирд╛ред рдЪреВрдВрдХрд┐ рдЗрди рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреЗ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдорд╛рди рдПрдХ рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рддрд╛рд▓рд┐рдХрд╛ рд╣реИрдВ - рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдкреНрд░рддреАрдХреЛрдВ рдХреА рдПрдХ рддрд╛рд▓рд┐рдХрд╛ред рдЖрдк рдЗрд╕реЗ dysymtab_command.indirectsymoff рдХреЗ рдорд╛рди рд╕реЗ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ dysymtab_command.nindirects рдЬрд┐рдо рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреА рд╣реИред

рд╣рдорд╛рд░реЗ рддреБрдЪреНрдЫ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рддрддреНрд╡ рд╢рд╛рдорд┐рд▓ рд╣реИ (рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдореЗрдВ рдФрд░ рднреА рдмрд╣реБрдд рдХреБрдЫ рд╣реИрдВ):



рдФрд░ рдЕрдВрдд рдореЗрдВ, __IMPORT, __jump_table рд╕реЗрдХреНрд╢рди рдХреЛ рджреЗрдЦреЗрдВ, рдЬрд┐рд╕рдХреЗ рдХреБрдЫ рддрддреНрд╡ рд╣рдореЗрдВ рдЕрдВрдд рдореЗрдВ рдЦреЛрдЬрдиреЗ рд╣реЛрдВрдЧреЗред рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:



рдЗрд╕ рдЕрдиреБрднрд╛рдЧ рдХреЗ рд▓рд┐рдП рдЕрдиреБрднрд╛рдЧ .reserved1 рдлрд╝реАрд▓реНрдб рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ (MachOView рдиреЗ рдЗрд╕реЗ Indirect Sym Index рдХрд╣рд╛ рд╣реИ)ред рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдкреНрд░рддреАрдХ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдПрдХ рд╕реВрдЪрдХрд╛рдВрдХ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ __jump_table рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ-рд╕реЗ-рдПрдХ рдкрддреНрд░рд╛рдЪрд╛рд░ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рдФрд░ рд╣рдореЗрдВ рдпрд╛рдж рд╣реИ рдХрд┐ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдкреНрд░рддреАрдХ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рддрддреНрд╡ рдкреНрд░рддреАрдХ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕реВрдЪрдХ рд╣реИрдВред рдкрдХрдбрд╝реЛ рдореБрдЭреЗ рдХреНрдпрд╛ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ?

рд▓реЗрдХрд┐рди, рддрд╕реНрд╡реАрд░ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреНрдЮрд╛рди рдХреЗ рд╕рднреА рдЯреБрдХрдбрд╝реЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП рд╕реНрдиреЛ рд▓реЗрдкрд░реНрдб рдХреА рд╕реНрдерд┐рддрд┐ рдкрд░ рдПрдХ рддреНрд╡рд░рд┐рдд рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ, рдЬрд╣рд╛рдВ __DATA, __la_symbol_ptr рдЖрдпрд╛рдд рддрд╛рд▓рд┐рдХрд╛ рдХреА рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдорддрднреЗрдж рдмрд╣реБрдд рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИрдВред

рдпрд╣рд╛рдБ рдЪрд░рд┐рддреНрд░ рд▓реЛрдбрд┐рдВрдЧ рдХрдорд╛рдВрдб рд╣реИ:



рдФрд░ рдпрд╣рд╛рдБ рдЙрд╕рдХреЗ рдЕрдВрддрд┐рдо рддрддреНрд╡ рд╣реИрдВ:



рджреЛ рдЕрд╕реНрдкрд╖реНрдЯ рдЕрдХреНрд╖рд░ рдПрдХ рдиреАрд▓реЗ рд░рдВрдЧ рдХреА рдкреГрд╖реНрдарднреВрдорд┐ рдкрд░ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ, рдЬреЛ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рддреАрдХ рд▓реЛрдб рдХрдорд╛рдВрдб (LC_DYSYMTAB) рд╕реЗ рдбреЗрдЯрд╛ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИ:



рдФрд░ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдкреНрд░рддреАрдХреЛрдВ рдХреА рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рддрддреНрд╡ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЪрд╛рд░:



рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрджрд┐ рдЖрдк рдХрд╝реАрдорддреА рдЦрдВрдб __la_symbol_ptr рдХреЗ рдЖрд░рдХреНрд╖рд┐рдд 1 рдлрд╝реАрд▓реНрдб рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдкреНрд░рддреАрдХреЛрдВ рдХреА рддрд╛рд▓рд┐рдХрд╛ рдкрд░ рдЗрд╕рдХреЗ рддрддреНрд╡реЛрдВ рдХрд╛ рдПрдХ-рд╕реЗ-рдПрдХ рдкреНрд░рддрд┐рдмрд┐рдВрдм рдЕрдВрддрд┐рдо рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рд╢реБрд░реВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЪреМрдереЗ рддрддреНрд╡ (рд╕реВрдЪрдХрд╛рдВрдХ 3) рд╕реЗ рд╣реИ:



рдЖрдпрд╛рдд рддрд╛рд▓рд┐рдХрд╛ рдХреА рдмрд╣реБрдд рд╕рд╛рд░реА рд╕рд╛рдордЧреНрд░реА рдЬреЛ __la_symbol_ptr рдЦрдВрдб рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреА рд╣реИ:



рдордЪ-рдУ рдХреА рдЗрди рд╕рднреА рд╕реВрдХреНрд╖реНрдорддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдЖрдпрд╛рдд рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рдЖрдЗрдЯрдо рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рддреИрдпрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо


рд╣рдо рдХреЛрдб рдХреЗ рдмрд╛рдж рд╕реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВрдЧреЗ, рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рдкреНрд░рдЪреБрд░рддрд╛ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдЗрддрдирд╛ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:
  1. рд╣рдо LC_SYMTAB рд▓реЛрдб рдХрдорд╛рдВрдб рдХреЗ рдбреЗрдЯрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╡рд░реНрдгреЛрдВ рдФрд░ рд░реЗрдЦрд╛рдУрдВ рдХреА рддрд╛рд▓рд┐рдХрд╛ рдкрд╛рддреЗ рд╣реИрдВред
  2. рд╣рдо LC_DYSYMTAB рдмреВрдЯ рдХрдорд╛рдВрдб рд╕реЗ рд╕реАрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рддреАрдХ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдХрд┐рд╕ рддрддреНрд╡ рдХреЗ рд╕рд╛рде рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░рддреАрдХреЛрдВ рдХрд╛ рд╕рдмрд╕реЗрдЯ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ (iundefsym рдлрд╝реАрд▓реНрдб)ред
  3. рд╣рдо рдЪрд░рд┐рддреНрд░ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡рд░реНрдгреЛрдВ рдХреЗ рд╕рдмрд╕реЗрдЯ рдХреЗ рдмреАрдЪ рдирд╛рдо рд╕реЗ рдПрдХ рд▓рдХреНрд╖рд┐рдд рд╡рд░реНрдг рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
  4. рд╣рдо рдкреНрд░рддреАрдХ рддрд╛рд▓рд┐рдХрд╛ рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рд▓рдХреНрд╖реНрдп рдкреНрд░рддреАрдХ рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВред
  5. рд╣рдо LC_DYSYMTAB рд▓реЛрдб рдХрдорд╛рдВрдб (рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд░реВрдк рд╕реЗ рдлрд╝реАрд▓реНрдб) рд╕реЗ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдкреНрд░рддреАрдХреЛрдВ рдХреА рддрд╛рд▓рд┐рдХрд╛ рдкрд╛рддреЗ рд╣реИрдВред
  6. рд╣рдо рдЙрд╕ рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕рд╕реЗ рдЖрдпрд╛рдд рддрд╛рд▓рд┐рдХрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдиреЗ рд▓рдЧрддреА рд╣реИ (рдкрд░реЛрдХреНрд╖ рдкреНрд░рддреАрдХ рддрд╛рд▓рд┐рдХрд╛ (рдЖрд░рдХреНрд╖рд┐рдд 1 рдХреНрд╖реЗрддреНрд░) рдкрд░ (__DATA рдХреА рд╕рд╛рдордЧреНрд░реА, __la_symbol_ptr рдЕрдиреБрднрд╛рдЧ (рдпрд╛ __IMPORT, __jump_table - рдПрдХ рдмрд╛рдд рд╣реЛрдЧреА))ред
  7. рдЗрд╕ рд╕реВрдЪрдХрд╛рдВрдХ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдкреНрд░рддреАрдХ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕рдореЗрдВ рдЙрд╕ рдореВрд▓реНрдп рдХреА рддрд▓рд╛рд╢ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдкреНрд░рддреАрдХ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд▓рдХреНрд╖реНрдп рдЪрд┐рд╣реНрди рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред
  8. рд╣рдореЗрдВ рдпрд╛рдж рд╣реИ рдХрд┐ рдХреИрд╕реЗ, рд╢реБрд░реБрдЖрдд рд╕реЗ, рдЬрдм рдЖрдпрд╛рдд рддрд╛рд▓рд┐рдХрд╛ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдкреНрд░рддреАрдХ рддрд╛рд▓рд┐рдХрд╛ рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреА рдЧрдИ рдереА, рддреЛ рд▓рдХреНрд╖реНрдп рдкреНрд░рддреАрдХ рдкрдХрдбрд╝рд╛ рдЧрдпрд╛ред рд╕рдВрдЧреНрд░рд╣реАрдд рдорд╛рди рдЖрдпрд╛рдд рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рдЖрдЗрдЯрдо рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рд╣реИред
  9. __La_symbol_ptr (рдпрд╛ __jump_table) рдЕрдиреБрднрд╛рдЧ рдХреЗ рдбреЗрдЯрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╣рдо рдЖрдпрд╛рдд рддрд╛рд▓рд┐рдХрд╛ (рдСрдлрд╝рд╕реЗрдЯ рдлрд╝реАрд▓реНрдб) рдкрд╛рддреЗ рд╣реИрдВред
  10. рдЗрд╕рдореЗрдВ рд▓рдХреНрд╖реНрдп рддрддреНрд╡ рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдкрддреЗ рдХреЛ (__la_symbol_ptr рдХреЗ рд▓рд┐рдП) рдЙрд╕ рдорд╛рди рдХреЛ рдкреБрди: рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдпрд╛ CALL / JMP рдирд┐рд░реНрджреЗрд╢ рдХреЛ JMP рдХреЛ рдСрдкрд░реЗрдВрдб рдХреЗ рд╕рд╛рде рдмрджрд▓реЗрдВ - рд╣рдореЗрдВ рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрддрд╛ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (__jump_table рдХреЗ рд▓рд┐рдП))ред
рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд▓реЛрдб рдХрд░рдХреЗ рд╡рд░реНрдгреЛрдВ, рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдФрд░ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд░реНрдгреЛрдВ рдХреА рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдФрд░ рдЖрдпрд╛рдд рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрднрд╛рдЧреЛрдВ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдЦреБрдж рдХреЛ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдореГрддрд┐ рдореЗрдВред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЪрд░рд┐рддреНрд░ рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЯреЗрдмрд▓ рд▓рдХреНрд╖реНрдп рдордЪ-рдУ рдореЗрдВ рдЪреАрдЬреЛрдВ рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реНрдерд┐рддрд┐ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдЦрд┐рд░рдХрд╛рд░, рдбрд╛рдпрдиреЗрдорд┐рдХ рд▓реЛрдбрд░ рдиреЗ рд╣рдорд╛рд░реЗ рд╕рд╛рдордиреЗ рдХрд╛рдо рдХрд┐рдпрд╛ рдФрд░ рдЦреБрдж рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд╕рд╣реЗрдЬрд╛, рдмрд┐рдирд╛ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рд░рдЦреЗред

рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рдпрд╣ рдЖрдкрдХреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдХреЛрдб рдореЗрдВ рдмрджрд▓рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рди рдХреЗ рд╕рд╛рде рдЖрд╡рд╢реНрдпрдХ рдордЪ-рдУ рддрддреНрд╡реЛрдВ рдХреА рдЦреЛрдЬ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкреВрд░реЗ рдСрдкрд░реЗрд╢рди рдХреЛ рддреАрди рдЪрд░рдгреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
  1.  void *mach_hook_init(char const *library_filename, void const *library_address); 
    рдордЪ-рдУ рдлрд╛рдЗрд▓ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдФрд░ рд╕реНрдореГрддрд┐ рдореЗрдВ рдЗрд╕рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдкрд╛рд░рджрд░реНрд╢реА рд╡рд┐рд╡рд░рдгрдХ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдкреАрдЫреЗ рдЖрдпрд╛рдд рддрд╛рд▓рд┐рдХрд╛, рд╡рд░реНрдгреЛрдВ рдХреА рддрд╛рд▓рд┐рдХрд╛, рд░реЗрдЦрд╛рдПрдБ рдФрд░ рдЧрддрд┐рд╢реАрд▓ рд╡рд░реНрдгреЛрдВ рдХреА рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд░реНрдгреЛрдВ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдХрдИ рдЙрдкрдпреЛрдЧреА рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛рдПрдБ рд╣реИрдВред рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдХреЗред рдпрд╣рд╛рдБ рдпрд╣ рд╡рд░реНрдгрдирдХрд░реНрддрд╛ рд╣реИ:
     struct mach_hook_handle { void const *library_address; //base address of a library in memory char const *string_table; //buffer to read string_table table from file struct nlist const *symbol_table; //buffer to read symbol table from file uint32_t const *indirect_table; //buffer to read the indirect symbol table in dynamic symbol table from file uint32_t undefined_symbols_count; //number of undefined symbols in the symbol table uint32_t undefined_symbols_index; //position of undefined symbols in the symbol table uint32_t indirect_symbols_count; //number of indirect symbols in the indirect symbol table of DYSYMTAB uint32_t indirect_symbols_index; //index of the first imported symbol in the indirect symbol table of DYSYMTAB uint32_t import_table_offset; //the offset of (__DATA, __la_symbol_ptr) or (__IMPORT, __jump_table) uint32_t jump_table_present; //special flag to show if we work with (__IMPORT, __jump_table) }; 
  2.  mach_substitution mach_hook(void const *handle, char const *function_name, mach_substitution substitution); 
    рдЙрдкрд▓рдмреНрдз рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди, рд▓рдХреНрд╖реНрдп рдкреНрд░рддреАрдХ рдХрд╛ рдирд╛рдо рдФрд░ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░ рдХрд╛ рдкрддрд╛, рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╣реА рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд░рддрд╛ рд╣реИред
  3.  void mach_hook_free(void *handle); 
    рдпрд╣ рдХрд┐рд╕реА рднреА рд╣реИрдВрдбрд▓ рдХреЛ рд╕рд╛рдл рдХрд░рддрд╛ рд╣реИ рдЬреЛ mach_hook_init () рд▓реМрдЯрд╛рддрд╛ рд╣реИред

рдЗрди рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдкреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛:
 #include <stdio.h> #include <dlfcn.h> #include "mach_hook.h" #define LIBTEST_PATH "libtest.dylib" void libtest(); //from libtest.dylib int hooked_puts(char const *s) { puts(s); //calls the original puts() from libSystem.B.dylib, because our main executable module called "test" remains intact return puts("HOOKED!"); } int main() { void *handle = 0; //handle to store hook-related info mach_substitution original; //original data for restoration Dl_info info; if (!dladdr((void const *)libtest, &info)) //gets an address of a library which contains libtest() function { fprintf(stderr, "Failed to get the base address of a library!\n", LIBTEST_PATH); goto end; } handle = mach_hook_init(LIBTEST_PATH, info.dli_fbase); if (!handle) { fprintf(stderr, "Redirection init failed!\n"); goto end; } libtest(); //calls puts() from libSystem.B.dylib puts("-----------------------------"); original = mach_hook(handle, "puts", (mach_substitution)hooked_puts); if (!original) { fprintf(stderr, "Redirection failed!\n"); goto end; } libtest(); //calls hooked_puts() puts("-----------------------------"); original = mach_hook(handle, "puts", original); //restores the original relocation if (!original) { fprintf(stderr, "Restoration failed!\n"); goto end; } libtest(); //again calls puts() from libSystem.B.dylib end: mach_hook_free(handle); handle = 0; //no effect here, but just a good advice to prevent double freeing return 0; } 

рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдФрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЗ рдХрд╛ рдкреВрд░реНрдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдбрд╛рдЙрдирд▓реЛрдб рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИред

рдЯреЗрд╕реНрдЯ рд░рди


рдФрд░ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЛ:
 user@mac$ arch -i386 ./test libtest: calls the original puts() ----------------------------- libtest: calls the original puts() HOOKED! ----------------------------- libtest: calls the original puts() 

 user@mac$ arch -x86_64 ./test libtest: calls the original puts() ----------------------------- libtest: calls the original puts() HOOKED! ----------------------------- libtest: calls the original puts() 

рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рд╕рдорд╛рдкрди рдмрд╣реБрдд рд╢реБрд░реБрдЖрдд рдореЗрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдп рдХреА рдкреВрд░реНрдг рдкреВрд░реНрддрд┐ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред

рдЙрдкрдпреЛрдЧреА рд▓рд┐рдВрдХ

рд╕реМрднрд╛рдЧреНрдп рд╣реИ

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


All Articles