Антиотладка и антитрейсинг в ядре...

Тема в разделе "WASM.NT.KERNEL", создана пользователем zoool, 7 июл 2009.

  1. zoool

    zoool New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2007
    Сообщения:
    412
    Подскажите пару приемов...
    Нужно в простейшем случае противодействовать Syser-у и WinDbg-у
     
  2. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Ну что там Syser делает, я не знаю, никогда, честно говоря, им не пользовался, а с WinDbg просто - запроси у системы информацию об отладчике через ZwQuerySystemInformation() с классом SystemKernelDebuggerInformation и действуй дальше согласно своей логике. Если боишься, что NtQuerySystemInformation() может быть похукана, найди в памяти вот эти переменные:

    Код (Text):
    1. BOOLEAN KdDebuggerNotPresent = FALSE;
    2. BOOLEAN KdDebuggerEnabled = FALSE;
    И дальше опять же действуй согласно своей логике.
     
  3. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    zoool
    Выход из под трассировки - при входе в ISR сбрасывается TF. Использование - устанавливаем свой шлюз прерывания и генерируем исключение/прерывание, в обработчике восстанавливаем шлюз. Тем самым будет известен TF на момент исключения и его сброс. Альтернатива - замер времени исполнения.
     
  4. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    zoool
    IDT проверяй на наличие int1/int3 обработчиков, если перехвачены то можно посмотреть кем и соот-но определить какой отладчик установлен.
     
  5. SashaTalakin

    SashaTalakin New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2008
    Сообщения:
    261
    TSS
    у греата отладчик их не перехватывает for example
     
  6. SashaTalakin

    SashaTalakin New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2008
    Сообщения:
    261
    вообще тут конечно раздолье полное придумывай во что горазд.
     
  7. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    SashaTalakin
    А как он трассировку делает без перехвата инт1?
     
  8. SashaTalakin

    SashaTalakin New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2008
    Сообщения:
    261
    TSS
    нативный кернел дебагер помоему тоже ничего не перехватывает. перехват идет на уровне коллбеков для исключений на уровне ос
     
  9. je_

    je_ New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    143
    мдяюю
     
  10. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    SashaTalakin
    Угу, забыл совсем что ОС предоставляет механизмы для отладки.

    Ну в таком случае смотреть KiDebugRoutine, если отлична от нуля то WinDbg не запущен.
     
  11. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    Т.е. если ноль то незапущен.
     
  12. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Пример выхода из под трассировки:
    Код (Text):
    1. $LOAD macro Reg32, Variable
    2. Local dt_
    3.     Call dt_
    4. dt_:
    5.     pop Reg32
    6.     mov Reg32,dword ptr [Reg32 + (offset Variable - offset dt_)]
    7. endm
    8.  
    9. $SAVE macro Variable, Value
    10. Local dt_
    11.     Call dt_
    12. dt_:
    13.     pop edi
    14.     mov dword ptr [edi + (offset Variable - offset dt_)],Value
    15. endm
    16.  
    17. $GET_REF macro Reg32, Variable
    18. Local dt_
    19.     Call dt_
    20. dt_:
    21.     pop Reg32
    22.     lea Reg32,dword ptr [Reg32 + (offset Variable - offset dt_)]
    23. endm
    24.  
    25. ; o IF сброшен(прерывания замаскированы) перед генерацией исключения.
    26. ; o TF сбрасывается при входе в ISR.
    27. ; o Возможно обработчик трассируется, изменять дескриптор одной инструкцией.
    28. InterruptServiceRoutine macro InterruptNumber
    29. ;[Esp]: rEip
    30. ;       rCs
    31. ;       rEFlags
    32. ISR::
    33.     pushad
    34. ; Восстанавливаем дескриптор.
    35.     sub esp,2*4 ; С учётом выравнивания выделяем место для IDTR.
    36.     xor eax,eax
    37.     xor edx,edx
    38.     sidt [esp]
    39.     mov esi,dword ptr [esp + 2] ; База IDT.
    40. ;[Mem64]<>Edx:Eax -> Edx:Eax<-[Mem64]
    41.     lock cmpxchg8b qword ptr [Esi + 8*InterruptNumber]
    42.     add esp,2*4
    43.     $LOAD Ebx, GL_IdtGateLo
    44.     $LOAD Ecx, GL_IdtGateHi
    45. ;[Mem64]==Edx:Eax -> [Mem64]<-Ecx:Ebx
    46.     lock cmpxchg8b qword ptr [Esi + 8*InterruptNumber]
    47.     and dword ptr [esp + 2*4 + 4*8],EFLAGS_TF
    48.     popad
    49.     shr dword ptr [esp + 2*4],8 ; TF -> CF
    50.     iretd
    51. endm
    52.  
    53. clt macro InterruptNumber
    54.     pushad
    55.     cli
    56. ; Устанавливаем ISR.
    57.     sub esp,2*4
    58.     xor eax,eax
    59.     xor edx,edx
    60.     sidt [esp]
    61.     mov esi,dword ptr [esp + 2]
    62.     lock cmpxchg8b qword ptr [Esi + 8*InterruptNumber]
    63.     $GET_REF Ebx, ISR
    64.     $SAVE GL_IdtGateLo, Eax
    65.     mov ecx,ebx
    66.     $SAVE GL_IdtGateHi, Edx
    67. ; Формируем дескриптор.
    68.     and ebx,00000FFFFH
    69.     and ecx,0FFFF0000H
    70.     or ebx,KGDT_R0_CODE*10000H
    71.     or ecx,1000111000000000B
    72.     add esp,2*4
    73.     lock cmpxchg8b qword ptr [Esi + 8*InterruptNumber]
    74. ;   push EFLAGS_TF
    75. ;   popfd
    76.     int InterruptNumber
    77.     popad
    78.     jmp Return
    79. Align 4
    80.     InterruptServiceRoutine InterruptNumber
    81. Align 4
    82. ; Предыдущий дескриптор.
    83. GL_IdtGateLo    DWORD ?
    84. GL_IdtGateHi    DWORD ?
    85. Return:
    86. endm
    Собственно вызов:
    Код (Text):
    1.     clt 0F0h
    2.     ret
    После возврата из прерывания шлюз восстановлен, прерывания замаскированы(следует размаскировать при необходимости), TF сброшен, предыдущее значение TF в CF, RGP без изменений.
    Пикод, для 0xF0 шлюза:
    Код (Text):
    1. db 060h, 0FAh, 083h, 0ECh, 008h, 033h, 0C0h, 033h, 0D2h, 00Fh
    2. db 001h, 00Ch, 024h, 08Bh, 074h, 024h, 002h, 0F0h, 00Fh, 0C7h
    3. db 08Eh, 080h, 007h, 000h, 000h, 0E8h, 000h, 000h, 000h, 000h
    4. db 05Bh, 08Dh, 05Bh, 046h, 0E8h, 000h, 000h, 000h, 000h, 05Fh
    5. db 089h, 087h, 081h, 000h, 000h, 000h, 08Bh, 0CBh, 0E8h, 000h
    6. db 000h, 000h, 000h, 05Fh, 089h, 097h, 077h, 000h, 000h, 000h
    7. db 081h, 0E3h, 0FFh, 0FFh, 000h, 000h, 081h, 0E1h, 000h, 000h
    8. db 0FFh, 0FFh, 081h, 0CBh, 000h, 000h, 008h, 000h, 081h, 0C9h
    9. db 000h, 08Eh, 000h, 000h, 083h, 0C4h, 008h, 0F0h, 00Fh, 0C7h
    10. db 08Eh, 080h, 007h, 000h, 000h, 0CDh, 0F0h, 061h, 0EBh, 04Ch
    11. db 060h, 083h, 0ECh, 008h, 033h, 0C0h, 033h, 0D2h, 00Fh, 001h
    12. db 00Ch, 024h, 08Bh, 074h, 024h, 002h, 0F0h, 00Fh, 0C7h, 08Eh
    13. db 080h, 007h, 000h, 000h, 083h, 0C4h, 008h, 0E8h, 000h, 000h
    14. db 000h, 000h, 05Bh, 08Bh, 05Bh, 024h, 0E8h, 000h, 000h, 000h
    15. db 000h, 059h, 08Bh, 049h, 01Fh, 0F0h, 00Fh, 0C7h, 08Eh, 080h
    16. db 007h, 000h, 000h, 081h, 064h, 024h, 028h, 000h, 001h, 000h
    17. db 000h, 061h, 0C1h, 06Ch, 024h, 008h, 008h, 0CFh, 000h, 000h
    18. db 000h, 000h, 000h, 000h, 000h, 000h, 0C3h
     
  13. Clerk

    Clerk Забанен

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

    Folk Acid New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2005
    Сообщения:
    432
    Адрес:
    Ukraine
    Могу предложить вариант: Создаем два потока. Один генерит 32битный блочный шифр и периодически его обновляет. Второй поток брутфорсит этот шифр и расшифровывает им секцию. После расшифровки секция исполняется, после чего оба потока меняются ролями. Размер секций и рабочего кода потоков подбирается из рассчета размера кеша процессора. При отладке наверняка произойдет вытеснение рабочего кода из кеша и рассинхронизация.
     
  15. SashaTalakin

    SashaTalakin New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2008
    Сообщения:
    261
    Clerk
    ты знаешь что такое p-code хотя б?
    zoool
    у клерка паршивый способ, во-первых он только для систем без патчгуарда и естественно только для 32 бит, во-вторых брать и патчить первый попавшийся вектор в idt только чтобы сбросить с себя трассировку это признак очень завышенной самооценки (мне навалить на всё по в системе лишь бы меня не трассировали) которой по непонятным причинам страдает автор поста #12
     
  16. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    SashaTalakin
    Да, я видимо первый дал определение пикоду - Position Independent Code(перемещаемый код - для которого не имеет значение смещения в сегменте).
    Предложите не лучший, а хотябы любой способ. Кроме негативных коментов ни разу от вас ничего не слышал на этом форуме, считаю что вас следует забанить кстате.
     
  17. SashaTalakin

    SashaTalakin New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2008
    Сообщения:
    261
    Clerk, ты типа как bugaga - свои собственные определения придумываешь к словам которые уже давно вхожи в терминологию программистов (у него это слово "скрипт") и имеют вполне конкретный смысл.

    Если код в ядре то тут этих способов миллион и тележка. Никогда не увлекался ни реверсингом ни антиреверсингом, поэтому чего-то изощренного выдавать не буду. Ну как пример взять сбросить пропатчить дебаг контрол мср регистр на трассировку ветвлений и ненавящиво так проверить пропатчить eflags где-нибудь между двумя соседними ветвлениями. да куча тут способов
     
  18. SashaTalakin

    SashaTalakin New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2008
    Сообщения:
    261
    тока не сбросить дебаг контрол точнее а взвести там trace on branch бит
     
  19. je_

    je_ New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    143
    вопрос задан очень обобщённый. не заслуживает ответа, кромя "ищи в инете"..
    ну или 4-х ответов SashaTalakin-а. Ж)

    SashaTalakin, перечтите ваши посты без остонова, Ы!?
     
  20. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    SashaTalakin
    Синоним в студию.
    Примеры в студию, если нет - нах отсюда уроки делоть.)