Есть ли способ проверить валидность хэндла в user mode?

Тема в разделе "WASM.WIN32", создана пользователем Asterix, 9 окт 2006.

  1. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
  2. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Вызвать DuplicateHandle(), передав параметром этот хэндл, и проверить возвращаемое значение на STATUS_INVALID_HANDLE.
     
  3. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    хорошая идея, спасибо
     
  4. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    GetHandleInformation (на NT+)
     
  5. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    green

    это даже покороче будет, меньше параметров у функции :)
    спасибо
     
  6. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Asterix
    Да и правильнее :)
     
  7. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    В ntdll.dll есть функция RtlIsValidHandle, должна помочь. Можно поискать нечто похожее в kernel32.dll.
     
  8. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    dr_dred
    Для неё нужна PRTL_HANDLE_TABLE.
     
  9. Avoidik

    Avoidik New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2004
    Сообщения:
    288
    Адрес:
    Russia
    [offtopic]
    предполагаю, что идёт доработка плагина HideDebugger для скрытия ольки от invalidhandlevalue?
    [/offtopic]
     
  10. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    IceStudent
    Прошу прощения, написал не проверив.
     
  11. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Кстати, почему-то Олли не игнорирует исключение, когда задаёшь ей в список игноров C0000008 :dntknw: Спасает только OllyAdvanced.
     
  12. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    IceStudent
    В том то и дело, что игнорирует - исключение остается необработанным и передается программе, а в отсутствие отладчика исключение при CloseHandle вообще не возникает
     
  13. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    А, если игнорировать, то отладчик-то всё равно присутствует и система знает об этом. Понятно.
     
  14. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    IceStudent
    OllyAdvanced просто обрабатывает С0000008, не делая останова на исключении . Это "спасает" от исключений на инвалидных CloseHandle и т.п., но зато приводит к неверной обработке явных RaiseException. Поэтому на полноценный HideDebugger эта фича не тянет, т.к. заменяет один баг на другой ;) По идее в обработчик исключения нужно еще добавить анализ адреса, чтобы отделить явные RaiseException от навязчивых виндовых автоисключений

    PS: хотя все эти фишки не спасают от обнаружения отладчика по rdtsc - обрабатывай, не обрабатывай исключение, а время выполнения инвалидного CloseHandle в любом случае под отладчиком получается в тысячи раз больше, чем без него
     
  15. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    винда не должна генерить исключение через RaiseException с параметром 0xС0000008 при отсутствии отладчика
     
  16. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Asterix
    Почему это ???
    ХРюша генерит. В msdn вроде тоже никаких ограничений нет (да и выглядели бы они ИМХО странно-недемократично ;)
     
  17. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    leo
    я забыл, это при invalid handle она не кидает RaiseException с параметром 0xС0000008
    если нет отладчика
     
  18. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    А кто его перехватывает?
     
  19. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    IceStudent
    Не понял ?!
    Поясняю о чем речь. При инвалидных операциях с хэндлами винда генерит исключение при наличии отладчика, и не генерит если отладчика нет. Но при явном вызове RaiseException(0C0000008h,...) исключение генерится в любом случае. Поэтому простейшая защита первым делом вызывает RaiseException(0C0000008h,...) - если исключения не было (т.е. управление не было передано в SEH-обработчик) значит сама Оля или OllyАdvanced его обработали -> прога под колпаком\каблуком и дальше проверять нечего ;) Если исключение было, то проверяем реакцию на CloseHandle(0DEADBEEFh и т.п.)
    Поэтому баг Оли в том, что она просто игнорирует все INVALID_HANDLE (выдает DBG_EXCEPTION_NOT_HANDLED), а баг OllyAdvanced в том, что он (плагин) их все без разбору обрабатывет (выдает DBG_CONTINUE). А по идее нужно по крайней мере проанализировать адрес исключения - если адрес принадлежит функции ntdll.KiRaiseUserExceptionDispatcher, значит это был автовызов из недр винды (или хитрая защита ;), иначе это явный вызов из проги
     
  20. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    leo
    Теперь разобрался.