Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Антихукинг — теория

Anna | 25.06.2014 | нет комментариев
Совсем незадолго озадачился охраной приложений от перехвата системных api, решил поделится и обсудить то, к чему пришел. Многие из вас знают, что перехват системных api сводится к перенаправлению подлинной функции в необходимое место, вследствие этому дозволено модифицировать параметры функции, возвращать итог чудесный от оригинала, беречь подлинный вызов с параметрами и многое другое. Так как это теоретическая часть, примеры в статье будут сопровождаться псевдокодом.

Обыкновенно применяются следующие способы перехвата:

  1. Вставка абсолютного прыжка на месте функции (х86 — 5 байт jmp addr, x64 — 12 байт, mov rax addr, jmp rax)
  2. Вставка инструкции вызова (call) на месте вызова подлинной функции (hooked_function_entry: call my_function)
  3. Модификация таблицы импорта приложения, внедрение прокси DLL.
  4. Перехват без модификации кода средствами аппаратных точек останова (hardware breakpoints).
  5. Перехват через kernel драйвер Zw/Nt функций.

Дозволено перечислить следующие способы детектирования перехвата из usermode:
1. Сопоставление начала функции перед ее вызовом с опкодами машинных инструкций:

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

Способ неподвижный и легко обходится, больше разумными переходами.
2. Перечисленные способы перехвата — это модификация памяти, и они могут быть найдены по средствам crc checksum проверок, но api для чтения памяти тоже могут быть перехвачены и тогда будет возвращен неверный итог.
3. Порождать контролируемый процесс (с энергичной отладкой самого себя), с поправлением значимых api.
4. Перебор значимых для нас api, применяя таблицу экспорта в системных библиотеках, сопоставлять дизассемблированную длину функции с подлинной.
5. Поправление модифицированных api по средствам копирования байтов из библиотеки, приблизительная схема такая:
— приобретение базы определенного модуля
— итерация экспорта
— приобретение RVA нужной функции.
— реформирование RVA->FileOffset.
— чтение оригинала и запись в память.
— в некоторых случаях не забываем про релоки.
6. Просмотр таблицы импорта библиотеки и для всякой импортированной функции из иной системной библиотеки делать проверку на соответствие, если не совпадает так же читаем с диска и записываем в память.
7. Имитирование системных функций Nt / Zw по средствам syscall-ов, int2e в (ветхих версиях windows), таблица syscall-ов для всех систем, легко находится в гугле.

Остановимся на 7 способе так как Nt / Zw функции так же могут быть перехвачены, данный способ тоже далек от совершенства, но по моему суждению отменнее из каждого выше перечисленного.
Посмотрим на реализацию функции NtCreateFile в windows 7 sp1

image

происходит следующее:
— в еах лежит номер syscall-a.
— обнуляется ecx, (wow64 index?).
— в edx содержится указатель на параметры.
— дальше вызов, корректировка стэка и возврат.

x64 вызов в win7 и win8
image

При помощи дальнейшего 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);

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};
...
InitUnicodeString
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); 

Данный псевдокод будет трудиться только на windows 7 sp1, впрочем dNtCreateFile дозволено формировать «динамично», применяя способ из пункта 5, и тогда код с небольшими правками будет трудиться на всех системах начиная с winxp. Прив

 

Источник: programmingmaster.ru

 

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB