рд▓рд┐рдирдХреНрд╕-рдХрд░реНрдиреЗрд▓ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдЕрд╡рд░реЛрдзрди

рдореЙрдбреНрдпреВрд▓ рдХреЛ 2010 рдХреЗ рд╡рд░реНрд╖ рдореЗрдВ рдореЗрд░реЗ рдорд╛рд╕реНрдЯрд░ рдереАрд╕рд┐рд╕ рдХреЗ рдПрдХ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдорд╛рд╕реНрдЯрд░ рдереАрд╕рд┐рд╕ рд╡рд┐рд╖рдп рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдХреАрд▓рд┐рдВрдЧ рд╣реИ ред рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ x64 рдЖрд░реНрдЪ рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдХреЗ рд▓рд┐рдП рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдерд╛, рдЦрд╛рд╕рдХрд░ рдХрд░реНрдиреЗрд▓ 2.6.34.7-61.fc13.x86_64 рдХреЗ рд▓рд┐рдПред


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


X32 рдЖрд░реНрдЪ рдХреЗ рд▓рд┐рдП рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдЗрдВрдЯрд░рд╕реЗрдкреНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓реЗрдЦ рдереЗред рдПрдХ рд╢реЛрдз рдХреЗ рдПрдХ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ, рдореБрдЭреЗ рд▓рд┐рдирдХреНрд╕-рдХрд░реНрдиреЗрд▓ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ x86_64 рдЖрд░реНрдЪ рдХреЗ рд▓рд┐рдП рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЛ рдХреИрд╕реЗ рд░реЛрдХрдирд╛ рд╣реИ, рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред


рд╣рдо рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреЛ рдХреИрд╕реЗ рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВ?


  1. Syscall рддрд╛рд▓рд┐рдХрд╛ рдкрддрд╛ рдЬреНрдЮрд╛рдд рдХрд░реЗрдВред
  2. рдореВрд▓ рдкреНрд░рдгрд╛рд▓реА рдХреЙрд▓ рдХреЛ рдирдП рджреНрд╡рд╛рд░рд╛ рдмрджрд▓реЗрдВред

Syscall рддрд╛рд▓рд┐рдХрд╛ рдкрддрд╛


IDT ( I nterrupt D escription T рд╕рдХреНрд╖рдо) рд╕реАрдорд╛ рдЕрд╡рд░реЛрдзрдХ рд╣реИрдВрдбрд▓рд░ рдФрд░ рд░реБрдХрд╛рд╡рдЯ рдХреЛрдб ред рд╕рдВрд░рдХреНрд╖рд┐рдд рдореЛрдб рдореЗрдВ, IDT рдореЗрдореЛрд░реА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╡рд░реНрдгрдирдХрд░реНрддрд╛рдУрдВ рдХрд╛ рдПрдХ рд╕рд░рдгреА рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЖрдИрдбреАрдЯреАрдЖрд░ рд░рдЬрд┐рд╕реНрдЯрд░ рд╣реЛрддрд╛ рд╣реИред рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ IDT рднреМрддрд┐рдХ рдкрддрд╛ рдФрд░ IDT рд▓рдВрдмрд╛рдИ рд╢рд╛рдорд┐рд▓ рд╣реИред рдкрд╣рд▓реА рдзрд╛рд░рдгрд╛ IDTR рд░рдЬрд┐рд╕реНрдЯрд░ рд╕реЗ IDT рдкрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдерд╛ рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж syscall рдЯреЗрдмрд▓ рдПрдбреНрд░реЗрд╕ рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рдерд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдзрд╛рд░рдгрд╛ рдЧрд▓рдд рдереА, рдХреНрдпреЛрдВрдХрд┐ рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╣рдореЗрдВ x32 рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдкрддрд╛ рдорд┐рд▓рд╛ред


рджреВрд╕рд░реА рдзрд╛рд░рдгрд╛ рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рдереАред рдЬрд╛рд░реА рд░рдЦрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ MSR (Macodell Specific R egister) рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдПрдХ MSR рдбрд┐рдмрдЧрд┐рдВрдЧ, рдкреНрд░реЛрдЧреНрд░рд╛рдо рдПрдХреНрдЬреАрдХреНрдпреВрдЯрд┐рд╡ рдЯреНрд░реЗрд╕рд┐рдВрдЧ, рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░рдлреЙрд░реНрдореЗрдВрд╕ рдореЙрдирд┐рдЯрд░рд┐рдВрдЧ рдФрд░ рдХреБрдЫ CPU рдлреАрдЪрд░реНрд╕ рдХреЛ рдЯреЙрдЧрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ x86 рдЗрдВрд╕реНрдЯреНрд░рдХреНрд╢рди рд╕реЗрдЯ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдХрдВрдЯреНрд░реЛрд▓ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд╕реЗ рдХреЛрдИ рд╣реИред MSR_LSTAR рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ - 0xc0000082 (рд▓рдВрдмреА рдореЛрдб SYSCALL рд▓рдХреНрд╖реНрдп)ред рдЖрдк рдкреВрд░реА рд╕реВрдЪреА /usr/include/asm/msr-index.h рдкрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


MSR_LSTAR рд╕реНрдЯреЛрд░ рд╕рд┐рд╕реНрдЯрдо 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 рдЦреЛрдЬ рд░рд╣рд╛ рдерд╛ред \xff\x14\xc5 рдПрдХ рдЬрд╛рджреБрдИ рд╕рдВрдЦреНрдпрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдХрд░реНрдиреЗрд▓ 2.6.34.7-61.fc13.x86_64 рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдлрд╝рдВрдХреНрд╢рди system_call , рддреЛ рдЖрдкрдХреЛ рдкрддрд╛ рдЪрд▓реЗрдЧрд╛ рдХрд┐ рдЕрдЧрд▓реЗ 4 рдмрд╛рдЗрдЯреНрд╕ syscall_table рдкрддреЗ рд╣реИрдВред


рд╣рдо syscall рдЯреЗрдмрд▓ рдПрдбреНрд░реЗрд╕ рдХреЛ рдЬрд╛рдирддреЗ рдереЗ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рдерд╛ рдХрд┐ рд╣рдо рдПрдХ syscall рд╣реИрдВрдбрд▓рд░ рдПрдбреНрд░реЗрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рд╕реНрд░реЛрдд рдХреЛрдб:


 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++; } 

рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдЗрдВрдЯрд░рд╕реЗрдкреНрд╢рди


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


  • рд╕реНрдореГрддрд┐ рд╕реБрд░рдХреНрд╖рд╛ рдЕрдХреНрд╖рдо рдХрд░реЗрдВред
  • рдПрдХ syscall рд╣реИрдВрдбрд▓рд░ рдкрддреЗ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗрдВред
  • рдореЗрдореЛрд░реА рд╕реБрд░рдХреНрд╖рд╛ рд╕рдХреНрд╖рдо рдХрд░реЗрдВред

рдпрджрд┐ рдЖрдк рд╕реНрдореГрддрд┐ рд╕реБрд░рдХреНрд╖рд╛ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП: рд░рдЬрд┐рд╕реНрдЯрд░ CR0 рдореЗрдВ рдЭрдВрдбреЗ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЭрдВрдбреЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддреЗ рд╣реИрдВред рдлреНрд▓реИрдЧ WP Write Protect , рдпрд╣ CR0 рдкрд░ 48 рд╡рд╛рдВ рдмрд┐рдЯ рд╣реИред


рд╕реНрдореГрддрд┐ рд╕реБрд░рдХреНрд╖рд╛ рдЕрдХреНрд╖рдо рдХрд░реЗрдВ:


 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"); 

рдирд┐рд╖реНрдХрд░реНрд╖



рдПрдХ рддрд░рдл, рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдЗрдВрдЯрд░рд╕реЗрдкреНрд╢рди рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рджреВрд╕рд░реА рдУрд░, рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ 2010 рдХреЗ рдмрд╛рдж рд╕реЗ рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓рд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рд╕реНрд░реЛрдд рдХреЛрдб github.com/ultral/linux-keylogger рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ ред


рдкреБрдирд╢реНрдЪ


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


All Articles