DetectHypervisor

Тема в разделе "WASM.SOURCES & 2LZ", создана пользователем Ahimov, 3 май 2025.

  1. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    503
    galenkane,

    Поведение зависит от адреса процедуры. Почему так хз, нужны ещё тесты что бы выяснить.
     
  2. galenkane

    galenkane Active Member

    Публикаций:
    1
    Регистрация:
    13 янв 2017
    Сообщения:
    428
    ок
     
  3. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    503
    galenkane,

    Я хотел в динамике определить, но это так просто не работает:

    Код (Text):
    1. ; 1st thread.
    2. ;P:
    3. ;    mov eax,12345678
    4. ;    mov edx,87654321
    5.  
    6. ; 2st thread.
    7. ;    mov eax,33BA8765h
    8. ;    xchg D[P][3],eax
    9. ;        -->
    10. ;    mov eax,87655678
    11. ;    mov edx,87654333
    12.  
    13. PIPE_MAX    equ 61+64    ; Pipeline max(61)
    14. SHED_MAX    equ 16    ; Quant's
    15.  
    16. Pp:    ; mb align 64
    17.     dw PIPE_MAX dup (0C031h)    ; inc eax
    18. Pipeline proc C
    19. P::
    20.     mov eax,12345678h
    21.     mov edx,87654321h
    22.  
    23.     .if ((Eax == 12345678h) && (Edx != 87654321h)) || ((Eax == 87655678h) && (Edx != 87654333h))
    24.         int 3
    25.         not edi
    26.         lea eax,[edi][PIPE_MAX][1]
    27.         jmp Exit
    28.     .endif
    29.  
    30. ; Wait for end-of-quantum.
    31.     mov ax,fs
    32.     .if Ax == 53h        ; WOW
    33.         xor eax,eax
    34.         mov fs,ax
    35.         .repeat
    36.             mov ax,fs
    37.         .until Ax
    38.     .else            ; Native
    39.         fwait
    40.         .repeat
    41.             smsw ax
    42.             test ax,1000B
    43.         .until !Zero?
    44.     .endif
    45.  
    46. ;    push offset Pp
    47. ;    retn
    48.     dec esi
    49.     jnz Sjmp
    50.     mov esi,SHED_MAX    ; Quant's
    51.     dec ebx        ; P
    52.     dec ebx        ; P
    53.     dec edi        ; Length
    54.     jnz Sjmp
    55.     xor eax,eax
    56. Exit:
    57.     mov Psize,eax
    58.     popad
    59.     ret 4        ; ~Arg
    60. Pent::
    61.     lea ebx,P
    62.     mov esi,SHED_MAX
    63.     mov edi,PIPE_MAX
    64. Sent:
    65.     pushad
    66. Sjmp:
    67.     jmp Ebx
    68. Pipeline endp
    --- Сообщение объединено, 6 май 2025 ---
    Pp:
    dw PIPE_MAX dup (0C031h)
    Pipeline proc C
    - останов.

    nop
    Pp:
    - останов.

    nop
    nop
    Pp:
    - останов.

    nop
    nop
    nop
    Pp:
    - бесконечный цикл.
    --- Сообщение объединено, 6 май 2025 ---
    И ещё не понятное. Этот семпл выше не корректный, но при отладке он работает, хотя не должен так. Происходит ожидание окончания поточного кванта, затем должен быть цикл на переменных. Но, без такого цикла в течении ~5 квантов происходит останов. Как это такое может быть опять же хз.
     
    Последнее редактирование: 6 май 2025
  4. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    503
    Если Gemini дать дамп, обьясняет подробно, теперь стало понятно как это работает.

    На счет конструкции:
    Код (Text):
    1.     jz      short loc_911C1F
    2.     dec     edx
    3.     jz      short loc_911C1F
    4.     dec     edx
    5.     jz      short loc_911C1F
    6.     dec     edx
    7. loc_911C1F:
     
    Последнее редактирование: 23 ноя 2025
  5. galenkane

    galenkane Active Member

    Публикаций:
    1
    Регистрация:
    13 янв 2017
    Сообщения:
    428
    в курсор дамп надо пихать . cursor (ide) там поиск по файлам будет
     
  6. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    503
    По #23:
     
    Treant и Application нравится это.
  7. galenkane

    galenkane Active Member

    Публикаций:
    1
    Регистрация:
    13 янв 2017
    Сообщения:
    428
    Формально дефект (в контексте данной системы защиты) происходит не как «ошибка» в коде, а как **нарушение инварианта временной области**.
    Вот формальное объяснение того, как система детектирует вмешательство, разбитое на логические уровни:
    ### 1. Формальная модель времени
    Система опирается на два источника времени:
    * [math]T_{hw}[/math]: Аппаратный счетчик (`CNTVCT_EL0`). Он тикает с частотой процессора и **не может быть остановлен** программно из пользовательского режима.
    * [math]T_{sw}[/math]: Системное время ОС (`KUSER_SHARED_DATA` или API). Оно зависит от планировщика задач и может быть изменено или «заморожено» отладчиком.
    **Нормальное состояние (Инвариант):**
    Разница между временем начала ([math]t_1[/math]) и конца ([math]t_2[/math]) выполнения элементарной операции должна укладываться в детерминированный интервал [math]\Delta t_{norm}[/math]:
    [math]\Delta t = T_{hw}(t_2) - T_{hw}(t_1) \leq Threshold[/math]
    Где [math]Threshold[/math] — это максимально допустимое количество тактов для данной инструкции без учета прерываний.
    ---
    ### 2. Механизм возникновения дефекта (Атака)
    Дефект возникает, когда внешний агент (отладчик, эмулятор, хук) нарушает поток выполнения инструкции.
    #### Сценарий А: Пошаговая отладка (Single-Stepping) — Tier 1
    * **Действие атакующего:** Отладчик ставит точку останова или включает режим пошагового выполнения (`TF` флаг в регистре статуса). Процессор после каждой инструкции генерирует исключение, передавая управление отладчику.
    * **Физический эффект:**
    1. Выполняется инструкция `ReadCNTVCT_EL0` (начало).
    2. Выполняется целевая инструкция (например, `XOR`).
    3. **Срыв потока:** Вместо немедленного выполнения следующей инструкции, процессор останавливается, сохраняет контекст, переключается в кольцо ядра/отладчика, ждет действия пользователя.
    4. Проходят тысячи или миллионы тактов.
    5. Выполняется инструкция `ReadCNTVCT_EL0` (конец).
    * **Результат измерения:**
    [math]\Delta t_{attack} = T_{hw}(end) - T_{hw}(start) \gg Threshold[/math]
    Поскольку [math]T_{hw}[/math] продолжает тикать, пока отладчик «думает», разница становится аномально большой.
    * **Вердикт:** `TIME_CHECK_FATAL` срабатывает, так как условие [math]\Delta t \leq Threshold[/math] ложно.
    #### Сценарий Б: Заморозка потока (Freezing) — Tier 2
    * **Действие атакующего:** Отладчик ставит обычную точку останова (Breakpoint). Поток выполнения останавливается полностью на неопределенное время.
    * **Физический эффект:**
    * [math]T_{sw}[/math] (системное время в памяти): Часто обновляется по таймеру или при возврате управления. Если поток заморожен, значение в памяти может устареть или обновляться иначе.
    * [math]T_{hw}[/math] (аппаратный счетчик): Продолжает расти линейно.
    * **Расчет дрейфа (Drift):**
    Система сравнивает «грубое» время (из памяти) и «точное» время (из железа) в момент возврата управления:
    [math]Drift = | T_{precise} - T_{coarse} |[/math]
    В норме дрейф минимален (< 200 мкс). При заморозке на 5 секунд:
    [math]Drift_{attack} \approx 5,000,000 \text{ мкс}[/math]
    * **Вердикт:** Если [math]Drift > Threshold[/math], фиксируется манипуляция временем.
    #### Сценарий В: Эмуляция/Виртуализация — Tier 3
    * **Действие атакующего:** Код выполняется в виртуальной машине (QEMU, эмулятор), где доступ к железу эмулируется гипервизором.
    * **Физический эффект:**
    * На реальном железе интервалы между чтениями счетчика имеют случайный шум (джиттер) из-за конвейера процессора, кэшей и прерываний: [math]\sigma^2 > 0[/math].
    * В эмуляторе чтение регистра часто эмулируется детерминировано или с постоянной задержкой. Интервалы становятся слишком равномерными.
    * **Статистический анализ:**
    Система вычисляет стандартное отклонение ([math]\sigma[/math]) серии замеров:
    [math]\sigma = \sqrt{\frac{1}{N}\sum_{i=1}^{N} (\Delta t_i - \mu)^2}[/math]
    * **Вердикт:** Если [math]\sigma < \sigma_{min}[/math] (слишком идеально) или количество нулевых дельт велико, система считает среду виртуальной.
    ---
    ### 3. Формальное описание состояния дефекта
    Дефект считается произошедшим в момент времени [math]t_{detect}[/math], когда выполняется логическое условие:
    [math]Defect(t) = \begin{cases} 1, & \text{если } (T_{hw}(t_{end}) - T_{hw}(t_{start})) > C_{max} \\ 1, & \text{если } |T_{api}(t) - T_{shared}(t)| > D_{max} \\ 1, & \text{если } \sigma(\Delta t_{samples}) < J_{min} \\ 0, & \text{иначе (норма)} \end{cases}[/math]
    Где:
    * [math]C_{max}[/math] — порог тактов для пошаговой отладки.
    * [math]D_{max}[/math] — порог рассинхронизации часов.
    * [math]J_{min}[/math] — минимальный ожидаемый аппаратный шум.
    ### Резюме
    Дефект происходит формально потому, что **время выполнения кода является физической величиной**, которую невозможно подделать программно, не изменив саму физику работы процессора. Любая попытка вмешаться в выполнение (остановить, изменить, эмулировать) неизбежно добавляет задержку ([math]\Delta t[/math]), которая выходит за рамки математически вычисленного «коридора нормы».
     
    Последнее редактирование модератором: 14 мар 2026 в 13:34