гарантированный перехват API - возможен ли?
От: VasyaPS  
Дата: 11.03.10 08:19
Оценка:
Для моей задачи нужно перехватить часть функций API для определенного процесса, причем нужно чтобы этот процесс не смог вызвать оригинальные функции API в обход моей заглушки. Можно ли такого добиться?
Re: гарантированный перехват API - возможен ли?
От: VasyaPS  
Дата: 11.03.10 08:22
Оценка:
PS операционная система — WinXP и выше
Re: гарантированный перехват API - возможен ли?
От: 8086  
Дата: 11.03.10 08:52
Оценка:
Давайте поспорим, что напишу вызов функции которая обходит любой Ваш хук

На практике, *примерный* рейтинг "устойчивость" хуков по можно представить в виде следующего (неполного) списка:
— Модификация таблиц импорта/экспорта
— Патч на начало функции
— Патч не на начало функции (требует хорошее знакомство с устройством функции)
--- далее идут только системные вызовы ---
— Патч на диспатчер системных вызовов.
--- уровень ядра ---
— Хук через SSDT
— Хук на обработчик sysenter, патч обработчика sysenter
— Патч на функцию в ядре

Если нужна дополнительная инфа — оставтеь координаты. Есть море опыта в этой области.

VPS>Для моей задачи нужно перехватить часть функций API для определенного процесса, причем нужно чтобы этот процесс не смог вызвать оригинальные функции API в обход моей заглушки. Можно ли такого добиться?
Re[2]: гарантированный перехват API - возможен ли?
От: VasyaPS  
Дата: 11.03.10 09:18
Оценка:
Здравствуйте, 8086, Вы писали:

8>На практике, *примерный* рейтинг "устойчивость" хуков по можно представить в виде следующего (неполного) списка:


но возможность обойти хук все равно есть, для любого метода?
Re[3]: гарантированный перехват API - возможен ли?
От: 8086  
Дата: 11.03.10 09:33
Оценка: 1 (1)
VPS>но возможность обойти хук все равно есть, для любого метода?

Если заведомо известен как делается хук, обойти его просто. Если извстен способ обхода — можно переделать хук. Короче класические кошки-мышки.
Re: гарантированный перехват API - возможен ли?
От: ononim  
Дата: 11.03.10 11:29
Оценка:
VPS>Для моей задачи нужно перехватить часть функций API для определенного процесса, причем нужно чтобы этот процесс не смог вызвать оригинальные функции API в обход моей заглушки. Можно ли такого добиться?
Если юзер (и потенциальные программы) не админ, то гарантированно можно захукать нужный функционад в ядре, т.к. код грузить в ядро не-админ не может.
Если юзер админ — никаких гарантий.
Как много веселых ребят, и все делают велосипед...
Re[2]: гарантированный перехват API - возможен ли?
От: VasyaPS  
Дата: 11.03.10 11:42
Оценка:
Здравствуйте, ononim, Вы писали:

O>Если юзер (и потенциальные программы) не админ, то гарантированно можно захукать нужный функционад в ядре, т.к. код грузить в ядро не-админ не может.


А можно подробнее, в чем состоит метод?
Re[3]: гарантированный перехват API - возможен ли?
От: 8086  
Дата: 11.03.10 12:01
Оценка:
VPS>А можно подробнее, в чем состоит метод?

Хук делают на уровне ядра. Но практически все пользователь XP является администратором, значит программа сможет загрузить свой собственнюй драйвер для обхода хуков. В Висте и 7 при инсталяции программа попросит установить сервис, и если пользователь разрешит, опять таки можно загрузить драйвер.
Re[3]: гарантированный перехват API - возможен ли?
От: Dez  
Дата: 11.03.10 12:14
Оценка: 3 (1)
Здравствуйте, VasyaPS, Вы писали:

VPS>Здравствуйте, ononim, Вы писали:


O>>Если юзер (и потенциальные программы) не админ, то гарантированно можно захукать нужный функционад в ядре, т.к. код грузить в ядро не-админ не может.


VPS>А можно подробнее, в чем состоит метод?


Я делал так
писал DLL которая имела функцию с таким же прототипом как и перехватываемая функция.
Далее в режиме ядра получал указатель на физический адре памяти где хранится код функции (к примеру в kernel32.dll)
в режиме ядра копировал себе в память целое количество команд, для этого использовался простенький дизасамблер (более совершенное решение для этого есть в google-perftools)
а в памяти на месте функции делал что-то типа
загрузить мою либу, и вызвать мою функцию.

все
т.е. грубо говоря мы перехватываем MessageBox
я нахажу ее адрес физический, копирю некоторое количество байт к себе в библиотеку шаред память, а на место начала фунции пишу свой перехватчик.
все — хук готов.

Из вкусностей — метод можно отлаживать и не в режиме ядра, тогда при попытке записи в память занимаюмую библиотекой к примеру kernel32.dll операцинка делает копию этой либы специально для вашего процесса.

недеюсь понятно описал )))
Re[4]: гарантированный перехват API - возможен ли?
От: -prus-  
Дата: 11.03.10 12:22
Оценка: +1
Здравствуйте, 8086, Вы писали:

8>Хук делают на уровне ядра. Но практически все пользователь XP является администратором, значит программа сможет загрузить свой собственнюй драйвер для обхода хуков. В Висте и 7 при инсталяции программа попросит установить сервис, и если пользователь разрешит, опять таки можно загрузить драйвер.


ononim имел ввиду, что если на компьютере настроена грамотно политика безопасности или, более того, компьютер входит в домен, который грамотно администрируется, то тут врядли чего путного получится, только если через дырку в ОС.
С уважением,
Евгений
Re[4]: гарантированный перехват API - возможен ли?
От: ononim  
Дата: 11.03.10 12:29
Оценка:
Dez>Я делал так
Dez>писал DLL которая имела функцию с таким же прототипом как и перехватываемая функция.
Dez>Далее в режиме ядра получал указатель на физический адре памяти где хранится код функции (к примеру в kernel32.dll)
Dez>в режиме ядра копировал себе в память целое количество команд, для этого использовался простенький дизасамблер (более совершенное решение для этого есть в google-perftools)
Dez>а в памяти на месте функции делал что-то типа
Dez>загрузить мою либу, и вызвать мою функцию.
ээ нет. Я не это имел ввиду.
Если уж перехватывать в ядре MessageBox — то перехватывать соответствующий win32k.sys сервис, скорее всего NtUserCreateWindowEx.
А метод что вы описали — это просто юзермодный хук с подвыподвертом. Обходится на раз-два прямым вызовом в ядро или загрузкой копии user32.dll если впадла возится с системными вызовами.
Как много веселых ребят, и все делают велосипед...
Re[4]: гарантированный перехват API - возможен ли?
От: ononim  
Дата: 11.03.10 12:31
Оценка:
VPS>>А можно подробнее, в чем состоит метод?
8>Хук делают на уровне ядра. Но практически все пользователь XP является администратором
Это только домашние пользователи. В серъезных энтерпрайзах под админами пользователей не пускают даже в ХР.
Как много веселых ребят, и все делают велосипед...
Re[5]: гарантированный перехват API - возможен ли?
От: Dez  
Дата: 11.03.10 13:04
Оценка:
Здравствуйте, ononim, Вы писали:

Dez>>Я делал так

Dez>>писал DLL которая имела функцию с таким же прототипом как и перехватываемая функция.
Dez>>Далее в режиме ядра получал указатель на физический адре памяти где хранится код функции (к примеру в kernel32.dll)
Dez>>в режиме ядра копировал себе в память целое количество команд, для этого использовался простенький дизасамблер (более совершенное решение для этого есть в google-perftools)
Dez>>а в памяти на месте функции делал что-то типа
Dez>>загрузить мою либу, и вызвать мою функцию.
O>ээ нет. Я не это имел ввиду.
O>Если уж перехватывать в ядре MessageBox — то перехватывать соответствующий win32k.sys сервис, скорее всего NtUserCreateWindowEx.
O>А метод что вы описали — это просто юзермодный хук с подвыподвертом. Обходится на раз-два прямым вызовом в ядро или загрузкой копии user32.dll если впадла возится с системными вызовами.


Ээээ нет — вы не правы, читай выше — если это делать в режиме ядра — то фиг ты его обойдешь.
Re[5]: гарантированный перехват API - возможен ли?
От: Dez  
Дата: 11.03.10 13:10
Оценка:
Здравствуйте, ononim, Вы писали:

O>ээ нет. Я не это имел ввиду.

O>Если уж перехватывать в ядре MessageBox — то перехватывать соответствующий win32k.sys сервис, скорее всего NtUserCreateWindowEx.
O>А метод что вы описали — это просто юзермодный хук с подвыподвертом. Обходится на раз-два прямым вызовом в ядро или загрузкой копии user32.dll если впадла возится с системными вызовами.

тут дело в том что если ты патчишь либу в кернел моде — то все твои изменения сразуже отображаются на все процессы.
Так уж устроена винда
Re[6]: гарантированный перехват API - возможен ли?
От: -prus-  
Дата: 11.03.10 14:49
Оценка:
Здравствуйте, Dez, Вы писали:

Dez>тут дело в том что если ты патчишь либу в кернел моде — то все твои изменения сразуже отображаются на все процессы.

Dez>Так уж устроена винда

А разве нельзя снять такой хук тоже из ядра?
С уважением,
Евгений
Re[6]: гарантированный перехват API - возможен ли?
От: ononim  
Дата: 11.03.10 17:05
Оценка: 1 (1)
O>>ээ нет. Я не это имел ввиду.
O>>Если уж перехватывать в ядре MessageBox — то перехватывать соответствующий win32k.sys сервис, скорее всего NtUserCreateWindowEx.
O>>А метод что вы описали — это просто юзермодный хук с подвыподвертом. Обходится на раз-два прямым вызовом в ядро или загрузкой копии user32.dll если впадла возится с системными вызовами.
Dez>тут дело в том что если ты патчишь либу в кернел моде — то все твои изменения сразуже отображаются на все процессы.
Dez>Так уж устроена винда
Вы плохо знаете как устроена винды. Если я возьму свою копию user32.dll назову ее user33.dll загружу и буду использовать функции из нее — user32.dll не будет вызвана как и не будет вызван код ваших хуков.
Точно так же как ничего не мешает мне написать в своем коде sysenter и вызвать системных сервис напрямую в обход всех юзермодных длл и всех хуков в них тоже
Как много веселых ребят, и все делают велосипед...
Re[7]: гарантированный перехват API - возможен ли?
От: ononim  
Дата: 11.03.10 17:35
Оценка: 18 (4)
Здравствуйте, ononim, Вы писали:

O>>>ээ нет. Я не это имел ввиду.

O>>>Если уж перехватывать в ядре MessageBox — то перехватывать соответствующий win32k.sys сервис, скорее всего NtUserCreateWindowEx.
O>>>А метод что вы описали — это просто юзермодный хук с подвыподвертом. Обходится на раз-два прямым вызовом в ядро или загрузкой копии user32.dll если впадла возится с системными вызовами.
Dez>>тут дело в том что если ты патчишь либу в кернел моде — то все твои изменения сразуже отображаются на все процессы.
Dez>>Так уж устроена винда
O>Вы плохо знаете как устроена винды. Если я возьму свою копию user32.dll назову ее user33.dll загружу и буду использовать функции из нее — user32.dll не будет вызвана как и не будет вызван код ваших хуков.
O>Точно так же как ничего не мешает мне написать в своем коде sysenter и вызвать системных сервис напрямую в обход всех юзермодных длл и всех хуков в них тоже
если больше конкретики, вот код который под ХР SP3 создает окно в обход всех юзермодных длл:
struct User32String 
{
    ULONG Length;
    ULONG MaximumLength : 31;
    ULONG bAnsi : 1;
    PWSTR Buffer;
};
class User32StringWrap
{
    User32String _s;
public:
    User32StringWrap(const WCHAR*s)
    {
        _s.Length = wcslen(s)*sizeof(wchar_t);
        _s.MaximumLength = _s.Length + sizeof(wchar_t);
        _s.bAnsi = FALSE;
        _s.Buffer = wcsdup(s);
    }
    ~User32StringWrap()
    {
        free(_s.Buffer);
    }

    User32String *operator&()
    {
        return &_s;
    }

};
__declspec (naked) void __stdcall MySystemCall()
{
    __asm
    {
        mov edx, esp
        __emit 0fh
        __emit  34h
        ret
    }
}

__declspec (naked) HWND __stdcall MyCreateWindowW(
  DWORD dwExStyle,      // extended window style
  User32String *ClassName,  // registered class name
  User32String *Unknown, // window name
  User32String *WindowName, // window name
  DWORD dwStyle,        // window style
  int x,                // horizontal position of window
  int y,                // vertical position of window
  int nWidth,           // window width
  int nHeight,          // window height
  HWND hWndParent,      // handle to parent or owner window
  HMENU hMenu,          // menu handle or child identifier
  HINSTANCE hInstance,  // handle to application instance
  LPVOID lpParam,        // window-creation data
  DWORD secret
)
{
__asm
{
    mov     eax,1157h
    call MySystemCall
    ret     3Ch
}
}




void main()
{
    User32StringWrap cls(L"EDIT");
    User32StringWrap unknown(L"EDIT");
    User32StringWrap text(L"foo");
     HWND wnd = MyCreateWindowW(0, &cls, &cls, &text, WS_VISIBLE, 0, 0, 100, 100, 
         0, 0, ::GetModuleHandle(L"user32.dll"), 0, 0x40000400 );
     printf("wnd=0x%x le=%u\n", wnd, GetLastError());
     MSG m;
     while (::GetMessage(&m, 0, 0, 0)) ::DispatchMessage(&m);
}


код очень специфичен к системе, я его сделал для XP SP3 — на других ОС и сервиспаках а то и хотфиксах номера сервисов отличаются и он не сработает без изменения 1157h на правильный номер в данной ОС.
Как много веселых ребят, и все делают велосипед...
Re[4]: гарантированный перехват API - возможен ли?
От: Геннадий Майко США  
Дата: 11.03.10 20:14
Оценка:
Здравствуйте, Dez,

Dez>Я делал так

Dez>писал DLL которая имела функцию с таким же прототипом как и перехватываемая функция.
Dez>Далее в режиме ядра получал указатель на физический адре памяти где хранится код функции (к примеру в kernel32.dll)
Dez>в режиме ядра копировал себе в память целое количество команд, для этого использовался простенький дизасамблер (более совершенное решение для этого есть в google-perftools)
Dez>а в памяти на месте функции делал что-то типа
Dez>загрузить мою либу, и вызвать мою функцию.
--
Что произойдет, если некоторый поток в системе был остановлен где-то в середине копируемого участка, а затем получит управлеие после того, как на месте этого копируемого участка окажется новый код?

C уважением,
Геннадий Майко.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.