"powerfull anti-debug tricks" - о чем он ?

Тема в разделе "WASM.RESEARCH", создана пользователем WIN32, 17 май 2011.

  1. WIN32

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    https://community.qualys.com/blogs/securitylabs/2011/05/09/analysis-malware-win32rimecudb
    Кто может объяснить что это за трикс такой ? Почему в ядре надо хукать что то, для того чтобы обойти эту технику ?
     
  2. ntkernelspawn

    ntkernelspawn New Member

    Публикаций:
    0
    Регистрация:
    17 дек 2010
    Сообщения:
    61
    WIN32
    автор индус!
     
  3. Velheart

    Velheart New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    527
    Да не нужно ничего хукать, просто в отладчике вернуть, что исключение обработано
     
  4. WIN32

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    ntkernelspawn
    Курит индус, или по нац-сти индус? :)

    Velheart
    _ttp://ifolder.ru/23582380 такой же трикс только с WriteFile ? Или нет ?
     
  5. Hellspawn

    Hellspawn New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2006
    Сообщения:
    310
    Адрес:
    Москва
    да почти любая функа подойдёт, что работает с хендлом :) на клабе тема поднималась давненько.
     
  6. Velheart

    Velheart New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    527
    Это фишка с BaseSetLastNTError, про нее Clerk рассказывал подробно тут: http://wasm.ru/forum/viewtopic.php?pid=334993#p334993
     
  7. artkar

    artkar New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2005
    Сообщения:
    400
    Адрес:
    Russia
    Прикольно! Клерк знает фсё!
    Так это именно анти-дебаг? То есть при подключенном отладчике срабатывает? Что значит имеется отладочный порт (сорри не знаю что это)?
     
  8. Velheart

    Velheart New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    527
    чистый basesetlastnterror - антиэмуляция, closehandle - кагбэ антиотладка + есть нюансы по реакции отладчика на соотв сепшн, если first and second chance notification проигнорить я наблюдал status_success в zwcloze но беглый просмотр сорцов ядра чето ничего не обнаружил похожего, могу легко наврать
    а отладочный порт - это хрень которой представляется канал с отладчиком у отлаживаемого процесса, или даже скорее канал диспетчера исключений в ядре с отладчиком, ну это абстрактно и упрощенно
     
  9. WIN32

    WIN32 Member

    Публикаций:
    0
    Регистрация:
    20 янв 2007
    Сообщения:
    338
    Благодарю всех кто уделил свое время!
    P.S а почему забанили клерка ?
     
  10. Flint_ta

    Flint_ta New Member

    Публикаций:
    0
    Регистрация:
    25 май 2008
    Сообщения:
    312
    Занятная статья, даже наш криптор там засветилсо )
     
  11. gaeprust

    gaeprust New Member

    Публикаций:
    0
    Регистрация:
    2 май 2011
    Сообщения:
    188
    Сепшин почти любой сервис генерить может, при референсе на обьекте. Есть такая кульная штука как HANDLE_TRACE_DB_BADREF.
     
  12. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Velheart
    Не все так просто, т.к. трюк с CloseHandle может использоваться в сочетании с явным вызовом RiseException
    Здесь эта тема тоже обсуждалась (давненько) - тут пример, тут обсуждение
     
  13. gaeprust

    gaeprust New Member

    Публикаций:
    0
    Регистрация:
    2 май 2011
    Сообщения:
    188
    leo
    Всё более чем просто. Ядро кидает #STATUS_INVALID_HANDLE:
    Код (Text):
    1.         //  Now if the handle is not null and it does not represent the
    2.         //  current thread or process then if we're user mode we either raise
    3.         //  or return an error
    4.         //
    5.  
    6.         if ((Handle != NULL) &&
    7.             (Handle != NtCurrentThread()) &&
    8.             (Handle != NtCurrentProcess())) {
    9.  
    10.             if (PreviousMode != KernelMode) {
    11.  
    12.                 if ((NtGlobalFlag & FLG_ENABLE_CLOSE_EXCEPTIONS) ||
    13.                     (CurrentProcess->DebugPort != NULL) ||
    14.                     (ObjectTable->DebugInfo != NULL)) {
    15.  
    16.                     if (!KeIsAttachedProcess()) {
    17.                         return KeRaiseUserException (STATUS_INVALID_HANDLE);
    18.                     } else {
    19.                         return STATUS_INVALID_HANDLE;
    20.                     }
    21.  
    22.                 }
    При условии что установлен флаг FLG_ENABLE_CLOSE_EXCEPTIONS в конфиге, имеется отладочный порт, либо запущен логгер. KeRaiseUserException() извлекает T-фрейм, загружает туда ссылку на стаб KiRaiseUserExceptionDispatcher(), в стеке сохраняет адрес возврата в шлюз, загружает статус в TEB и больше ничего не делает. Возврат из сервиса произойдёт на стаб. Он передаёт возвращённый статус в RtlRaiseException(), таким образом разворачивает исключение.
    Важна модель вызова диспетчера - он вызывается не как диспетчер исключений, это обычный возврат из сервиса, но на новый адрес. Таким образом достаточно выполнить инструкцию Ret для возврата в шлюз(в KiRaiseUserExceptionDispatcher()), или просто занопить всё в этой процедуре. Ну есчо можно статус поправить в TEB.

    Зачем нужно лезть в ядерный отладчик совершенно не понятно.
     
  14. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    gaeprust
    Под "все не так просто" я имел в виду только то, что недостаточно в отладчике тупо обрабатывать все STATUS_INVALID_HANDLE без разбора, т.к. иначе можно попасться на другой трюк. Ну а то, что это можно обойти простыми\несложными довесками - и козе понятно (было еще в 2006 г.) ;)
     
  15. gaeprust

    gaeprust New Member

    Публикаций:
    0
    Регистрация:
    2 май 2011
    Сообщения:
    188
    leo
    По мойму вы всё слишком усложняете. Может быть не достаточно обойти в отладчике NtClose(кстате она может кидать сепшин если описатель защищён от закрытия), если отлаживаемое приложение вообще отладчик отключает(NtRemoveProcessDebug). Реально можно такой защиты навесить, что пользовательские отладчики будут бесполезными. Здесь же это не рассматривается и ТС ваши архисложные методу не нужны судя по всему.