программа запрещает ставить хуки

Тема в разделе "WASM.WIN32", создана пользователем ntp_, 1 дек 2008.

  1. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Flasher
    Насчёт запрета обработки апк замечаний вроде как нет, только плохой это способ.
    Метод с исключениями универсален и весьма прост. Смещать диспетчер исключений не нужно - код который его перехватывает наверно умеет делоть цепочки хэндлеров, поставь его как фрейм, говорил уже что можно VEH заюзоть, если первое не получаетсо. Не пойму чем тебе не нравится этот способ :P, как по мне так самое то.
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Flasher
    Вот код диспетчера, ставь как последний в цепочке VEH-фрейм:
    Код (Text):
    1. TEB_RETURN_FROM_SERVICE_OFFSET  equ (PAGE_SIZE - 4*8)   ;Думою коллизий не будет со смещением..
    2. .code
    3. comment '
    4. Перед вызовом сервиса необходимо загрузить адрес возврата из инструкции вызывающей сервис
    5. посредством Int2e в TEB по смещению TEB_RETURN_FROM_SERVICE_OFFSET. Атомарно это не нужно
    6. делоть, так как изменять каждый поток будет свой TEB. Диспетчер исключений должен сбрасывать
    7. флаг TF и возвращать управлние на текущую инструкцию если адрес её равен установленному в TEB.
    8. Иначе это попытка внедрения. Тоесть вызов сервиса выглядит как(для Sysenter не нужно загружать адрес):
    9.     [...]
    10.     push EFLAGS_TF
    11.     Call delta_
    12. delta_:
    13.     add dword ptr [esp],(offset break_ - offset delta_)
    14.     pop dword ptr fs:[TEB_RETURN_FROM_SERVICE_OFFSET]
    15.     popfd
    16.     int 2eh
    17.     nop
    18. break_:
    19.     [...]'
    20.    
    21. ;Устанавливаем диспетчер как векторный обработчик исключений.
    22. VectoredHandler proc uses ebx ExceptionPointers:PEXCEPTION_POINTERS
    23.     xor eax,eax
    24.     mov ebx,ExceptionPointers
    25.     assume ebx:PEXCEPTION_POINTERS
    26.     mov edx,[ebx].ExceptionRecord
    27.     assume edx:PEXCEPTION_RECORD
    28.     cmp [edx].ExceptionFlags,eax    ;Не фатальная ошибка.
    29.     jne exit_
    30.     cmp [edx].ExceptionCode,STATUS_SINGLE_STEP
    31.     jne exit_
    32. ;Исключение вызвано по возврату из севрса. Для сервиса вызванного посредством прерывания это адрес
    33. ;следующей за Int2e инструкции, посредством инструкции Sysenter это адрес в UsSharedData поле SystemCallRet.
    34. ;Поэтому пропускаем SystemCallRet.
    35.     assume fs:nothing
    36.     mov eax,KUSER_SHARED_DATA_ADDRESS + KUSER_SHARED_DATA.SystemCallRet
    37.     mov ecx,fs:[TEB_RETURN_FROM_SERVICE_OFFSET]
    38.     cmp [edx].ExceptionAddress,eax  ;Лучше былобы проверить версию системы, только для XPSP1 данная проверка.
    39.     je return_
    40.     mov eax,dword ptr [eax]
    41.     je return_
    42.     cmp [edx].ExceptionAddress,eax
    43.     je return_
    44.     cmp [edx].ExceptionAddress,ecx
    45.     je return_
    46. ;Эта процедура проверяет является ли апк чужой, тоесть поставлено в очередь не из текущего процесса.
    47. ;   invoke IsRemoteApc, [edx].ExceptionAddress
    48. ;   test eax,eax
    49. ;   jz return_
    50. ;Обнаружено внедрение. К примеру прибиваем процесс.
    51.     xor esp,esp
    52.     push eax   
    53. return_:
    54. ;Возвращаем управление на прерванную инструкцию, предварительно сбросив TF.
    55.     mov edx,[ebx].ContextRecord
    56.     assume edx:PCONTEXT
    57.     xor eax,eax
    58.     and [edx].regEFlags,Not EFLAGS_TF
    59.     dec eax ;EXCEPTION_CONTINUE_EXECUTION
    60. exit_:
    61.     ret
    62. VectoredHandler endp
    Остальное вроде всё гладко..
    Кстати оптимизировал GetSystemService(избавилсо от надоевших импортов) :
     
  3. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Clerk, спасибо, попробую разобраться :)
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Flasher
    Прошу прощенья, я затупил почемуто диспетчер, (вспомнил когда уже комп выключил). Ведь изза взведённого eflags.rf инструкция по адресу UsSystemCallRet вызовет исключение только после исполнения, тоесть диспетчер исключений получит его адрес равный значению на вершине стека, куда указывал регистр Edx перед вызовом сервиса(регистр Esp не имеет значения).
    Тоесть так:
    Код (Text):
    1. VectoredHandler proc uses ebx ExceptionPointers:PEXCEPTION_POINTERS
    2.     xor eax,eax
    3.     mov ebx,ExceptionPointers
    4.     assume ebx:PEXCEPTION_POINTERS
    5.     mov edx,[ebx].ExceptionRecord
    6.     assume edx:PEXCEPTION_RECORD
    7.     cmp [edx].ExceptionFlags,eax
    8.     jne exit_
    9.     cmp [edx].ExceptionCode,STATUS_SINGLE_STEP
    10.     jne exit_
    11.     assume fs:nothing
    12.     mov eax,fs:[TEB_RETURN_FROM_SERVICE_OFFSET]
    13.     cmp [edx].ExceptionAddress,eax
    14.     je return_
    15. ;   invoke IsRemoteApc, [edx].ExceptionAddress
    16. ;   test eax,eax
    17. ;   jz return_
    18.     xor esp,esp
    19.     push eax   
    20. return_:
    21.     mov edx,[ebx].ContextRecord
    22.     assume edx:PCONTEXT
    23.     xor eax,eax
    24.     and [edx].regEFlags,Not EFLAGS_TF
    25.     dec eax ;EXCEPTION_CONTINUE_EXECUTION
    26. exit_:
    27.     ret
    28. VectoredHandler endp
    Для Int2e модель вызова таже, для Sysenter соответственно такая:
    Код (Text):
    1.     [...]
    2.     push EFLAGS_TF
    3.     push dword ptr [edx]
    4.     pop dword ptr fs:[TEB_RETURN_FROM_SERVICE_OFFSET]
    5.     popfd
    6.     sysenter
    Вроде всё правильно(я совсем сдурел ппц..).
     
  5. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Ловлю KiUserExceptionDispatcher через InstallExceptionDispatcher и указываю на обработчик VectoredHandler.
    Ловлю KiFastSystemCall через SplaysKiFastSystemCall и указываю на обработчик

    Код (Text):
    1. KiFastSystemCallHandler:
    2.     assume fs:nothing
    3.     push EFLAGS_TF
    4.     Call delta_
    5. delta_:
    6.     add dword ptr [esp],(offset break_ - offset delta_)
    7.     pop dword ptr fs:[TEB_RETURN_FROM_SERVICE_OFFSET]
    8.     popfd
    9.     lea edx,dword ptr [esp+8]
    10.     int 2Eh
    11. break_:
    12.     ret
    Так ? :)
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Если InstallExceptionDispatcher() то диспетчера модель вызова другая, там есчо пользовательский параметр есть.
    Второе верно.