рдПрдВрдЯреА-рд╣реБрдХрд┐рдВрдЧ - рд╕рд┐рджреНрдзрд╛рдВрдд

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

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрд╡рд░реЛрдзрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЖрдорддреМрд░ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
  1. рдлрд╝рдВрдХреНрд╢рди рд╕реНрдерд╛рди рдкрд░ рдмрд┐рдирд╛ рд╢рд░реНрдд рдХреВрдж рдбрд╛рд▓реЗрдВ (x86 - 5 рдмрд╛рдЗрдЯреНрд╕ jmp addr, x64 - 12 рдмрд╛рдЗрдЯреНрд╕, рдореВрд╡ рд░реИрдХреНрд╕ рдПрдбреНрд░, jmp rax)
  2. рдореВрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рд╕реНрдерд╛рди рдкрд░ рдХреЙрд▓ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдирд╛ (hooked_function_entry: call my_function)
  3. рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЖрдпрд╛рдд рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕рдВрд╢реЛрдзрди, рдкреНрд░реЙрдХреНрд╕реА DLL рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред
  4. рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдмреНрд░реЗрдХрдкреНрд╡рд╛рдЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЛрдб рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдЕрд╡рд░реЛрдзрдиред
  5. Zw / Nt рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХрд░реНрдиреЗрд▓ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрд╡рд░реЛрдзрдиред

Usermode рд╕реЗ рдЕрд╡рд░реЛрдзрди рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдзрд┐рдпрд╛рдБ рд╕реВрдЪреАрдмрджреНрдз рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ:
1. рдорд╢реАрди рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдСрдкрдХреЛрдб рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рд╢реБрд░реБрдЖрдд рдХреА рддреБрд▓рдирд╛:

//0x90 - nop //0xE9 - jmp //0xE8 - call if (*mainFunc == 0xE9 || *mainFunc == 0x90 || *mainFunc == 0xE8 ...) printf("Hook detected"); 

рд╡рд┐рдзрд┐ рд╕реНрдерд┐рд░ рд╣реИ рдФрд░ рдЕрдзрд┐рдХ рдмреБрджреНрдзрд┐рдорд╛рди рд╕рдВрдХреНрд░рдордг рдХреЗ рд╕рд╛рде рдЖрд╕рд╛рдиреА рд╕реЗ рддрд┐рд░рд╕реНрдХреГрдд рд╣реИред
2. рдЕрд╡рд░реЛрдзрди рдХреЗ рдЙрдкрд░реЛрдХреНрдд рддрд░реАрдХреЗ рд╕реНрдореГрддрд┐ рдХрд╛ рдПрдХ рд╕рдВрд╢реЛрдзрди рд╣реИ, рдФрд░ рдЙрдиреНрд╣реЗрдВ crc рдЪреЗрдХрд╕рдо рдЪреЗрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрдореЛрд░реА рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдкреАрдЖрдИ рдХреЛ рднреА рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдПрдХ рдЧрд▓рдд рдкрд░рд┐рдгрд╛рдо рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛ред
3. рдорд╣рддреНрд╡рдкреВрд░реНрдг рдПрдкреА рдХреА рдмрд╣рд╛рд▓реА рдХреЗ рд╕рд╛рде рдПрдХ рдирд┐рдпрдВрддреНрд░рд┐рдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ (рд╕реНрд╡рдпрдВ рдХреА рд╕рдХреНрд░рд┐рдп рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд╕рд╛рде) рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВред
4. рд╕рд┐рд╕реНрдЯрдо рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рдирд┐рд░реНрдпрд╛рдд рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдПрдлрд╝реА рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реБрдП, рдореВрд▓ рдПрдХ рдХреЗ рд╕рд╛рде рдЕрд╕рдВрддреБрд╖реНрдЯ рдлрд╝рдВрдХреНрд╢рди рд▓рдВрдмрд╛рдИ рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВред
5. рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдмрд╛рдЗрдЯреНрд╕ рдХреЙрдкреА рдХрд░рдХреЗ рд╕рдВрд╢реЛрдзрд┐рдд рдПрдкреА рдХреЛ рдмрд╣рд╛рд▓ рдХрд░рдирд╛, рдПрдХ рдЙрджрд╛рд╣рд░рдг рдпреЛрдЬрдирд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
- рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЖрдзрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛
- рдирд┐рд░реНрдпрд╛рдд рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐
- рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдп рдХреЗ рдЖрд░рд╡реАрдП рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ред
- рд░реВрдкрд╛рдВрддрд░рдг RVA-> рдлрд╝рд╛рдЗрд▓рдСрдлрд╝рд╕реЗрдЯред
- рдореВрд▓ рдкрдврд╝рдиреЗ рдФрд░ рд╕реНрдореГрддрд┐ рдХреЗ рд▓рд┐рдП рд▓реЗрдЦрдиред
- рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд░реАрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдордд рднреВрд▓рдирд╛ред
6. рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЖрдпрд╛рдд рддрд╛рд▓рд┐рдХрд╛ рджреЗрдЦреЗрдВ рдФрд░, рдХрд┐рд╕реА рдЕрдиреНрдп рд╕рд┐рд╕реНрдЯрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЖрдпрд╛рддрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП, рдПрдХ рдЕрдиреБрдкрд╛рд▓рди рдЪреЗрдХ рдХрд░реЗрдВ, рдпрджрд┐ рдпрд╣ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдбрд┐рд╕реНрдХ рд╕реЗ рдкрдврд╝реЗрдВ рдФрд░ рдореЗрдореЛрд░реА рдореЗрдВ рд▓рд┐рдЦреЗрдВред
7. syscalls, int2e (рд╡рд┐рдВрдбреЛрдЬрд╝ рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдг) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Nt / Zw рдХреЗ рд╕рд┐рд╕реНрдЯрдо рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рд╕рд┐рдореБрд▓реЗрд╢рди, рд╕рднреА рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП syscall рддрд╛рд▓рд┐рдХрд╛ Google рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рдорд┐рд▓ рдЬрд╛рддреА рд╣реИред

рдЖрдЗрдП рд╣рдо 7 рд╡реАрдВ рд╡рд┐рдзрд┐ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ рдХреНрдпреЛрдВрдХрд┐ Nt / Zw рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рднреА рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рд╡рд┐рдзрд┐ рднреА рдПрдХрджрдо рд╕рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдпрд╣ рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдореЗрдВ рд╕реЗ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИред
рдЖрдЗрдП рд╡рд┐рдВрдбреЛрдЬ 7 sp1 рдореЗрдВ NtCreateFile рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рджреЗрдЦреЗрдВ

рдЫрд╡рд┐

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реЛрддрд╛ рд╣реИ:
- рдмрд╛рдЬ рдореЗрдВ рд╕рдВрдЦреНрдпрд╛ syscall-a рд╣реИред
- рдПрдХреНрд╕реНрдЯреЗрдВрд╢рди рд░реАрд╕реЗрдЯ рдХрд░реЗрдВ, (wow64 index?)ред
- edx рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рд╣реЛрддрд╛ рд╣реИред
- рдЖрдЧреЗ рдХреЙрд▓, рд╕реНрдЯреИрдХ рд╕рдорд╛рдпреЛрдЬрди рдФрд░ рд╡рд╛рдкрд╕реАред

win7 рдФрд░ win8 рдореЗрдВ x64 рдХреЙрд▓
рдЫрд╡рд┐

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд x86 рдЫрджреНрдо рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ "рдЖрдк рдбрд┐рд╕реНрдХ рдкрд░ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред"
 //  NtCreateFile typedef NTSTATUS (NTAPI * NTCREATEFILE) (OUT PHANDLE FileHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PIO_STATUS_BLOCK IoStatusBlock, IN PLARGE_INTEGER AllocationSize OPTIONAL, IN ULONG FileAttributes, IN ULONG ShareAccess, IN ULONG CreateDisposition, IN ULONG CreateOptions, IN PVOID EaBuffer OPTIONAL, IN ULONG EaLength); #define InitializeObjectAttributes( p, n, a, r, s ) { \ (p)->Length = sizeof( OBJECT_ATTRIBUTES ); \ (p)->RootDirectory = r; \ (p)->Attributes = a; \ (p)->ObjectName = n; \ (p)->SecurityDescriptor = s; \ (p)->SecurityQualityOfService = NULL; \ } typedef VOID (NTAPI * RTLINITUNICODESTRING)(IN OUT PUNICODE_STRING, IN PCWSTR); unsigned char dNtCreateFile[] = {0xb8,0x52,0x00,0x00,0x00,0x33,0xc9,0x8d,0x54,0x24,0x04,0x64, 0xff,0x15,0xc0,0x00,0x00,0x00,0x83,0xc4,0x04,0xc2,0x2c,0x00}; ... RtlInitUnicodeString InitializeObjectAttributes ... DWORD oldp; VirtualProtect(&dNtCreateFile, sizeof(dNtCreateFile), PAGE_EXECUTE_READ, &oldp); auto func = (NTCREATEFILE) ((void*)dNtCreateFile); Ntstatus = (func)(&fileHandle, DesiredAccess, ObjectAttritubes, ioStatusBlock, 0, FileAttributes, ShareAccess, CreateDisposition ,CreateOptions, Optional_Buffer, 0); 

рдпрд╣ рдЫрджреНрдо рдХреЛрдб рдХреЗрд╡рд▓ рд╡рд┐рдВрдбреЛрдЬрд╝ 7 sp1 рдкрд░ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рд╣рд╛рд▓рд╛рдБрдХрд┐, dNtCreateFile рдХреЛ рдмрд┐рдВрджреБ 5 рд╕реЗ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ "рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ" рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдорд╛рдореВрд▓реА рдмрджрд▓рд╛рд╡ рд╡рд╛рд▓рд╛ рдХреЛрдб winxp рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдкрд░ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдХрд┐рд╕реА рднреА рд╡рд┐рдЪрд╛рд░ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ, рдХрд░реНрдиреЗрд▓рдореЛрдб рдПрдХ рдЪрд░рдо рдорд╛рдорд▓рд╛ рд╣реИред

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


All Articles