рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рд╣реИрдВрдбрд▓рд░ рд╕реНрдкреВрдлрд┐рдВрдЧ

рд╕рднреА рдХреЛ рд╢реБрдн рджрд┐рди! рдореИрдВ рдПрдХ рддрдХрдиреАрдХреА рд╡рд┐рд╢реНрд╡рд╡рд┐рджреНрдпрд╛рд▓рдп рдХрд╛ рдПрдХ рдкрд░рд┐рд╢рд┐рд╖реНрдЯ рд╣реВрдВред рдХреБрдЫ рдорд╣реАрдиреЗ рдкрд╣рд▓реЗ рдкрд╛рдареНрдпрдХреНрд░рдо рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╖рдп рдЪреБрдирдиреЗ рдХрд╛ рд╕рдордп рдерд╛ред рдХреИрд▓рдХреБрд▓реЗрдЯрд░ рдЬреИрд╕реЗ рд╡рд┐рд╖рдп рдореБрдЭреЗ рд╕реВрдЯ рдирд╣реАрдВ рдХрд░рддреЗ рдереЗред рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдкреВрдЫрд╛ рдХрд┐ рдХреНрдпрд╛ рдХреБрдЫ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдерд╛, рдФрд░ рдПрдХ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдЬрд╡рд╛рдм рдорд┐рд▓рд╛ред "рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди" рдореЗрд░рд╛ рд╡рд┐рд╖рдп рд╣реИред

рдкрд░рд┐рдЪрдп

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

рдХреНрдпреЛрдВ?

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

32-рдмрд┐рдЯ рд╣реИрдВрдбрд▓рд░


рдХреИрд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░реЗрдВ
рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдереЛрдбрд╝реА рдЦреЛрдЬ рдХреА ( рдпрд╣ рдкреЛрд╕реНрдЯ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА рдереА) рдФрд░ рд▓рд┐рдирдХреНрд╕ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореИрдиреБрдЕрд▓ рдХреЛ "рд╕реНрдореЛрдХреНрдб" рдХрд┐рдпрд╛, рдореИрдВрдиреЗ рд╕реА рдХреЗ рд▓рд┐рдП 32-рдмрд┐рдЯ рдЗрдВрдЯрд░рдкреНрдЯ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд╛рдпрд╛ред рд╕рдм рдХреБрдЫ рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░ рд╕реЗ рдЖрд╕рд╛рди рд╣реЛ рдЧрдпрд╛ред

рд╣рдо рдХреНрд░рдо рдореЗрдВ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗред
рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ (Engред рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓) - рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд┐рд╕реА рднреА рдСрдкрд░реЗрд╢рди (рд╡рд┐рдХреА) рдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдХрд░реНрдиреЗрд▓ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рд╣реИрдВрдбрд▓рд░ рдХреЗ рдкрддреЗ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдЯреЗрдмрд▓ (sys_call_table) рдореЗрдВ рдХрд░реНрдиреЗрд▓ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЗрди рдкрддреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдкрд░ рд╕реНрдерд┐рдд рдПрдХ рд╣реИрдВрдбрд▓рд░ рдХреЛ рд╣рд░ рдмрд╛рд░ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдм рдХреЛрдИ рдкреНрд░реЛрдЧреНрд░рд╛рдо 80x рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдИрд░реЗрдХреНрд╕ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рдПрдХ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рд╣реЛрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, eax = 4 рдЙрд╕ рд▓рд┐рдЦрдиреЗ рд╡рд╛рд▓реЗ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдЬреЛ рдлрд╝рд╛рдЗрд▓ рдпрд╛ рдЖрдЙрдЯрдкреБрдЯ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рд▓рд┐рдЦрддрд╛ рд╣реИ) ред рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдкрддрд╛ рдФрд░ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рдХреЙрд▓ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЬрд╛рдирдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдЗрд╕рдХреЗ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЕрдкрдиреЗ рдХреЛрдб рд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред

рддреЛ, рдПрдХ 32-рдмрд┐рдЯ рдмрд╛рдзрд╛ рдХреЗ рд╕рд╛рде рдкрддрд╛ рд▓рдЧрд╛ред

рд╡реНрдпрд╡рдзрд╛рди рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЕрддреНрдпрдВрдд рд╕рд░рд▓ рд╣реИ:
  1. рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдЯреЗрдмрд▓ (sys_call_table) рдХреЗ рдкрддреЗ рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдВ
  2. рдЙрд╕ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХрд╛ рдкрддрд╛ рджреЗрдЦреЗрдВ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЗрд╕рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
  3. рдЗрд╕ рдкрддреЗ рдХреЗ рдмрдЬрд╛рдп рд╣рдорд╛рд░реЗ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдкрддрд╛ рд▓рд┐рдЦреЗрдВ

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

рдХрд░реНрдиреЗрд▓ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдХрдВрдХрд╛рд▓:

static int init(void) { } static void exit(void) { } module_init(init); module_exit(exit); 


рдореЙрдбреНрдпреВрд▓, рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдореЗрдВ рдХрдо рд╕реЗ рдХрдо 2 рдлрд╝рдВрдХреНрд╢рди рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП - рдореЗрдореЛрд░реА рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдлрд╝рдВрдХреНрд╢рди (рдЬрд┐рд╕реЗ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдореЗрдореЛрд░реА рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) рдФрд░ рд╢рдЯрдбрд╛рдЙрди рдлрд╝рдВрдХреНрд╢рди (рдХреНрд░рдорд╢рдГ, рдЬрдм рдореЙрдбреНрдпреВрд▓ рдЕрдирд▓реЛрдб рд╣реЛрддрд╛ рд╣реИ)ред
рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдЬрд┐рд╕реЗ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╡рд╣ рд░реИрдо рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдЯреЗрдмрд▓ рдХреЗ рд╕реНрдерд╛рди рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╣реИред рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдкрддрд╛ "System.map-version_kernel" рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рдВрдХрд▓рд┐рдд рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдкрд╛рдпрд╛ рдЧрдпрд╛ рдкрддрд╛ рдЬреЛрдбрд╝реЗрдВред рдкрддрд╛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:

grep sys_call_table /boot/System.map-$(uname -r) |awk '{print $1}'

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХрдорд╛рдВрдб рдкрд╛рдпрд╛ рдЧрдпрд╛ рдкрддрд╛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ:

c05d3180

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

рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╡рд░рдг! рд╣реИрдВрдбрд▓рд░ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╕рдордп, рдмрд╛рдзрд┐рдд рд╡реИрдХреНрдЯрд░ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рд▓реЗрдЦрди рд╕реБрд░рдХреНрд╖рд╛ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд╣рдо CR0 рд╕рд┐рд╕реНрдЯрдо рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЗ WP рдмрд┐рдЯ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рдХреЗ рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдмрд┐рдЯ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд╕реНрддрд░ рдкрд░ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рдкрд░реНрдпрд╛рдкреНрдд рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХреЛрдб рдХреЗ рд▓рд┐рдП) рд╕реНрдореГрддрд┐ рдкреГрд╖реНрдареЛрдВ рдореЗрдВ рд╕рдВрд╢реЛрдзрди, рднрд▓реЗ рд╣реА рд╡реЗ рдЙрдиреНрд╣реЗрдВ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ рдпрд╛ рдирд╣реАрдВред CR0 рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЛ write_cr0 () рдФрд░ read_cr0 () рдореИрдХреНрд░реЛрдЬрд╝ рджреНрд╡рд╛рд░рд╛ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдореЙрдбреНрдпреВрд▓ рд╕рд╛рд░рд╛рдВрд╢ рдХреЛрдб
 #include <linux/init.h> #include <linux/module.h> #include <linux/kernel.h> #include <linux/errno.h> #include <linux/types.h> #include <linux/unistd.h> #include <asm/cacheflush.h> #include <asm/page.h> #include <asm/current.h> #include <linux/sched.h> #include <linux/kallsyms.h> unsigned long *syscall_table = (unsigned long *)0xTABLE; // TABLE -     (    c05d3180) asmlinkage int (*original_write)(unsigned int, const char __user *, size_t); asmlinkage int new_write(unsigned int fd, const char __user *buf, size_t count) { //   write printk(KERN_ALERT "It works!\n"); return (*original_write)(fd, buf, count); } static int init(void) { printk(KERN_ALERT "Module init\n"); write_cr0 (read_cr0 () & (~ 0x10000)); //  WP  original_write = (void *)syscall_table[__NR_write];//     syscall_table[__NR_write] = new_write; //    write_cr0 (read_cr0 () | 0x10000); //  WP   return 0; } static void exit(void) { write_cr0 (read_cr0 () & (~ 0x10000)); //  WP  syscall_table[__NR_write] = original_write; //      write_cr0 (read_cr0 () | 0x10000); //  WP   printk(KERN_ALERT "Module exit\n"); return; } module_init(init); module_exit(exit); 


64-рдмрд┐рдЯ рд╣реИрдВрдбрд▓рд░


рдкрд╣рд▓рд╛ рдЕрдВрддрд░ рдЬреЛ рдореИрдВрдиреЗ рджреЗрдЦрд╛, рдЬрдм рдХрдорд╛рдВрдб рджрд░реНрдЬ рдХрд░ рд░рд╣рд╛ рдерд╛

grep sys_call_table /boot/System.map-$(uname -r) |awk '{print $1}'

рджреЛ рдкрддреЗ рдХрд╛рдЯреЗ рдЧрдП:

ffffffff81801300
ffffffff81805260

рдЯреАрдо рдХреЛ рдереЛрдбрд╝рд╛ рдмрджрд▓рдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рдРрд╕рд╛ рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рд╛

grep sys_call_table /boot/System.map-$(uname -r)

ffffffff81801300 R sys_call_table
ffffffff81805260 R ia32_sys_call_table

рд╕рдм рдХреБрдЫ рддреБрд░рдВрдд рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЧрдпрд╛ред 64-рдмрд┐рдЯ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореЗрдВ, 32-рдмрд┐рдЯ рдПрдХ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП, рджреЛ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдЯреЗрдмрд▓ рд╣реИрдВред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХ 64-рдмрд┐рдЯ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ 32-рдмрд┐рдЯ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рд╣реИред
32-рдмрд┐рдЯ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореЗрдВ, __NR_write 4 рдерд╛ (рдЬреЛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рд░рд╛рдЗрдЯ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ 4 рдирдВрдмрд░ рдкрд░ рд╣реИ), рдФрд░ x64 рдореЗрдВ рдпрд╣ 1. рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЬрдм рдореИрдВрдиреЗ рдкрд╣рд▓реЗ 64-рдмрд┐рдЯ рдЕрд╕реЗрдВрдмрд▓рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛, рддреЛ рдореБрдЭреЗ рддреБрд░рдВрдд рд╕рдордЭ рдирд╣реАрдВ рдЖрдпрд╛ рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ,ред рд▓реЗрдХрд┐рди рддрдм рдЙрд╕реЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ 64-рдмрд┐рдЯ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореЗрдВ sys_write рдирдВрдмрд░ 1 рд╣реИред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕ рд╕рд╛рд░реЗ рдЕрдВрддрд░ рдкрд░, рдЬреЛ 64-рдмрд┐рдЯ рдФрд░ 32-рдмрд┐рдЯ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдмрд╛рдзрд╛ рд╣реИрдВрдбрд▓рд░ рдХреЗ рдмреАрдЪ рдореЗрд░реА рд░реБрдЪрд┐ рдереА, рдореЗрд░реЗ рд▓рд┐рдП рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ред
рдЪреВрдВрдХрд┐ TK рдореЗрдВ рдХреЛрдбрд╛рдВрддрд░рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢рд╛рдорд┐рд▓ рд╣реИ, рд╣рдо C рдореЗрдВ рдХрд░реНрдиреЗрд▓ рдореЙрдбреНрдпреВрд▓ рд▓рд┐рдЦреЗрдВрдЧреЗ, рдФрд░ рдХреЛрдбрд╛рдВрддрд░рдХ рдореЗрдВ рдЗрд╕рдХреЗ рд╕рднреА рдХрд╛рд░реНрдпред

рд╢реИрд▓ рд▓рд┐рдкрд┐
 #!/bin/bash TABLE=$(grep ' sys_call_table' /boot/System.map-$(uname -r) |awk '{print $1}') echo $TABLE sed -is/TABLE/$TABLE/g module.c 

рдХрд░реНрдиреЗрд▓ рдореЙрдбреНрдпреВрд▓
 #include <linux/init.h> #include <linux/module.h> unsigned long *syscall_table = (unsigned long *)0xTABLE; extern void change(unsigned long *temp); extern void unchange(unsigned long *temp); static int init(void) { printk(KERN_ALERT "\nModule init\n"); change(syscall_table); return 0; } static void cleanup(void) { unchange(syscall_table); printk(KERN_ALERT "Module exit\n"); } module_init(init); module_exit(cleanup); 

рд╕рд╣рд╛рдпрдХ рдореЙрдбреНрдпреВрд▓
 global unlockWP global lockWP global change global unchange extern printk SECTION .text newwrite: mov rax, original ; original_write mov rax, QWORD[rax] ;  rdi - 4  fd call far rax ;  rsi - 8  buf ;  rdx - 8  count ;    push rax ;     xor rax, rax ;  rax mov rdi, work ;   "It works" call printk ;   printk pop rax ;   rax ,     ret change: call unlockWP ;   ; rdi -  add rdi, 8 ; rdi - syscall_table + __NR_write mov rax, QWORD [rdi] ; rax - syscall_table[__NR_write] mov rbx , original mov QWORD [rbx], rax ;     mov rax, newwrite ;       mov QWORD [rdi], rax ;    call lockWP ;   ret unchange: call unlockWP ;   ; rdi -  add rdi, 8 ; rdi - syscall_table + __NR_write mov rbx, original ;  rbx    mov rax, QWORD [rbx] ; rax - syscall_table[__NR_write] mov QWORD [rdi],rax ;      call lockWP ;   ret unlockWP: mov rax, cr0 and rax, 0xfffffffffffeffff mov cr0, rax ret lockWP: mov rax, cr0 xor rax, 0x0000000000001000 mov cr0, rax ret SECTION .data original: DQ 0,0 work: DB "It works!",10,0 

makefile
 obj-m += kmod.o kmod-objs := module.o main.o KDIR := /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) module: nasm -f elf64 -o main.o main.asm make -C $(KDIR) SUBDIRS=$(PWD) modules make clean clean: rm -f *.o *mod.c *.symvers *.order 


рдпрджрд┐ рд╕рдм рдХреБрдЫ рдареАрдХ рд░рд╣рд╛, рддреЛ рд╕реНрд░реЛрдд рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╣рдореЗрдВ kmod.ko рдлрд╝рд╛рдЗрд▓ рдорд┐рд▓рддреА рд╣реИред рдпрд╣ рд╣рдорд╛рд░рд╛ рдХрд░реНрдиреЗрд▓ рдореЙрдбреНрдпреВрд▓ рд╣реИред рдЗрд╕рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕реЗ рдореЗрдореЛрд░реА рдореЗрдВ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ insmod _. рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ insmod _. рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЕрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрдорд╛рдВрдб rmmod _. рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ rmmod _. рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, dmesg рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ, рдЬрд┐рд╕рд╕реЗ рдХрд░реНрдиреЗрд▓ рд╕рдВрджреЗрд╢ рдмрдлрд░ рдХреЛ рдорд╛рдирдХ рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред

рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рдкреБрдирд╢реНрдЪ:
рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдХреА рдПрдХ рдЬреЛрдбрд╝реАред
рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд░рди

рдПрдХ рд╕рд╣рд╛рдпрдХ рдореЙрдбреНрдпреВрд▓ рдФрд░ рдПрдХ рдХрд░реНрдиреЗрд▓ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рд╕рдВрдХрд▓рди

рд╕реНрдореГрддрд┐ рдореЗрдВ рдПрдХ рдореЙрдбреНрдпреВрд▓ рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИ

рдЖрдЙрдЯрдкреБрдЯ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдХрд░реНрдиреЗрд▓ рд╕рдВрджреЗрд╢ рдмрдлрд╝рд░

рдореЗрдореЛрд░реА рд╕реЗ рдореЙрдбреНрдпреВрд▓ рдЙрддрд╛рд░рдирд╛

рдХрд░реНрдиреЗрд▓ рд╕рдВрджреЗрд╢ рдмрдлрд╝рд░ рдХреЛ рдкреБрди: рдЖрдЙрдЯрдкреБрдЯ рдХрд░реЗрдВ


рдЦреИрд░, рд╕реНрд░реЛрдд рдХреЗ рд╕рд╛рде рдЕрднрд┐рд▓реЗрдЦрд╛рдЧрд╛рд░ ред

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


All Articles