Хук в SDT

Тема в разделе "WASM.BEGINNERS", создана пользователем Aspire, 31 май 2008.

  1. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Доброй ночи всем.
    Перехватываю nOpenProcess по Рему. Когда после загрузки драйвера пытаюсь убить заданный процесс, пришет "отказано в доступе", но при попытке закрыть любой другой процесс, пишет : "error terminate process: неверный хендл". Что за шляпа?
    Вот код обработчика:
    Код (Text):
    1. newOpenProcess proc ProcessHandle:dword, access_mask:dword, pobject_attribute:dword, pclient_id:dword
    2. pushad
    3. mov eax, pclient_id
    4. .if eax > MmUserProbeAddress    ; если переменная указывает на ядерный адрес, то возвращаем ошибку
    5.     popad
    6.     mov eax, STATUS_INVALID_PARAMETER
    7.     ret
    8. .endif
    9. mov eax,dword ptr [eax]
    10. cmp eax, 1836   ; ID процесса
    11. jne @f
    12. popad
    13. mov eax, STATUS_ACCESS_DENIED
    14. ret
    15.  
    16. @@:
    17. popad
    18. push trueOP
    19. ret     ;переходим на правильную ф-цию ntOpenProcess
    20. newOpenProcess  endp
    Что то совсем туго уже к ночи соображается...
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    По умолчанию инструкция ret в процедуре компилируется в retn NumberParameters*4
     
  3. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Clerk Обна... Т.е., лучше сделать Так:
    Код (Text):
    1. mov eax,trueOP
    2. call eax
    3. ret
    Вроде так ? Ща проверю..

    Теперь при закрытии др процесса выдает: "Error opening process: Неверная попытка доступа к адресу памяти."
    Всё..пипец..спать.
     
  4. Colibri

    Colibri New Member

    Публикаций:
    0
    Регистрация:
    8 май 2008
    Сообщения:
    117
    Aspire
    нет не так

    на входе 4 параметра! Значит на выходе тебе нужно вытолкнуть из стека 4 дворда! т.е. 16 байт!

     
  5. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    Clerk
    только одна. То-ли первая встреченая, то-ли последняя.
     
  6. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Спасибо, nester7!

    Colibri Медитирую...

    _basmp_ Вот, еще бы поточнее, чтоб запомнить раз и навсегда...
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Я никогда не понимал, зачем все любят такой изврат с push XXX/retn ?
    Чем не устраивает обычный jmp imm32 ?
     
  8. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Неустраивает потомучто придётся считать смещения.
    Выталкивать из стека ничего не надо(ну кроме адреса перехода).
    Код (Text):
    1. push trueOP
    2. retn 0  ;переходим на правильную ф-цию ntOpenProcess
    Но всёравно код слишком кривой. Определяй процедуру как proc C без параметров и сам считай их в стеке.
     
  9. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Код (Text):
    1. mov ecx, Imm32
    2. jmp ecx
     
  10. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Colibri
    Все еще медитирую. Возможности проверить нет, поскольку нахожусь на работе сейчас.
    Но понимаю вот что: если мы пытаемся открыть другой процесс, то первые два ret'a просто пролетаются.

    Great
    Я просто не уверен,что если я напишу:
    Код (Text):
    1. mov eax,trueOP
    2. jmp eax
    ;
    то компилятор соберет то, что мне нужно...
     
  11. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    [esp+16]: ClientId
    [esp+12]: ObjectAttributes
    [esp+8]: DesiredAccess
    [esp+4]: ProcessHandle
    [esp]: Address return from call

    HANDLER_PARAMETERS struct
    Return PVOID ?
    ProcessHandle HANDLE ?
    DesiredAccess ACCESS_MASK ?
    ObjectAttributes POBJECT_ATTRIBUTES ?
    ClientId PCLIENT_ID ?
    HANDLER_PARAMETERS ends
    PHANDLER_PARAMETERS typedef ptr HANDLER_PARAMETERS

    PROTECT_PID equ 1836

    NtOpenProcessHandler proc C
    ;ClientId может быть NULL, если процесс открывается по имени. Здесь открываем только через явно заданный PID.
    lea edx,[esp]
    assume edx:PHANDLER_PARAMETERS
    mov ecx,[edx].ClientId
    mov eax,STATUS_INVALID_PARAMETER
    cmp MmUserProbeAddress,ecx
    jnc return_
    mov eax,STATUS_ACCESS_DENIED
    cmp CLIENT_ID.UniqueProcess[ecx],PROTECT_PID
    je return_
    push OriginalHandler
    retn 0
    return_:
    retn 4*4
    NtOpenProcessHandler endp
     
  12. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Clerk
    Это я еще не проходил, но ошибка вылезала даже если я снова запихиваю все параметры в стек, а потом прыгаю на тру-функцию.
    Посчитать в стеке параметры, наверное это правильно... Можно поподробней?

    Упс..уже вижу. Сенкс!
     
  13. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    В стеке уже сформировано всё, а ты изменяешь стек, определяе stdcall прототип функции.
    Я привёл код, как и должно писать одработчик.
     
  14. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    проверил. похоже что сбрехал/оговорил.
     
  15. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Я тоже с этой особенностью компилятора сталкнулся первый раз лет 5 назад, помню в процедуре заливки фигуры.
     
  16. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Прям так сложно два вычитания сделать, да? =)
     
  17. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Мне нет :)
     
  18. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Значит, push-ret - это извраты, по Вашему, а делать два вычитания - это не извраты. А ради чего?
     
  19. Clerk

    Clerk Забанен

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

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Aspire
    Ради выйгрыша в 1 байт и красивости jmp ;)