рд╕рд╛рдЭрд╛ рдИрдПрд▓рдПрдл рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рди

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



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







рдмреЗрд╢рдХ, рд╢рд╛рдпрдж рд╣реА рдХрднреА рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЦреБрдж рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд рдкреНрд░реЛрд╕реЗрд╕рд░ рдФрд░ рдореЗрдореЛрд░реА рдХреА рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХреНрд╖рдорддрд╛ред рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпрд╛, рдХрдо рд╕реЗ рдХрдо, рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, C \ C ++ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдорд╛рдирдХ C \ C ++ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд╡реИрд╕реЗ, рдмрд╛рдж рдореЗрдВ рдПрдХ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд░рдЪрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рднреА рдЖрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (libc.so рдФрд░ libstdc ++ред рддреЛ)ред рд╡реЗ рд╕реНрд╡рдпрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рд╛рд░реВрдк рдХреА рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВред рдореЗрд░рд╛ рд╢реЛрдз рд▓рд┐рдирдХреНрд╕ рдХреЗ рд▓рд┐рдП рдерд╛, рдЬрд┐рд╕рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЬреБрдбрд╝реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдкреНрд░рд╛рд░реВрдк рдИрдПрд▓рдПрдл (рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдФрд░ рд▓рд┐рдВрдХ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдкреНрд░рд╛рд░реВрдк) рд╣реИред

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



рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ



рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВред рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ C рднрд╛рд╖рд╛ (рдлрд╝рд╛рдЗрд▓ test.c) рдореЗрдВ "рдкрд░реАрдХреНрд╖рдг" рдирд╛рдордХ рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реИ рдФрд░ рджреЛ рд╕рд╛рдЭрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп (рдлрд╛рдЗрд▓реЗрдВ libtest1.c рдФрд░ libtest2.c) рд╕рдорд╛рди рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВред рдпреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреНрд░рдорд╢рдГ рдПрдХ рдХрд╛рд░реНрдп рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ: libtest1 () рдФрд░ libtest2 (), рдХреНрд░рдорд╢рдГред рдЙрдирдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рд╕реА рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рдкреБрдЯ () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред







рдХрд╛рд░реНрдп рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

  1. рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо (рдЯреЗрд╕реНрдЯ.c рдлрд╝рд╛рдЗрд▓) рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ_рдкреБрдЯреНрд╕ () рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рд╕рд╛рде рджреЛрдиреЛрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдкреБрдЯ () рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЛ рдмрджрд▓рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЬреЛ рдореВрд▓ рдкреБрдЯ () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ;





  2. рдХрд┐рдП рдЧрдП рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВ, рдЕрд░реНрдерд╛рддреН, рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ libtest1 () рдФрд░ libtest2 () рдХреЗ рд▓рд┐рдП рдмрд╛рд░-рдмрд╛рд░ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдореВрд▓ рдкреБрдЯ () рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред







рдЙрд╕реА рд╕рдордп, рдХреЛрдб рдХреЛ рдмрджрд▓рдирд╛ рдпрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ, рдХреЗрд╡рд▓ рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдоред



рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ?



рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХреА рджреЛ рдмрд╣реБрдд рд╣реА рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ:

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

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдХрд╛рдиреВрдиреА рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рдПрдХрдорд╛рддреНрд░ рд╡рд┐рдХрд▓реНрдк рдИрдПрд▓рдПрдл рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдФрд░ рд╕реНрдореГрддрд┐ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдирд╛ рд╣реИред



рдЪрд▓реЛ рдЪрд▓рддреЗ рд╣реИрдВ!



рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдИрдПрд▓рдПрдл рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ



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



рдлрд╝рд╛рдЗрд▓ test.c


#include <stdio.h> #include <dlfcn.h> #define LIBTEST1_PATH "libtest1.so" //position dependent code (for 32 bit only) #define LIBTEST2_PATH "libtest2.so" //position independent code void libtest1(); //from libtest1.so void libtest2(); //from libtest2.so int main() { void *handle1 = dlopen(LIBTEST1_PATH, RTLD_LAZY); void *handle2 = dlopen(LIBTEST2_PATH, RTLD_LAZY); if (NULL == handle1 || NULL == handle2) fprintf(stderr, "Failed to open \"%s\" or \"%s\"!\n", LIBTEST1_PATH, LIBTEST2_PATH); libtest1(); //calls puts() from libc.so twice libtest2(); //calls puts() from libc.so twice puts("-----------------------------"); dlclose(handle1); dlclose(handle2); return 0; }
      
      





рдлрд╝рд╛рдЗрд▓ libtest1.c


 int puts(char const *); void libtest1() { puts("libtest1: 1st call to the original puts()"); puts("libtest1: 2nd call to the original puts()"); }
      
      





рдлрд╝рд╛рдЗрд▓ libtest2.c


 int puts(char const *); void libtest2() { puts("libtest2: 1st call to the original puts()"); puts("libtest2: 2nd call to the original puts()"); }
      
      





ELF рдХреЗ рднрд╛рдЧ рдХреНрдпрд╛ рд╣реИрдВ?



рдЗрд╕ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдРрд╕реА рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрджрд░ рджреЗрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдРрд╕реА рдЙрдкрдпреЛрдЧрд┐рддрд╛рдПрдБ рд╣реИрдВ:

рд░рд┐рд▓реЛрдХреЗрд╢рди рдПрдХ рдИрдПрд▓рдПрдл рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЙрд╕ рдЬрдЧрд╣ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╢рдмреНрдж рд╣реИ рдЬреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдореЙрдбреНрдпреВрд▓ рдХреЗ рдПрдХ рдЪрд░рд┐рддреНрд░ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред рдРрд╕реЗ рд╕реНрдерд╛рдиреЛрдВ рдХрд╛ рдкреНрд░рддреНрдпрдХреНрд╖ рд╕рдВрд╢реЛрдзрди рд╕реНрдереИрддрд┐рдХ (ld) рдпрд╛ рдЧрддрд┐рд╢реАрд▓ (ld-linux.so.2) рд▓рд┐рдВрдХрд░ рдХреЗ рд▓реЛрдбрд░ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред



рдХреЛрдИ рднреА ELF рдлрд╛рдЗрд▓ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╣реЗрдбрд░ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИред рдЗрд╕рдХреА рд╕рдВрд░рдЪрдирд╛, рд╕рд╛рде рд╣реА рдХрдИ рдЕрдиреНрдп рдИрдПрд▓рдПрдл рддрддреНрд╡реЛрдВ рдХрд╛ рд╡рд░реНрдгрди, /usr/include/linux/elf.h рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣реЗрдбрд░ рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдлрд╝реАрд▓реНрдб рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕реЗрдХреНрд╢рди рд╣реЗрдбрд░ рдЯреЗрдмрд▓ рдлрд╝рд╛рдЗрд▓ рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рдСрдлрд╕реЗрдЯ рд░рд┐рдХреЙрд░реНрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдИрдПрд▓рдПрдл рдореЗрдВ рдПрдХ рдЕрдиреБрднрд╛рдЧ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред рдПрдХ рдЦрдВрдб рдПрдХ рдИрдПрд▓рдПрдл рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рдмрд╕реЗ рдЫреЛрдЯрд╛ рдЕрд╡рд┐рднрд╛рдЬреНрдп рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рддрддреНрд╡ рд╣реИред рдореЗрдореЛрд░реА рдореЗрдВ рд▓реЛрдб рдХрд░рддреЗ рд╕рдордп, рд╡рд░реНрдЧреЛрдВ рдХреЛ рдЦрдВрдбреЛрдВ рдореЗрдВ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЦрдВрдб рдПрдХ ELF рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рдмрд╕реЗ рдЫреЛрдЯреЗ рдЕрд╡рд┐рднрд╛рдЬреНрдп рднрд╛рдЧ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд▓реЛрдбрд░ (ld-linux.so.2) рджреНрд╡рд╛рд░рд╛ рдореЗрдореЛрд░реА рдореЗрдВ рдореИрдк рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕реЗрдЧрдореЗрдВрдЯ рд╕реЗрдЧрдореЗрдВрдЯ рдХреА рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреА рдСрдлрд╕реЗрдЯ рдИрдПрд▓рдПрдл рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╣реЗрдбрд░ рдореЗрдВ рднреА рд╣реЛрддреА рд╣реИред







рдЙрдирдореЗрдВ рд╕реЗ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВ:

рдЙрдкрд░реЛрдХреНрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:

 gcc -g3 -m32 -shared -o libtest1.so libtest1.c gcc -g3 -m32 -fPIC -shared -o libtest2.so libtest2.c gcc -g3 -m32 -L$PWD -o test test.c -ltest1 -ltest2 тАУldl
      
      





рдкрд╣рд▓рд╛ рдХрдорд╛рдВрдб рдбрд╛рдпрдиреЗрдорд┐рдХ рд▓рд┐рдВрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА libtest1.so рдмрдирд╛рддрд╛ рд╣реИред рджреВрд╕рд░рд╛ рд╣реИ libtest2.soред тАУFPIC рд╕реНрд╡рд┐рдЪ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред рдпрд╣ рд╕рдВрдХрд▓рдХ рдХреЛ рддрдерд╛рдХрдерд┐рдд рд╕реНрдерд┐рддрд┐ рд╕реНрд╡рддрдВрддреНрд░ рдХреЛрдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИред рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ рд╡рд┐рд╡рд░рдгред рддреАрд╕рд░рд╛ рдХрдорд╛рдВрдб Test.c рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдХреЗ рдкрд╣рд▓реЗ рд╕реЗ рдмрдирд╛рдП рдЧрдП libtest1.so рдФрд░ libtest2.so рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕рд╛рде рд▓рд┐рдВрдХ рдХрд░рдХреЗ рдПрдХ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рддрд╛ рд╣реИред рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рд╡рд░реНрддрдорд╛рди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ -L $ PWD рд╕реНрд╡рд┐рдЪ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рд▓рдХреНрд╖рд┐рдд рд╣реЛрддрд╛ рд╣реИред Dlopen () рдФрд░ dlclose () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП libdl.so рдХреЗ рд╕рд╛рде рд▓рд┐рдВрдХ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред



рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдорд╛рдВрдб рдЪрд▓рд╛рдиреЗ рд╣реЛрдВрдЧреЗ:

 export LD_LIBRARY_PATH=$PWD:$LD_LIBRARY_PATH ./test
      
      





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



libtest1: 1st call to the original puts()

libtest1: 2nd call to the original puts()

libtest2: 1st call to the original puts()

libtest2: 2nd call to the original puts()

-----------------------------







рдЕрдм рдЖрдЗрдП рдкрд░реАрдХреНрд╖рдг рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╡рд░реНрдЧреЛрдВ рдХреЛ рджреЗрдЦреЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, -a рд╕реНрд╡рд┐рдЪ рдХреЗ рд╕рд╛рде рдЖрд╕рд╛рдиреА рд╕реЗ рдЪрд▓рд╛рдПрдБред рдЙрдирдореЗрдВ рд╕реЗ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдиреАрдЪреЗ рд╕реВрдЪреАрдмрджреНрдз рд╣реИрдВ:



ELF Header:

Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00

Class: ELF32

Data: 2's complement, little endian

Version: 1 (current)

OS/ABI: UNIX - System V

ABI Version: 0

Type: EXEC (Executable file)

Machine: Intel 80386

Version: 0x1

Entry point address: 0x8048580

Start of program headers: 52 (bytes into file)

Start of section headers: 21256 (bytes into file)

Flags: 0x0

Size of this header: 52 (bytes)

Size of program headers: 32 (bytes)

Number of program headers: 8

Size of section headers: 40 (bytes)

Number of section headers: 39

Section header string table index: 36







рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рд╣реЗрдбрд░ред рдкрд╣рд▓реЗ 16 рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рдЬрд╛рджреВ рдХрд╛ рдХреНрд░рдоред рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдкреНрд░рдХрд╛рд░ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп, рдФрд░ рднреА рдСрдмреНрдЬреЗрдХреНрдЯ (.o) рдФрд░ рд╕рд╛рдЭрд╛ (.so), рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ (i386), рдЕрдиреБрд╢рдВрд╕рд┐рдд рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдВрджреБ, рд╕реЗрдЧрдореЗрдВрдЯ рдХреЗ рд╣реЗрдбрд░ рдФрд░ рд╕реЗрдХреНрд╢рди рдФрд░ рдЙрдирдХреЗ рдЖрдХрд╛рд░ рдЗрдВрдЧрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдмрд╣реБрдд рдЕрдВрдд рдореЗрдВ - рдЕрдиреБрднрд╛рдЧ рдирд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдСрдлрд╕реЗрдЯред



Section Headers:

[Nr] Name Type Addr Off Size ES Flg Lk Inf Al

[ 0] NULL 00000000 000000 000000 00 0 0 0

[ 1] .interp PROGBITS 08048134 000134 000013 00 A 0 0 1

...

[ 5] .dynsym DYNSYM 08048200 000200 000110 10 A 6 1 4

[ 6] .dynstr STRTAB 08048310 000310 0000df 00 A 0 0 1

...

[ 9] .rel.dyn REL 08048464 000464 000010 08 A 5 0 4

[10] .rel.plt REL 08048474 000474 000040 08 A 5 12 4

[11] .init PROGBITS 080484b4 0004b4 000030 00 AX 0 0 4

[12] .plt PROGBITS 080484e4 0004e4 000090 04 AX 0 0 4

[13] .text PROGBITS 08048580 000580 0001fc 00 AX 0 0 16

[14] .fini PROGBITS 0804877c 00077c 00001c 00 AX 0 0 4

[15] .rodata PROGBITS 08048798 000798 00005c 00 A 0 0 4

...

[20] .dynamic DYNAMIC 08049f08 000f08 0000e8 08 WA 6 0 4

[21] .got PROGBITS 08049ff0 000ff0 000004 04 WA 0 0 4

[22] .got.plt PROGBITS 08049ff4 000ff4 00002c 04 WA 0 0 4

[23] .data PROGBITS 0804a020 001020 000008 00 WA 0 0 4

[24] .bss NOBITS 0804a028 001028 00000c 00 WA 0 0 4

...

[27] .debug_pubnames PROGBITS 00000000 0011b8 000040 00 0 0 1

[28] .debug_info PROGBITS 00000000 0011f8 0004d9 00 0 0 1

[29] .debug_abbrev PROGBITS 00000000 0016d1 000156 00 0 0 1

[30] .debug_line PROGBITS 00000000 001827 000309 00 0 0 1

[31] .debug_frame PROGBITS 00000000 001b30 00003c 00 0 0 4

[32] .debug_str PROGBITS 00000000 001b6c 00024e 01 MS 0 0 1

...

[36] .shstrtab STRTAB 00000000 0051a8 000160 00 0 0 1

[37] .symtab SYMTAB 00000000 005920 000530 10 38 57 4

[38] .strtab STRTAB 00000000 005e50 000268 00 0 0 1

Key to Flags:

W (write), A (alloc), X (execute), M (merge), S (strings)

I (info), L (link order), G (group), x (unknown)

O (extra OS processing required) o (OS specific), p (processor specific)







рдпрд╣рд╛рдВ рдЖрдк рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рдИрдПрд▓рдПрдл рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рднреА рд╡рд░реНрдЧреЛрдВ рдХреА рд╕реВрдЪреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдирдХрд╛ рдкреНрд░рдХрд╛рд░ рдФрд░ рдореЗрдореЛрд░реА рдореЗрдВ рд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ (рдЖрд░, рдбрдмреНрд▓реНрдпреВ, рдПрдХреНрд╕ рдФрд░ рдП)ред



Program Headers:

Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align

PHDR 0x000034 0x08048034 0x08048034 0x00100 0x00100 RE 0x4

INTERP 0x000134 0x08048134 0x08048134 0x00013 0x00013 R 0x1

[Requesting program interpreter: /lib/ld-linux.so.2]

LOAD 0x000000 0x08048000 0x08048000 0x007f8 0x007f8 RE 0x1000

LOAD 0x000ef4 0x08049ef4 0x08049ef4 0x00134 0x00140 RW 0x1000

DYNAMIC 0x000f08 0x08049f08 0x08049f08 0x000e8 0x000e8 RW 0x4

NOTE 0x000148 0x08048148 0x08048148 0x00020 0x00020 R 0x4

GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x4

GNU_RELRO 0x000ef4 0x08049ef4 0x08049ef4 0x0010c 0x0010c R 0x1







рдпрд╣ рдЦрдВрдбреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ - рд╕реНрдореГрддрд┐ рдореЗрдВ рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХрдВрдЯреЗрдирд░ред рдПрдХ рд╡рд┐рд╢реЗрд╖ рдореЙрдбреНрдпреВрд▓, рдбрд╛рдпрдиреЗрдорд┐рдХ рд▓рд┐рдВрдХрд░ \ рд▓реЛрдбрд░ рдХрд╛ рдорд╛рд░реНрдЧ рднреА рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдЙрд╕рдХреЗ рдКрдкрд░ рд╣реИ рдХрд┐ рд╡рд╣ рдЗрд╕ рдИрдПрд▓рдПрдл рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдореЗрдореЛрд░реА рдореЗрдВ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░реЗред



Section to Segment mapping:

Segment Sections...

00

01 .interp

02 .interp .note.ABI-tag .hash .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rel.dyn .rel.plt .init .plt .text .fini .rodata .eh_frame

03 .ctors .dtors .jcr .dynamic .got .got.plt .data .bss

04 .dynamic

05 .note.ABI-tag

06

07 .ctors .dtors .jcr .dynamic .got







рдФрд░ рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд▓реЛрдбрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рд╕реЗрдЧрдореЗрдВрдЯ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдЧреЛрдВ рдХрд╛ рд╡рд┐рддрд░рдг рдХреИрд╕реЗ рд╣реЛрдЧрд╛ред

рд▓реЗрдХрд┐рди, рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдЦрдВрдб, рдЬреЛ рдЖрдпрд╛рддрд┐рдд рдФрд░ рдирд┐рд░реНрдпрд╛рддрд┐рдд рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЬреБрдбрд╝реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдХреЛ ".dynsym" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред



Symbol table '.dynsym' contains 17 entries:

Num: Value Size Type Bind Vis Ndx Name

0: 00000000 0 NOTYPE LOCAL DEFAULT UND

1: 00000000 0 FUNC GLOBAL DEFAULT UND libtest2

2: 00000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__

3: 00000000 0 NOTYPE WEAK DEFAULT UND _Jv_RegisterClasses

4: 00000000 0 FUNC GLOBAL DEFAULT UND dlclose@GLIBC_2.0 (2)

5: 00000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@GLIBC_2.0 (3)

6: 00000000 0 FUNC GLOBAL DEFAULT UND libtest1

7: 00000000 0 FUNC GLOBAL DEFAULT UND dlopen@GLIBC_2.1 (4)

8: 00000000 0 FUNC GLOBAL DEFAULT UND fprintf@GLIBC_2.0 (3)

9: 00000000 0 FUNC GLOBAL DEFAULT UND puts@GLIBC_2.0 (3)

10: 0804a034 0 NOTYPE GLOBAL DEFAULT ABS _end

11: 0804a028 0 NOTYPE GLOBAL DEFAULT ABS _edata

12: 0804879c 4 OBJECT GLOBAL DEFAULT 15 _IO_stdin_used

13: 0804a028 4 OBJECT GLOBAL DEFAULT 24 stderr@GLIBC_2.0 (3)

14: 0804a028 0 NOTYPE GLOBAL DEFAULT ABS __bss_start

15: 080484b4 0 FUNC GLOBAL DEFAULT 11 _init

16: 0804877c 0 FUNC GLOBAL DEFAULT 14 _fini







рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╕рд╣реА рд▓реЛрдбрд┐рдВрдЧ / рдЕрдирд▓реЛрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ, рдЖрдк рдкрд░рд┐рдЪрд┐рдд рдирд╛рдо рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ: libtest1, libtest2, dlopen, fprintf, put, dlcloseред рдЙрди рд╕рднреА рдХреЗ рд▓рд┐рдП, FUNC рдкреНрд░рдХрд╛рд░ рд╕реВрдЪреАрдмрджреНрдз рд╣реИ рдФрд░ рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИрдВ - рдЕрдиреБрднрд╛рдЧ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ UND рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред



".Rel.dyn" рдФрд░ ".rel.plt" рдЦрдВрдб ".dynsym" рд╕реЗ рдЙрди рд╡рд░реНрдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рд╕рд╛рд░рдгреА рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдо рддреМрд░ рдкрд░ рд▓реЗрдЖрдЙрдЯ рдХреЗ рджреМрд░рд╛рди рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред



Relocation section '.rel.dyn' at offset 0x464 contains 2 entries:

Offset Info Type Sym.Value Sym. Name

08049ff0 00000206 R_386_GLOB_DAT 00000000 __gmon_start__

0804a028 00000d05 R_386_COPY 0804a028 stderr



Relocation section '.rel.plt' at offset 0x474 contains 8 entries:

Offset Info Type Sym.Value Sym. Name

0804a000 00000107 R_386_JUMP_SLOT 00000000 libtest2

0804a004 00000207 R_386_JUMP_SLOT 00000000 __gmon_start__

0804a008 00000407 R_386_JUMP_SLOT 00000000 dlclose

0804a00c 00000507 R_386_JUMP_SLOT 00000000 __libc_start_main

0804a010 00000607 R_386_JUMP_SLOT 00000000 libtest1

0804a014 00000707 R_386_JUMP_SLOT 00000000 dlopen

0804a018 00000807 R_386_JUMP_SLOT 00000000 fprintf

0804a01c 00000907 R_386_JUMP_SLOT 00000000 puts







рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рдЧрддрд┐рд╢реАрд▓ рд▓рд┐рдВрдХрд┐рдВрдЧ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЗрди рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХреНрдпрд╛ рд╣реИ? рдпрд╣ рдЕрдЧрд▓реЗ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╖рдп рд╣реИред



рдХреИрд╕реЗ рд╕рд╛рдЭрд╛ рдХреА рдЬрд╛рддреА рд╣реИрдВ рдИрдПрд▓рдПрдл рд▓рд╛рдЗрдмреНрд░реЗрд░реА?



Libtest1.so рдФрд░ libtest2.so рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рд╕рдВрдХрд▓рди рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рдерд╛ред libtest2.so -fPIC рд╕реНрд╡рд┐рдЪ (рд╕реНрдерд┐рддрд┐ рд╕реНрд╡рддрдВрддреНрд░ рдХреЛрдб рдЙрддреНрдкрдиреНрди) рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЗрд╕рд╕реЗ рдЗрди рджреЛ рдореЙрдбреНрдпреВрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рддреАрдХ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рдХреИрд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ):



Symbol table '.dynsym' contains 11 entries:

Num: Value Size Type Bind Vis Ndx Name

0: 00000000 0 NOTYPE LOCAL DEFAULT UND

1: 00000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__

2: 00000000 0 NOTYPE WEAK DEFAULT UND _Jv_RegisterClasses

3: 00000000 0 FUNC GLOBAL DEFAULT UND puts@GLIBC_2.0 (2)

4: 00000000 0 FUNC WEAK DEFAULT UND __cxa_finalize@GLIBC_2.1.3 (3)

5: 00002014 0 NOTYPE GLOBAL DEFAULT ABS _end

6: 0000200c 0 NOTYPE GLOBAL DEFAULT ABS _edata

7: 0000043c 32 FUNC GLOBAL DEFAULT 11 libtest1

8: 0000200c 0 NOTYPE GLOBAL DEFAULT ABS __bss_start

9: 0000031c 0 FUNC GLOBAL DEFAULT 9 _init

10: 00000498 0 FUNC GLOBAL DEFAULT 12 _fini



Symbol table '.dynsym' contains 11 entries:

Num: Value Size Type Bind Vis Ndx Name

0: 00000000 0 NOTYPE LOCAL DEFAULT UND

1: 00000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__

2: 00000000 0 NOTYPE WEAK DEFAULT UND _Jv_RegisterClasses

3: 00000000 0 FUNC GLOBAL DEFAULT UND puts@GLIBC_2.0 (2)

4: 00000000 0 FUNC WEAK DEFAULT UND __cxa_finalize@GLIBC_2.1.3 (3)

5: 00002018 0 NOTYPE GLOBAL DEFAULT ABS _end

6: 00002010 0 NOTYPE GLOBAL DEFAULT ABS _edata

7: 00002010 0 NOTYPE GLOBAL DEFAULT ABS __bss_start

8: 00000304 0 FUNC GLOBAL DEFAULT 9 _init

9: 0000043c 52 FUNC GLOBAL DEFAULT 11 libtest2

10: 000004a8 0 FUNC GLOBAL DEFAULT 12 _fini







рддреЛ, рджреЛрдиреЛрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рддреАрдХ рддрд╛рд▓рд┐рдХрд╛рдПрдВ рдХреЗрд╡рд▓ рдкреНрд░рддреАрдХреЛрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рднрд┐рдиреНрди рд╣реЛрддреА рд╣реИрдВред рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рджреЛрдиреЛрдВ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдкреБрдЯ () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди libtest1 () рдпрд╛ libtest2 () рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рд░рд┐рд▓реЛрдХреЗрд╢рди рдЯреЗрдмрд▓ рдХреИрд╕реЗ рдмрджрд▓ рдЧрдП рд╣реИрдВ?



Relocation section '.rel.dyn' at offset 0x2cc contains 8 entries:

Offset Info Type Sym.Value Sym. Name

00000445 00000008 R_386_RELATIVE

00000451 00000008 R_386_RELATIVE

00002008 00000008 R_386_RELATIVE

0000044a 00000302 R_386_PC32 00000000 puts

00000456 00000302 R_386_PC32 00000000 puts

00001fe8 00000106 R_386_GLOB_DAT 00000000 __gmon_start__

00001fec 00000206 R_386_GLOB_DAT 00000000 _Jv_RegisterClasses

00001ff0 00000406 R_386_GLOB_DAT 00000000 __cxa_finalize



Relocation section '.rel.plt' at offset 0x30c contains 2 entries:

Offset Info Type Sym.Value Sym. Name

00002000 00000107 R_386_JUMP_SLOT 00000000 __gmon_start__

00002004 00000407 R_386_JUMP_SLOT 00000000 __cxa_finalize







Libtest1.so рдХреЗ рд▓рд┐рдП, рдкреБрдЯ () рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдирд╛рдВрддрд░рдг ".rel.dyn" рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рджреЛ рдмрд╛рд░ рд╣реЛрддрд╛ рд╣реИред рдЖрдЗрдП рдЗрди рд╕реНрдерд╛рдиреЛрдВ рдХреЛ рд╕реАрдзреЗ disassembler рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рджреЗрдЦреЗрдВред рдпрд╣ libtest1 () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдбрдмрд▓ рдкреБрдЯ () рдХреЙрд▓ рд╣реЛрддрд╛ рд╣реИред рд╣рдо objdump тАУD рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:



 0000043c <libtest1>: 43c: 55 push %ebp 43d: 89 e5 mov %esp,%ebp 43f: 83 ec 08 sub $0x8,%esp 442: c7 04 24 b4 04 00 00 movl $0x4b4,(%esp) 449: e8 fc ff ff ff call 44a <libtest1+0xe> 44e: c7 04 24 e0 04 00 00 movl $0x4e0,(%esp) 455: e8 fc ff ff ff call 456 <libtest1+0x1a> 45a: c9 leave 45b: c3 ret 45c: 90 nop 45d: 90 nop 45e: 90 nop 45f: 90 nop
      
      





рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдСрдкрд░реЗрдВрдб 0xFFFFFFFC рдХреЗ рд╕рд╛рде рджреЛ рд░рд┐рд╢реНрддреЗрджрд╛рд░ рдХреЙрд▓ рдирд┐рд░реНрджреЗрд╢ (рдХреЛрдб E8) рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдСрдкрд░реЗрдВрдб рдХреЗ рд╕рд╛рде рд╕рд╛рдкреЗрдХреНрд╖ CALL рдЕрд░реНрдерд╣реАрди рд╣реИ, рдХреНрдпреЛрдВрдХрд┐, рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдпрд╣ CALL рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдкрддреЗ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдПрдХ рдмрд╛рдЗрдЯ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк ".rel.dyn" рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдкреБрдЯ рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдХреА рдСрдлрд╕реЗрдЯ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдкрд╛рдПрдВрдЧреЗ рдХрд┐ рд╡реЗ рд╕рд┐рд░реНрдл рдХреЙрд▓ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдСрдкрд░реЗрдВрдб рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкреБрдЯ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХреЗ рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдореЗрдВ (, рд▓реЛрдбрд░ рдмрд╕ 0xFFFFFFFC рдХреЛ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░ рджреЗрдЧрд╛ рддрд╛рдХрд┐ рдкреБрдЯ рдкреБрдЯ () рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╣реА рдкрддреЗ рдкрд░ рдХреВрдж рдЬрд╛рдПрдЧрд╛ред

рдпрд╣ рдХреИрд╕реЗ рдкреНрд░рдХрд╛рд░ R_386_PC32 рдХрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рд╣реИред



рдЕрдм рд╣рдо libtest2.so рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ:



Relocation section '.rel.dyn' at offset 0x2cc contains 4 entries:

Offset Info Type Sym.Value Sym. Name

0000200c 00000008 R_386_RELATIVE

00001fe8 00000106 R_386_GLOB_DAT 00000000 __gmon_start__

00001fec 00000206 R_386_GLOB_DAT 00000000 _Jv_RegisterClasses

00001ff0 00000406 R_386_GLOB_DAT 00000000 __cxa_finalize



Relocation section '.rel.plt' at offset 0x2ec contains 3 entries:

Offset Info Type Sym.Value Sym. Name

00002000 00000107 R_386_JUMP_SLOT 00000000 __gmon_start__

00002004 00000307 R_386_JUMP_SLOT 00000000 puts

00002008 00000407 R_386_JUMP_SLOT 00000000 __cxa_finalize







рдкреБрдЯ () рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдФрд░, ".rel.plt" рдЕрдиреБрднрд╛рдЧ рдореЗрдВ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЖрдЗрдП рд╣рдо рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛ рджреЗрдЦреЗрдВ рдФрд░ рдХреБрдЫ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХрд░реЗрдВ:



 0000043c <libtest2>: 43c: 55 push %ebp 43d: 89 e5 mov %esp,%ebp 43f: 53 push %ebx 440: 83 ec 04 sub $0x4,%esp 443: e8 ef ff ff ff call 437 <__i686.get_pc_thunk.bx> 448: 81 c3 ac 1b 00 00 add $0x1bac,%ebx 44e: 8d 83 d0 e4 ff ff lea -0x1b30(%ebx),%eax 454: 89 04 24 mov %eax,(%esp) 457: e8 f8 fe ff ff call 354 <puts@plt> 45c: 8d 83 fc e4 ff ff lea -0x1b04(%ebx),%eax 462: 89 04 24 mov %eax,(%esp) 465: e8 ea fe ff ff call 354 <puts@plt> 46a: 83 c4 04 add $0x4,%esp 46d: 5b pop %ebx 46e: 5d pop %ebp 46f: c3 ret
      
      





CALL рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдкрд░рд┐рдЪрд╛рд▓рдХ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрд▓рдЧ рдФрд░ рд╕рд╛рд░реНрдердХ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╡реЗ рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдЕрдм рдХреЗрд╡рд▓ рдкреИрдбрд┐рдВрдЧ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдиреЛрдЯ рдХрд░рдирд╛ рднреА рдЙрдкрдпреЛрдЧреА рд╣реИ рдХрд┐ рдкреБрдЯ рд╕реЗ рдкрд╣рд▓реЗ () рдЦреБрдж рдХреЙрд▓ рдХрд░реЗрдВ, 0x1FF4 (0x1BAC + 0x448) EBX рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЛ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рдбреАрдмрдЧрд░ 0x448 рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ EBX рдорд╛рди рдХреЛ рдкрд╣рдЪрд╛рдирдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред рддреЛ, рдпрд╣ рдЖрдЧреЗ рдХрд╣реАрдВ рдХрд╛рдо рдореЗрдВ рдЖрдПрдЧрд╛ред рдкрддрд╛ 0x354 рд╣рдореЗрдВ рдПрдХ рдмрд╣реБрдд рд╣реА рджрд┐рд▓рдЪрд╕реНрдк рдЦрдВрдб ".plt" рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ ".text" рдХреА рддрд░рд╣, рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рд╣реИред рдпрд╣рд╛рдБ рдпрд╣ рд╣реИ:



 Disassembly of section .plt: 00000334 <__gmon_start__@plt-0x10>: 334: ff b3 04 00 00 00 pushl 0x4(%ebx) 33a: ff a3 08 00 00 00 jmp *0x8(%ebx) 340: 00 00 add %al,(%eax) ... 00000344 <__gmon_start__@plt>: 344: ff a3 0c 00 00 00 jmp *0xc(%ebx) 34a: 68 00 00 00 00 push $0x0 34f: e9 e0 ff ff ff jmp 334 <_init+0x30> 00000354 <puts@plt>: 354: ff a3 10 00 00 00 jmp *0x10(%ebx) 35a: 68 08 00 00 00 push $0x8 35f: e9 d0 ff ff ff jmp 334 <_init+0x30> 00000364 <__cxa_finalize@plt>: 364: ff a3 14 00 00 00 jmp *0x14(%ebx) 36a: 68 10 00 00 00 push $0x10 36f: e9 c0 ff ff ff jmp 334 <_init+0x30>
      
      





рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдмреНрдпрд╛рдЬ рдХреЗ рдкрддреЗ рдкрд░ 0x354 рд╣рдореЗрдВ рддреАрди рдирд┐рд░реНрджреЗрд╢ рдорд┐рд▓рддреЗ рд╣реИрдВред рдЙрдирдореЗрдВ рд╕реЗ рдкрд╣рд▓реЗ рдореЗрдВ, рдмрд┐рдирд╛ рд╢рд░реНрдд рдХреВрдж EBX (0x1FF4) рдкреНрд▓рд╕ 0x10 рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЧрд┐рдд рдкрддреЗ рдкрд░ рд╣реЛрддрд╛ рд╣реИред рд╕рд░рд▓ рдЧрдгрдирд╛ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рд╕реВрдЪрдХ 0x2004 рдХрд╛ рдореВрд▓реНрдп рдорд┐рд▓рддрд╛ рд╣реИред рдпреЗ рдкрддреЗ ".got.plt" рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдЖрддреЗ рд╣реИрдВред



 Disassembly of section .got.plt: 00001ff4 <.got.plt>: 1ff4: 20 1f and %bl,(%edi) ... 1ffe: 00 00 add %al,(%eax) 2000: 4a dec %edx 2001: 03 00 add (%eax),%eax 2003: 00 5a 03 add %bl,0x3(%edx) 2006: 00 00 add %al,(%eax) 2008: 6a 03 push $0x3 ...
      
      





рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рддрдм рд╕рд╛рдордиреЗ рдЖрддреА рд╣реИ рдЬрдм рд╣рдо рдЗрд╕ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдбрд┐рдлрд╛рдЗрди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЖрдЦрд┐рд░ рдореЗрдВ 0x35A рдХреЗ рдмрд░рд╛рдмрд░ рдмрд┐рдирд╛ рд╢рд░реНрдд рдЬрдореНрдк рдПрдбреНрд░реЗрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рд░реНрджреЗрд╢ рд╣реИ! рдЗрд╕ рддрд░рд╣ рдХреА рдЬрдЯрд┐рд▓ рдЬреЛрдбрд╝рддреЛрдбрд╝ рдХрд░рдирд╛ рдФрд░ "рд╣рд┐рджрд╛рдпрдд .pl.plt" рдЦрдВрдб рдХреЛ рдХреЗрд╡рд▓ рдЕрдЧрд▓реЗ рдирд┐рд░реНрджреЗрд╢ рдкрд░ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпреЛрдВ рдЖрд╡рд╢реНрдпрдХ рдерд╛? PLT рдФрд░ GOT рдХреНрдпрд╛ рд╣реИ?



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



 PLT[n+1]: jmp *GOT[n+3] push #n @push n as a signal to the resolver jmp PLT[0]
      
      





PLT [n + 1] рдкрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк GOT [n + 3] рдкрд░ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдирд┐рдпрдВрддреНрд░рдг рд╕рдВрдХреНрд░рдордг рд╣реЛрдЧрд╛ред рдкрд╣рд▓реА рдХреЙрд▓ рдкрд░, GOT [n + 3] рд╡рд╛рдкрд╕ PLT [n + 1] + 6 рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ PLT [0] рдкрд░ рдЕрдиреБрдХреНрд░рдо PUSH \ JMP рд╣реИред PLT [0] рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реБрдП, рд▓рд┐рдВрдХрд░ 'n' рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдЧреНрд░рд╣реАрдд рд╕реНрдЯреИрдХ рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ 'n' рдЕрдХреНрд╖рд░ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред рд▓рд┐рдВрдХрд░ рдлрд┐рд░ GOT [n + 3] рдХреЗ рдореВрд▓реНрдп рдХреЛ рд╕рд╣реА рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рд╕реАрдзреЗ рд▓рдХреНрд╖реНрдп рдХреА рджрд┐рдирдЪрд░реНрдпрд╛ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░реЗ, рдФрд░ рдЕрдВрддрддрдГ рдЗрд╕реЗ рдХреЙрд▓ рдХрд░реЗред рдкреАрдПрд▓рдЯреА [рдПрди + 1] рдХреЗ рдмрд╛рдж рдХреА рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓ рдХреЛ рдЬреЗрдПрдордкреА рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдкрдиреЗ рдкрддреЗ рдХреЗ рд╕рдорд╛рди рд╕рдВрдХрд▓реНрдк рдХреЗ рдмрд┐рдирд╛ рд▓рдХреНрд╖реНрдп рджрд┐рдирдЪрд░реНрдпрд╛ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред



рдкрд╣рд▓рд╛ PLT рддрддреНрд╡ рд╡рд┐рд╢реЗрд╖ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдбрд╛рдпрдиреЗрдорд┐рдХ рдПрдбреНрд░реЗрд╕ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдХреЛрдб рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред



 PLT[0]: push &GOT[1] jmp GOT[2] @points to resolver()
      
      





рдирд┐рдпрдВрддреНрд░рдг рд▓рд┐рдВрдХрд░ рдХреЛрдб рдХреЛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИред 'n' рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдЯреИрдХ рдкрд░ рд╣реИ рдФрд░ рдкрддрд╛ GOT [1] рд╡рд╣рд╛рдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣, рд▓рд┐рдВрдХрд░ (/lib/ld-linux.so.2 рдореЗрдВ рд╕реНрдерд┐рдд) рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдЕрдкрдиреА рд╕реЗрд╡рд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред



GOT (Global Offset Table) рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдСрдлрд╕реЗрдЯ рддрд╛рд▓рд┐рдХрд╛ рд╣реИред рдЗрд╕рдХреЗ рдкрд╣рд▓реЗ рддреАрди рддрддреНрд╡ рдЖрд░рдХреНрд╖рд┐рдд рд╣реИрдВред рдЬрдм GOT рдХреЛ рдкрд╣рд▓реА рдмрд╛рд░ рдЖрд░рдВрднреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рд╕рднреА рддрддреНрд╡ рдЬреЛ PLT рдореЗрдВ рдкрддрд╛ рд╕рдорд╛рдзрд╛рди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, PLT рдХреЛ рд╡рд╛рдкрд╕ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВред



рдпреЗ рд╡рд┐рд╢реЗрд╖ рддрддреНрд╡ рд╣реИрдВ:

рдкреНрд░рддреНрдпреЗрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХрд╛ рдЕрдкрдирд╛ PLT рдФрд░ GOT рд╣реЛрддрд╛ рд╣реИред







рдпрд╣ рдХреИрд╕реЗ рдкреНрд░рдХрд╛рд░ R_386_JUMP_SLOT рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ libtest2.so рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рд╕реНрдереИрддрд┐рдХ рд▓реЗрдЖрдЙрдЯ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╡реЗ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред



рдХреЛрдб рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рдЬреЛ рдореЗрдореЛрд░реА рдореЗрдВ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рд╣реИ (PIC) рдЖрдпрд╛рддрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИред



рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд┐рд╖реНрдХрд░реНрд╖



рдЖрдЗрдП рдХреБрдЫ рдЙрдкрдпреЛрдЧреА рдирд┐рд╖реНрдХрд░реНрд╖ рджреЗрддреЗ рд╣реИрдВ:

  1. рдЖрдпрд╛рддрд┐рдд рдФрд░ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА ".dynsym" рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИ
  2. рдпрджрд┐ рдореЙрдбреНрдпреВрд▓ PIC рдореЛрдб (-fPIC рд╕реНрд╡рд┐рдЪ) рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдЖрдпрд╛рддрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ PLT рдФрд░ GOT рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ PLT рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рддрддреНрд╡ рдХреЗ рдкрд╣рд▓реЗ рдирд┐рд░реНрджреЗрд╢ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдкрд░ рдЬрд╛рдирдХрд╛рд░реА ".rel.plt" рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИ
  3. рдпрджрд┐ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╕рдордп тАУfPIC рд╕реНрд╡рд┐рдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдкреНрд░рддреНрдпреЗрдХ рд░рд┐рд╢реНрддреЗрджрд╛рд░ рдХреЙрд▓ рдЕрдиреБрджреЗрд╢ рдХреЗ рдСрдкрд░реЗрдВрдб рдкрд░ рдХрдИ рдмрд╛рд░ рд░рд┐рд▓реИрдХреНрд╕ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдб рдореЗрдВ рдХреБрдЫ рдЖрдпрд╛рддрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХреЙрд▓ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдХреА рдЬрд╛рдирдХрд╛рд░реА ".rel.dyn" рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИ


рдиреЛрдЯ: -fPIC рд╕рдВрдХрд▓рди рдХреБрдВрдЬреА 64-рдмрд┐рдЯ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдпрд╛рдиреА 64-рдмрд┐рдЯ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ, рдЖрдпрд╛рддрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рд╣рдореЗрд╢рд╛ PLT \ GOT рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рд▓ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рддрд░рд╣ рдХреЗ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рд╕реЗрдХреНрд╢рди рдкрд░ рд░рд┐рд▓реЛрдХреЗрд╢рдиреНрд╕ рдХреЛ ".rela.plt" рдФрд░ ".rela.dyn" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред



рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдирд┐рд░реНрдгрдп



рдХреБрдЫ рдбрд╛рдпрдирд╛рдорд┐рдХ рд▓рд┐рдВрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдПрдХ рдЗрдВрдкреЛрд░реНрдЯреЗрдб рдлрдВрдХреНрд╢рди рдХреЛ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдирд┐рдореНрди рдЬрд╛рдирдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ:

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



C рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рди рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:



 void *elf_hook(char const *library_filename, void const *library_address, char const *function_name, void const *substitution_address);
      
      







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



рдпрд╣рд╛рдБ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рди рдлрд╝рдВрдХреНрд╢рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╣реИ:

  1. рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗрдВред
  2. рд╣рдореЗрдВ ".dynsym" рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдкреНрд░рддреАрдХ рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рдпрд╛рдж рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдирд╛рдо рд╡рд╛рдВрдЫрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдирд╛рдо рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред
  3. рд╣рдо ".rel.plt" рдЕрдиреБрднрд╛рдЧ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рдФрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рд╕рд╛рде рдкреНрд░рддреАрдХ рдХреЗ рд▓рд┐рдП рдЗрд╕рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдкреНрд▓реЗрд╕рдореЗрдВрдЯ рдХреА рддрд▓рд╛рд╢ рдХрд░рддреЗ рд╣реИрдВред
  4. рдпрджрд┐ рдРрд╕рд╛ рдХреЛрдИ рдкреНрд░рддреАрдХ рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдореВрд▓ рдкрддреЗ рдХреЛ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВ, рдлрд┐рд░ рдЗрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рд╕реНрдерд╛рди рдореЗрдВ рдЗрдВрдЧрд┐рдд рд╕реНрдерд╛рди рдкрд░ рд╕реНрдерд╛рдирд╛рдкрдиреНрди рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрддрд╛ рд▓рд┐рдЦреЗрдВред рдЗрд╕ рд╕реНрдерд╛рди рдХреА рдЧрдгрдирд╛ рдореЗрдореЛрд░реА рдореЗрдВ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд▓реЛрдбрд┐рдВрдЧ рдкрддреЗ рдФрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдореЗрдВ рдСрдлрд╕реЗрдЯ рдХреЗ рдпреЛрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдХреА рдЬрд╛рддреА рд╣реИред рд╡рд╣ рд╕рдм рд╣реИред рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрддрд╛ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЬрдм рднреА рд▓рд╛рдпрдмреНрд░реЗрд░реА рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреА рд╣реИ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рди рд╣реЛрдЧрд╛ред рд╣рдо рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддреЗ рд╣реИрдВ рдФрд░ рдореВрд▓ рдХрд╛ рдкрддрд╛ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВред
  5. рдпрджрд┐ рдРрд╕рд╛ рдкреНрд░рддреАрдХ ".rel.plt" рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдирд╣реАрдВ рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рдЙрд╕реА рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рдЕрдиреБрд╕рд╛рд░ "rel.dyn" рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдЦреЛрдЬ рд░рд╣реЗ рд╣реИрдВред рд▓реЗрдХрд┐рди, рдЖрдкрдХреЛ рдпрд╣ рдпрд╛рдж рд░рдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ rel.dyn рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рд╕рд╛рде рдкреНрд░рддреАрдХ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЖрдк рдкрд╣рд▓реЗ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХреЗ рдмрд╛рдж рдЦреЛрдЬ рдЪрдХреНрд░ рдХреЛ рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рд▓реЗрдХрд┐рди рдореВрд▓ рдХреЗ рдкрддреЗ рдХреЛ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рдкрд╣рд▓реЗ рд╕рдВрдпреЛрдЧ рдкрд░ рдпрд╛рдж рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЕрдм рдЧрдгрдирд╛ рдирд╣реАрдВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ - рдпрд╣ рдЕрднреА рднреА рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред
  6. рд╣рдо рдореВрд▓ рдлрд╝рдВрдХреНрд╢рди рдпрд╛ NULL рдХрд╛ рдкрддрд╛ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВ рдпрджрд┐ рд╡рд╛рдВрдЫрд┐рдд рдирд╛рдо рд╡рд╛рд▓рд╛ рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рдорд┐рд▓рд╛ред


рдиреАрдЪреЗ C рдореЗрдВ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдХреЛрдб рд╣реИ:



 void *elf_hook(char const *module_filename, void const *module_address, char const *name, void const *substitution) { static size_t pagesize; int descriptor; //file descriptor of shared module Elf_Shdr *dynsym = NULL, // ".dynsym" section header *rel_plt = NULL, // ".rel.plt" section header *rel_dyn = NULL; // ".rel.dyn" section header Elf_Sym *symbol = NULL; //symbol table entry for symbol named "name" Elf_Rel *rel_plt_table = NULL, //array with ".rel.plt" entries *rel_dyn_table = NULL; //array with ".rel.dyn" entries size_t i, name_index = 0, //index of symbol named "name" in ".dyn.sym" rel_plt_amount = 0, // amount of ".rel.plt" entries rel_dyn_amount = 0, // amount of ".rel.dyn" entries *name_address = NULL; //address of relocation for symbol named "name" void *original = NULL; //address of the symbol being substituted if (NULL == module_address || NULL == name || NULL == substitution) return original; if (!pagesize) pagesize = sysconf(_SC_PAGESIZE); descriptor = open(module_filename, O_RDONLY); if (descriptor < 0) return original; if ( section_by_type(descriptor, SHT_DYNSYM, &dynsym) || //get ".dynsym" section symbol_by_name(descriptor, dynsym, name, &symbol, &name_index) || //actually, we need only the index of symbol named "name" in the ".dynsym" table section_by_name(descriptor, REL_PLT, &rel_plt) || //get ".rel.plt" (for 32-bit) or ".rela.plt" (for 64-bit) section section_by_name(descriptor, REL_DYN, &rel_dyn) //get ".rel.dyn" (for 32-bit) or ".rela.dyn" (for 64-bit) section ) { //if something went wrong free(dynsym); free(rel_plt); free(rel_dyn); free(symbol); close(descriptor); return original; } //release the data used free(dynsym); free(symbol); rel_plt_table = (Elf_Rel *)(((size_t)module_address) + rel_plt->sh_addr); //init the ".rel.plt" array rel_plt_amount = rel_plt->sh_size / sizeof(Elf_Rel); //and get its size rel_dyn_table = (Elf_Rel *)(((size_t)module_address) + rel_dyn->sh_addr); //init the ".rel.dyn" array rel_dyn_amount = rel_dyn->sh_size / sizeof(Elf_Rel); //and get its size //release the data used free(rel_plt); free(rel_dyn); //and descriptor close(descriptor); //now we've got ".rel.plt" (needed for PIC) table and ".rel.dyn" (for non-PIC) table and the symbol's index for (i = 0; i < rel_plt_amount; ++i) //lookup the ".rel.plt" table if (ELF_R_SYM(rel_plt_table[i].r_info) == name_index) //if we found the symbol to substitute in ".rel.plt" { original = (void *)*(size_t *)(((size_t)module_address) + rel_plt_table[i].r_offset); //save the original function address *(size_t *)(((size_t)module_address) + rel_plt_table[i].r_offset) = (size_t)substitution; //and replace it with the substitutional break; //the target symbol appears in ".rel.plt" only once } if (original) return original; //we will get here only with 32-bit non-PIC module for (i = 0; i < rel_dyn_amount; ++i) //lookup the ".rel.dyn" table if (ELF_R_SYM(rel_dyn_table[i].r_info) == name_index) //if we found the symbol to substitute in ".rel.dyn" { name_address = (size_t *)(((size_t)module_address) + rel_dyn_table[i].r_offset); //get the relocation address (address of a relative CALL (0xE8) instruction's argument) if (!original) original = (void *)(*name_address + (size_t)name_address + sizeof(size_t)); //calculate an address of the original function by a relative CALL (0xE8) instruction's argument mprotect((void *)(((size_t)name_address) & (((size_t)-1) ^ (pagesize - 1))), pagesize, PROT_READ | PROT_WRITE); //mark a memory page that contains the relocation as writable if (errno) return NULL; *name_address = (size_t)substitution - (size_t)name_address - sizeof(size_t); //calculate a new relative CALL (0xE8) instruction's argument for the substitutional function and write it down mprotect((void *)(((size_t)name_address) & (((size_t)-1) ^ (pagesize - 1))), pagesize, PROT_READ | PROT_EXEC); //mark a memory page that contains the relocation back as executable if (errno) //if something went wrong { *name_address = (size_t)original - (size_t)name_address - sizeof(size_t); //then restore the original function address return NULL; } } return original; }
      
      





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



рд╣рдо рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:



 #include <stdio.h> #include <dlfcn.h> #include "elf_hook.h" #define LIBTEST1_PATH "libtest1.so" //position dependent code (for 32 bit only) #define LIBTEST2_PATH "libtest2.so" //position independent code void libtest1(); //from libtest1.so void libtest2(); //from libtest2.so int hooked_puts(char const *s) { puts(s); //calls the original puts() from libc.so because our main executable module called "test" is intact by hook puts("is HOOKED!"); } int main() { void *handle1 = dlopen(LIBTEST1_PATH, RTLD_LAZY); void *handle2 = dlopen(LIBTEST2_PATH, RTLD_LAZY); void *original1, *original2; if (NULL == handle1 || NULL == handle2) fprintf(stderr, "Failed to open \"%s\" or \"%s\"!\n", LIBTEST1_PATH, LIBTEST2_PATH); libtest1(); //calls puts() from libc.so twice libtest2(); //calls puts() from libc.so twice puts("-----------------------------"); original1 = elf_hook(LIBTEST1_PATH, LIBRARY_ADDRESS_BY_HANDLE(handle1), "puts", hooked_puts); original2 = elf_hook(LIBTEST2_PATH, LIBRARY_ADDRESS_BY_HANDLE(handle2), "puts", hooked_puts); if (NULL == original1 || NULL == original2) fprintf(stderr, "Redirection failed!\n"); libtest1(); //calls hooked_puts() twice libtest2(); //calls hooked_puts() twice puts("-----------------------------"); original1 = elf_hook(LIBTEST1_PATH, LIBRARY_ADDRESS_BY_HANDLE(handle1), "puts", original1); original2 = elf_hook(LIBTEST2_PATH, LIBRARY_ADDRESS_BY_HANDLE(handle2), "puts", original2); if (NULL == original1 || original1 != original2) //both pointers should contain hooked_puts() address now fprintf(stderr, "Restoration failed!\n"); libtest1(); //again calls puts() from libc.so twice libtest2(); //again calls puts() from libc.so twice dlclose(handle1); dlclose(handle2); return 0; }
      
      





рд╣рдо рд╕рдВрдХрд▓рди рдХрд░рддреЗ рд╣реИрдВ:



 gcc -g3 -m32 -shared -o libtest1.so libtest1.c gcc -g3 -m32 -fPIC -shared -o libtest2.so libtest2.c gcc -g3 -m32 -L$PWD -o test test.c elf_hook.c -ltest1 -ltest2 -ldl
      
      





рдФрд░ рдЪрд▓рд╛рдПрдВ:



 export LD_LIBRARY_PATH=$PWD:$LD_LIBRARY_PATH ./test
      
      







рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИ:



libtest1: 1st call to the original puts()

libtest1: 2nd call to the original puts()

libtest2: 1st call to the original puts()

libtest2: 2nd call to the original puts()

-----------------------------

libtest1: 1st call to the original puts()

is HOOKED!

libtest1: 2nd call to the original puts()

is HOOKED!

libtest2: 1st call to the original puts()

is HOOKED!

libtest2: 2nd call to the original puts()

is HOOKED!

-----------------------------

libtest1: 1st call to the original puts()

libtest1: 2nd call to the original puts()

libtest2: 1st call to the original puts()

libtest2: 2nd call to the original puts()







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



рдЙрд╕ рдкрддреЗ рдХрд╛ рдкрддрд╛ рдХреИрд╕реЗ рд▓рдЧрд╛рдПрдВ рдЬрд╣рд╛рдВ рд╕рд╛рдЭрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рднрд░реА рд╣реБрдИ рдереА?


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



#define LIBRARY_ADDRESS_BY_HANDLE(dlhandle) ((NULL == dlhandle) ? NULL : (void*)*(size_t const*)(dlhandle))









рдХрд┐рд╕реА рдирдП рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрддрд╛ рдХреИрд╕реЗ рд░рд┐рдХреЙрд░реНрдб рдХрд░реЗрдВ рдФрд░ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ?


".Rel.plt" рдЕрдиреБрднрд╛рдЧ рд╕реЗ рд░рд┐рд▓реЛрдХреЗрд╢рди рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд░реАрд░рд╛рдЗрдЯрд┐рдВрдЧ рдкрддреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ, ".plt" рдЕрдиреБрднрд╛рдЧ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рддрддреНрд╡ рдХреЗ JMP рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рд╣реИред рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдСрдкрд░реЗрдВрдб рд╕рд┐рд░реНрдл рдкрддреЗ рд╣реИрдВред



рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд░рд┐рд╢реНрддреЗрджрд╛рд░ рдХреЙрд▓ рдирд┐рд░реНрджреЗрд╢реЛрдВ (рдХреЛрдб рдИ 8) рдХреЗ рдСрдкрд░реЗрдВрдб рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдХреЗ рдЖрд╡реЗрджрди рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рддрд┐ рд╣реИред рдЙрдирдореЗрдВ рд╕рдВрдХреНрд░рдордг рдХреЗ рдкрддреЗ рдХреА рдЧрдгрдирд╛ рд╕реВрддреНрд░ рджреНрд╡рд╛рд░рд╛ рдХреА рдЬрд╛рддреА рд╣реИ:



address_of_a_function = CALL_argument + address_of_the_next_instruction







рддреЛ рд╣рдо рдореВрд▓ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВредрдкрд┐рдЫрд▓реЗ рд╕реВрддреНрд░ рд╕реЗ, рд╣рдореЗрдВ рд╡рд╣ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд┐рд╢реНрддреЗрджрд╛рд░ рдХреЙрд▓ рдХреЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП: ".rel.dyn" рдЕрдиреБрднрд╛рдЧ "RE" рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рд╕реЗрдЧрдореЗрдВрдЯ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкрддреЗ рд▓рд┐рдЦрдирд╛ рдХреЗрд╡рд▓ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред ред рдЖрдкрдХреЛ рдЙрд╕ рдкреГрд╖реНрда рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд┐рдд рдЕрдиреБрдорддрд┐ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рди рдХреЗ рдмрд╛рдж рд╕рдм рдХреБрдЫ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рдирд╛ рди рднреВрд▓реЗрдВред рдпрд╣ mprotect () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд╣рд▓рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдЙрд╕ рдкреГрд╖реНрда рдХрд╛ рдкрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд░рд┐рд▓реЛрдХреЗрд╢рди рд╣реИред рдпрд╣ рд╣рдореЗрд╢рд╛ рдкреГрд╖реНрда рдЖрдХрд╛рд░ рдХрд╛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ: рдЖрдкрдХреЛ рдмрд╕ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдкрддреЗ (рдкреГрд╖реНрда рдЖрдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░) рдХреЗ рдХреБрдЫ рдХрдо рд╕реЗ рдХрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рд╢реВрдиреНрдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 32-рдмрд┐рдЯ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдЖрдХрд╛рд░ 4096 (0x1000) рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдкреГрд╖реНрдареЛрдВ рдХреЗ рд▓рд┐рдП, рдЙрдкрд░реЛрдХреНрдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:



CALL_argument = address_of_a_function - address_of_the_next_instruction











page_address = (size_t)relocation_address & ( ((size_t) -1) ^ (pagesize - 1) );











page_address = (size_t)relocation_address & (0xFFFFFFFF ^ 0xFFF) = (size_t)relocation_address & 0xFFFFF000;







рдЖрдк sysconf (_SC_PAGESIZE) рдХреЙрд▓ рдХрд░рдХреЗ рдПрдХ рдкреГрд╖реНрда рдХрд╛ рдЖрдХрд╛рд░ рдкрддрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред



рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ


рдПрдХ рдЕрднреНрдпрд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдк рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдореЗрдВ рдПрдХ рдкреНрд▓рдЧ-рдЗрди рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╕рднреА рдиреЗрдЯрд╡рд░реНрдХ рдХреЙрд▓ рдХреЛ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд░реЗрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдбреЛрдм рдлреНрд▓реИрд╢ рдкреНрд▓рдЧ-рдЗрди (libflashplayer.so)ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЖрдк рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдиреЗрдЯрд╡рд░реНрдХ рдХреЙрд▓ рдФрд░ рдЕрдиреНрдп рдкреНрд▓рдЧ-рдЗрди рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рд╕рднреА рдПрдбреЛрдм рдлреНрд▓реИрд╢ рдЯреНрд░реИрдлрд╝рд┐рдХ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред



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



рд╕рдВрдмрдВрдзрд┐рдд рд▓рд┐рдВрдХ


рдЙрди рд▓реЛрдЧреЛрдВ рдХреЛ рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ рдкрдврд╝рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рд╣реИ , рд░реВрд╕реА рдореЗрдВ рдореИрдВ рдкрд╣рд▓реА рдмрд╛рд░ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рддрд╛ рд╣реВрдВред



All Articles