X86-64 рдХреЗ рддрд╣рдд рд▓рд┐рдирдХреНрд╕ рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХрд╛ рдЕрд╡рд░реЛрдзрди

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



рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ x32 рдХреЗ рддрд╣рдд рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрдИ рд▓реЗрдЦ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВред рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ, x86-64 рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рддрд╣рдд рд▓реЛрдб рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдХрд░реНрдиреЗрд▓ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рдЖрдЗрдП рд╢реБрд░реВ:



рдЕрд╡рд░реЛрдзрдХ рдкреНрд░рдгрд╛рд▓реА рдХреЙрд▓



рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо:





рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдЯреЗрдмрд▓ рдкрддреЗ рдХреА рдЦреЛрдЬ рдХрд░реЗрдВ


рдкрд╣рд▓рд╛ рд╡рд┐рдХрд▓реНрдк: рдЗрдВрдЯрд░рдкреНрдЯ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ (рдЖрдИрдбреАрдЯреА) рдХреА рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЖрдИрдбреАрдЯреА - рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрдВрдЯрд░рдкреНрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЗрдВрдЯрд░рдкреНрдЯ рдирдВрдмрд░ рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдВрд░рдХреНрд╖рд┐рдд рдореЛрдб рдореЗрдВ, рднреМрддрд┐рдХ рдореЗрдореЛрд░реА рдореЗрдВ рдкрддрд╛ рдФрд░ рдЗрдВрдЯрд░рдкреНрдЯ рдЯреЗрдмрд▓ рдХрд╛ рдЖрдХрд╛рд░ 80-рдмрд┐рдЯ рдЖрдИрдбреАрдЯреАрдЖрд░ рд░рдЬрд┐рд╕реНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдВрд░рдХреНрд╖рд┐рдд рдореЛрдб рдореЗрдВ, рдЖрдИрдбреАрдЯреА рддрддреНрд╡ рдПрдХ 10-рдмрд╛рдЗрдЯ рдЗрдВрдЯрд░рдкреНрдЯ рдЧреЗрдЯрд╡реЗ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЗрдВрдЯрд░рдкреНрдЯ рд╣реИрдВрдбрд▓рд░, рдПрдХреНрд╕реЗрд╕ рд░рд╛рдЗрдЯреНрд╕ рдЖрджрд┐ рдХрд╛ рд╕реЗрдЧрдореЗрдВрдЯ (рддрд╛рд░реНрдХрд┐рдХ) рдкрддрд╛ рд╣реЛрддрд╛ рд╣реИ, рд╣рдо рдЗрд╕ рддрд░рд╣ рдХреА рд╡рд┐рдзрд┐ рдореЗрдВ рд░реБрдЪрд┐ рдирд╣реАрдВ рд░рдЦрддреЗ рд╣реИрдВред рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХрд╛ рдкрддрд╛ рдорд┐рд▓рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ x32 рдХреЗ рд╕рд╛рде рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ



рджреВрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред



рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдмрдбрд╝рд╛ рд╡рд┐рд╖рдпрд╛рдВрддрд░ рдирд╣реАрдВ: MSR - рдорд╢реАрди рд░рд╛рдЬреНрдп рд░рдЬрд┐рд╕реНрдЯрд░ рдЗрдВрдЯреЗрд▓ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИ рдЬреЛ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ x86 рдФрд░ x86-64 рдкрд░рд┐рд╡рд╛рд░ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпреЗ рд░рдЬрд┐рд╕реНрдЯрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рдЧрд░рд╛рдиреА рдФрд░ рд╕реВрдЪрдирд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рд╕рднреА рдПрдордПрд╕рдЖрд░ рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЗрд╡рд▓ рд╕рд┐рд╕реНрдЯрдо рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИрдВ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рд╕реЗ рд╕реБрд▓рдн рдирд╣реАрдВ рд╣реИрдВред рд╣рдо рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ: MSR_LSTAR - 0xc0000082 (рд▓рдВрдмреА рдореЛрдб SYSCALL рд▓рдХреНрд╖реНрдп)

(рдкреВрд░реА рд╕реВрдЪреА /usr/include/asm/msr-index.h рдореЗрдВ рджреЗрдЦреА рдЬрд╛ рд╕рдХрддреА рд╣реИ)ред

рдпрд╣ рд░рдЬрд┐рд╕реНрдЯрд░ x86-64 рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдкреНрдЯ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдкрддрд╛ рд░рдЦрддрд╛ рд╣реИред

рдЖрдк рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдкрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

int i, lo, hi;

asm volatile("rdmsr" : "=a" (lo), "=d" (hi) : "c" (MSR_LSTAR));

system_call = (void*)(((long)hi<<32) | lo);







рдЗрд╕рдХреЗ рдмрд╛рдж, рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдкрддрд╛ рдЦреЛрдЬреЗрдВред рдЪрд▓рд┐рдП рд╣рдо рдЕрднреА рдкреНрд░рд╛рдкреНрдд рдкрддреЗ рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рд╣рдорд╛рд░реА рдореЗрдореЛрд░реА рдореЗрдВ рдЕрдиреБрдХреНрд░рдо \ xff \ x14 \ xc5 рдкрд╛рддреЗ рд╣реИрдВ (рдпреЗ рдореИрдЬрд┐рдХ рдирдВрдмрд░ рд▓рд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдпрджрд┐ рдЖрдк рдХрд░реНрдиреЗрд▓ рдХреЛрдб рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, system_call рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХреЛрдб рдореЗрдВ, рдЬрд┐рд╕рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╕реЗ рд╣реИрдВрдбрд▓рд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рдЗрд╕рдХреЗ рдмрд╛рдж рдХреЗ 4 рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ syscall_table рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдЯреЗрдмрд▓ рдХрд╛ рдкрддрд╛ рдорд┐рд▓рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдкрддреЗ рдХреЛ рдЬрд╛рдирдХрд░, рд╣рдо рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ (рд╕рднреА рд╕рд┐рд╕реНрдЯрдо рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рдкрддреЗ) рдХреА рд╕рд╛рдордЧреНрд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░рдХреЗ рдХрд┐рд╕реА рднреА рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХрд╛ рдкрддрд╛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред

рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдЯреЗрдмрд▓ рдХрд╛ рдкрддрд╛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб:

unsigned char *ptr;

for (ptr=system_call, i=0; i<500; i++) {

if (ptr[0] == 0xff && ptr[1] == 0x14 && ptr[2] == 0xc5)

return (void*)(0xffffffff00000000 | *((unsigned int*)(ptr+3)));

ptr++;

}









рдирдИ рдкреНрд░рдгрд╛рд▓реА рдХреЙрд▓ рдХреЗ рдкрддреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди


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



рд╕реБрд░рдХреНрд╖рд╛ рдХреЛ рд╣рдЯрд╛рдиреЗ рдФрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: CR0 рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░реЗрдВ - рдЗрд╕рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рдХрдВрдЯреНрд░реЛрд▓ рдлреНрд▓реИрдЧ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдФрд░ рд╕реНрдерд┐рддрд┐ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред WP рдлреНрд▓реИрдЧ - рд░рд╛рдЗрдЯ рдкреНрд░реЛрдЯреЗрдХреНрд╢рди (рд░рд╛рдЗрдЯ рдкреНрд░реЛрдЯреЗрдХреНрдЯ), 48 рд╡рд╛рдВ рдмрд┐рдЯ CR0ред рдЬрдм рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рд┐рд╕реНрдЯрдо рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреГрд╖реНрдареЛрдВ рдкрд░ рд▓рд┐рдЦрдиреЗ рд╕реЗ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЬрдм WP рдзреНрд╡рдЬ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ)ред X32 рдХреЗ рд╡рд┐рдкрд░реАрдд, рдХреЗрд╡рд▓ рд░рдЬрд┐рд╕реНрдЯрд░ рдЖрдХрд╛рд░ рдФрд░ рдзреНрд╡рдЬ рд╕рдВрдЦреНрдпрд╛ рдмрджрд▓ рдЧрдИ рд╣реИ

рдЕрд╡рд╕рд╛рджрди рдХреЛрдб:

asm("pushq %rax");

asm("movq %cr0, %rax");

asm("andq $0xfffffffffffeffff, %rax");

asm("movq %rax, %cr0");

asm("popq %rax");







рд╕реБрд░рдХреНрд╖рд╛ рд╕рдХреНрд╖рдо рдХреЛрдб:

asm("pushq %rax");

asm("movq %cr0, %rax");

asm("xorq $0x0000000000001000, %rax");

asm("movq %rax, %cr0");

asm("popq %rax");









рдпрд╣ рдЬреНрдЮрд╛рди рд▓рд┐рдирдХреНрд╕ x86-64 рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдХреЛ рдпрд╣ рдорджрджрдЧрд╛рд░ рд▓рдЧреЗрдЧрд╛ред

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



рдпреБрдкреАрдбреА:



All Articles